2017-06-22 2 views
0

Das hat mich von gestern gepisst, und ich bin nur aus Ideen.Kann nicht vollständigen HTML in die PDF schreiben

Ich versuche, eine PDF-Datei mit einer Unterklasse pdfkit.PDFKit (nennen wir es MyPDFKit) zu schreiben: es funktioniert gut (ich subclassed es nur die Möglichkeit, hinzufügen von xvfb-run in den args verwenden). Ich gebe an, dass kein Problem der Klasse ist.

Ich habe versucht, einige HTML in PDF zu konvertieren. Die Vorlage sieht wie folgt aus:

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8"> 
    <!-- Simplified for reading. --> 
    <style type="text/css">..</style> 
    </head> 
    <body> 
    <!-- Simplified for reading. --> 
    {% for obj in objs %} 
    <div> 
     <div> 
     <p>{{ obj.name }}</p> 
     </div> 
     <p>{{ obj.age }}</p> 
    </div> 
    {% endfor %} 
    </body> 
</html> 

Mit diesen Vorlage und objs in der Nähe von 400 Fällen, wobei der Ausgang des HTML ist in der Nähe von 5k Linien.

Das Problem kommt, wenn Sie versuchen, das in die Datei zu übertragen. Es könnte in einem dieser beiden Orte sein:

  1. MyPDFKit.to_pdf(..) (genannt von MyPDFKit.from_string(..)) 's stdout eine Grenze Größe hat, und ein Teil der Zeichenfolge abschneidet (Quellcode der Funktion ist here).
  2. f.write(..) ist derjenige, der die Zeichenfolge im Pass abschneidet.

Kann ein Problem der Vorlage oder die Objekte Daten nicht, weil ich PDFs korrekt erstellen kann, wenn nur eine bestimmte Auswahl an dann bekommen (mehr als 350 Elemente im selben Rendering führen zu dem Problem aufgrund der HTML-Zeilenanzahl). Zum Beispiel funktioniert objs[:315] gut, aber objs[:350] nicht.

Ich habe versucht, die Puffergröße auf -1, die unbegrenzt ist, aber auch nicht funktionieren. Hat jemand dieses Problem schon einmal gehabt?

Antwort

0

Ok, also endlich, mit der Hilfe eines anderen Programmierers, fand ich das Problem.

Es sieht aus wie PDFKit, wenn eine große Menge von HTML verarbeitet wird (in Anzahl der PDF-Seiten sprechen wir mehr als 349 mehr oder weniger), sendet Fortschrittsbalken Kommentare in den Puffer, um zu sehen, wie es geht. Wenn es fertig ist, sendet es auch eine fertiggestellte Kommentarnachricht.

Diese Kommentare (ich sage Kommentare zu geben sie eine Art von Daten, weil ich nicht wirklich weiß, wie PDF-Dateien Kommentare behandeln), in Programmen wie Adobe Reader, kann nicht behandelt werden, so dass es entdeckt, dass die Datei beschädigt ist/Schaden, während in Programmen wie SumatraPDF/Edge es einfach dann ignoriert und das PDF schön darstellt.

Jetzt, wie man dieses Verhalten verhindert? Übergabe des --quiet Arguments. Aber dafür müssen Sie PDFKit (wie ich es mit MyPDFKit gemacht habe) von der Unterklasse entfernen und die args manuell hinzufügen (line of code).

Problem gelöst.

EDIT

Es scheint, dass ich --quiet in dem options kwargs passieren kann, so dass keine Notwendigkeit von Subclassing wenn das nur das Problem (obwohl es schön wäre, es ist standardmäßig aktiv zu haben ...)