3 Stimmen

Verwendung einer Bild-URL für link_callback in der pisa html to pdf-Bibliothek

Verwandt mit: django - pisa : Bilder zur PDF-Ausgabe hinzufügen

Ich habe eine Website, die die Google Chart API verwendet, um eine Reihe von Berichten für den Benutzer anzuzeigen, und ich versuche, eine PDF-Version zu implementieren. Ich verwende die link_callback Parameter in pisa.pisaDocument die für lokale Medien (css/Bilder) gut funktioniert, aber ich frage mich, ob es mit Remote-Bildern (mit einer Google-Charts-URL) funktionieren würde.

Desde el Dokumentation Auf der Pisa-Website wird zwar angedeutet, dass dies möglich ist, aber es wird nicht gezeigt, wie:

Normalerweise erwartet pisa, dass sich diese Dateien auf dem lokalen Laufwerk befinden. Sie können auch relativ zum Originaldokument referenziert werden. Aber der Programmierer möchte vielleicht Laden aus verschiedenen Quellen wie dem Internet über HTTP-Anfragen oder aus einer Datenbank oder sonstigem.

Dies ist in einem Django-Projekt, aber das ist ziemlich irrelevant. Hier ist, was ich für das Rendern verwenden:

html = render_to_string('reporting/pdf.html', keys,
                        context_instance=RequestContext(request))
result = StringIO.StringIO()
pdf = pisa.pisaDocument(
        StringIO.StringIO(html.encode('ascii', 'xmlcharrefreplace')),
        result, link_callback=link_callback)
return HttpResponse(result.getvalue(), mimetype='application/pdf')

Ich habe versucht, dass der link_callback ein urllib-Anforderungsobjekt zurückgibt, aber es scheint nicht zu funktionieren:

def link_callback(uri, rel):
    if uri.find('chxt') != -1:
        url = "%s?%s" % (settings.GOOGLE_CHART_URL, uri)
        return urllib2.urlopen(url)
    return os.path.join(settings.MEDIA_ROOT, uri.replace(settings.MEDIA_URL, ""))

Die erzeugte PDF-Datei ist perfekt, nur die Bilder von Google Charts sind nicht vorhanden.

6voto

Dan Breen Punkte 11912

Nun, das war viel einfacher als ich erwartet hatte. In Ihrem link_callback Methode, wenn die uri ein entferntes Bild ist, einfach diesen Wert zurück.

def link_callback(uri, rel):
    if uri.find('chart.apis.google.com') != -1:
        return uri
    return os.path.join(settings.MEDIA_ROOT, uri.replace(settings.MEDIA_URL, ""))

Der Browser ist nicht so wählerisch, was die Bild-URL angeht, also stellen Sie sicher, dass die URL für pisa richtig zitiert wird. Ich hatte Leerzeichen in meiner URL, weshalb sie zunächst nicht funktionierte (das Ersetzen durch ein "+" hat das Problem behoben).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X