PDF-Vorlagen

BildHabrahabr, liebe Kollegen!



Das Problem, Daten in ein PDF-Dokument einzudrucken, ist nicht neu. Ich bin nicht der Erste und nicht der Letzte, der darauf stößt. Deshalb habe ich beschlossen, meine Erfahrungen mit dem Lösen zu teilen und Ihnen gleichzeitig ein kleines Web vorzustellen Anwendung zu diesem Thema.



1. Das PDF-Format ist gut, da es nicht bearbeitet werden kann. In jedem Fall ist es unwahrscheinlich, dass ein normaler Benutzer an der Bearbeitung eines PDF-Dokuments beteiligt ist. Dies bedeutet, dass das PDF-Format für den Austausch von rechtlich bedeutsamen Dokumenten gut geeignet ist.



2. Das PDF-Format ist schlecht, da es nicht bearbeitet werden kann. Das automatische Ausfüllen eines Datensatzes eines PDF-Dokumentformulars im automatischen Modus ist schwierig, und im manuellen Modus müssen kostenpflichtige, umfangreiche Anwendungen installiert werden.



Als Programmierer mache ich mir vor allem Sorgen um den 2. Punkt. Wie drucke ich den erforderlichen Datensatz in einer PDF-Anwendung in ein PDF-Dokument?



Ein weiteres Googeln zu diesem Thema brachte keine Ergebnisse.

Ich schaffte es nur , dass alles mit der Eingabe ist schlecht zu Google ( Warum ist es so schwierig , Text aus PDF zu extrahieren? , PDF aus der Sicht eines Programmierers ) und es gibt eine Option , zuerst die docx - Datei Vorlage, das ist nicht schwer zu erledigen ( Dokumente in Microsoft Word füllen ... ) und dann in der Konsole libreoffice (librewrite) docx-Datei in PDF konvertieren. All dies kann automatisch über die Anwendung erfolgen.



Aber zuerst bedeutet eine solche Entscheidung, dass das Projekt stark von libreoffice abhängig sein wird.



Und zweitens sieht das Dokument beim Konvertieren von docx in PDF in libreoffice ein wenig anders aus als in Word und / oder PDF, das in Word aus einer docx-Datei generiert wurde.



Lassen Sie uns abschließend auf das Wesentliche der betrachteten Lösung eingehen. Natürlich ist "Templating" in diesem Fall ein lautes Wort, aber die vorgeschlagene Lösung ist durchaus geeignet und nützlich.



In Python (und PHP) gibt es mehrere Bibliotheken (nicht schwer zu googeln), mit denen Sie Zeichenfolgen und Bilder in PDF-Dateien drucken können. Wir verwenden pdfrw + reportlab.Canvas. Das heißt, im Prinzip gibt es kein Problem beim Eingeben der Daten. Das Problem bei diesen Bibliotheken besteht darin, dass Sie für jedes Feld die genauen Koordinaten im Dokument festlegen müssen, was bedeutet, dass



1.Wir brauchen eine einheitliche Funktionalität, die die Koordinaten der Felder nicht im Quellcode, sondern in einer separaten Datei speichert. Ich werde sofort klarstellen, dass ich aus Erfahrung empfehle, diese Koordinaten in Dateien und unter Versionskontrolle zu speichern, d. H. Festschreiben von Koordinaten zusammen mit den entsprechenden PDF-Formularen und -Methoden, die einen bestimmten Satz von Dokumenten generieren. Und legen Sie diese Koordinaten nicht in die Datenbank, weil Dies macht es schwierig, bei Bedarf auf frühere Versionen (Koordinaten) von Dokumenten zurückzusetzen. Hier scheint alles klar zu sein.



2. Diese Koordinaten müssen irgendwie berechnet werden, und dies ist eine traurige Aufgabe, wenn Sie es manuell tun.



Die Hauptidee dabei ist, bewegliche div-Elemente im Browser zu erstellen, ihre Position mit der Maus an die gewünschte Stelle im Dokument anzupassen und die Koordinaten der im Browser erhaltenen Elemente in einer Datei im Backend zu speichern. Tatsächlich sind diese beiden Punkte in der Anwendung implementiert .



Art der Anwendung



Es sieht aus wie eine kleine Webanwendung mit einem Front-End und einem Back-End, d. H. Es wird möglicherweise nicht funktionieren, es als Python-Paket auszugeben.



1. Laden Sie die Quellen von der Gita herunter.



2. Installieren Sie Abhängigkeiten.



3. Lesen Sie README.md (installieren und konfigurieren Sie nginx für statische Dateien.)



4. Erstellen Sie im Dokumentordner einen Unterordner mit dem Namen des Dokuments, das generiert werden soll, und darin Dieser Unterordner erstellt zwei Dateien und (falls erforderlich) ein Verzeichnis mit Bildern:



- form.pdf # Dokumentformular, in das Sie Daten

drucken müssen - fields.json # Parameter von Feldern, die gedruckt werden müssen

- images # ist optional, eine Reihe von Bildern, die eingegeben werden müssen. Ich

empfehle, dass Sie auch die ursprüngliche docx-Datei (falls vorhanden) speichern, die nicht an der Erstellung des Dokuments beteiligt ist, aber bei Bedarf hilfreich ist

Nehmen Sie Änderungen vor und generieren Sie das PDF-Dokument neu. Formular.docx # ist nicht erforderlich, kein Name.



Die Datei fields.json hat beispielsweise die folgende Struktur:



{
    "0": [
        [32.25, 710.25, "fio", "DejaVuSans", 12, 420],
        [425.25, 681.75, "gender", "DejaVuSans", 12, 18],
        [206.25, 681.75, "birth_date", "DejaVuSans", 12, 173],
        [462.75, 681.53, "foto.jpg", "DejaVuSans", 12, 92],
        [146.25, 665.25, "birth_place", "DejaVuSans", 12, 418],
        [228.0, 634.5, "registration", "DejaVuSans", 12, 340]
    ],
    "1": [
        [132.0, 720.76, "1_work", "DejaVuSans", 10, 260],
        [132.0, 697.51, "2_work", "DejaVuSans", 10, 260],
        [132.0, 673.51, "3_work", "DejaVuSans", 10, 141]
    ]
}

      
      





Durch Hinzufügen / Entfernen von Zeilen zu dieser Datei werden Felder hinzugefügt / entfernt, die im Formular gedruckt werden.



5. Öffnen Sie die Seite zum Festlegen von Feldern (http://127.0.0.1/tpdf/positioning?pdf_name=ZayavlenieNaZagranpasport&page_num=1).



6. Passen Sie die Position von an die Felder mit der Maus im Browser und speichern Sie diese Position



7. Die Maus ist nicht immer in der Lage, die gewünschte Position der Felder genau einzustellen. Um die Position der Felder anzupassen, können Sie die Datei fieldd.json öffnen und die korrigieren Koordinaten manuell. Die Daten in der Datei sind nach der Y-Koordinate geordnet und jedes Feld wird in einer eigenen Zeile in der Datei gespeichert. Jene. Die Datei mit den Koordinaten der Felder ist übersichtlich formatiert, sodass Sie die erforderlichen Anpassungen manuell und einfach vornehmen können.



acht.Wir erstellen eine andere Methode zum Drucken dieser Art von Dokument (wenn Sie die Anfangsdaten irgendwie vorbereiten und / oder nicht von vorne, sondern vom Backend übernehmen müssen).



9. Wenn alles in Ordnung ist, übergeben Sie die resultierenden Dataset-Felder.json und -Dateien (nur nicht an meinen Git, sondern an Ihren lokalen Git. Wenn das Dokument jedoch für eine andere Person nützlich sein kann, können Sie eine öffentliche Dokumentenbank sammeln , das ist eine Idee).



Die resultierende Datei mit Koordinaten kann in einem anderen Projekt, in einer anderen Programmiersprache, z. B. PHP, verwendet werden, da die Koordinaten in der Datei in Maßeinheiten (Punkten) geschrieben sind, die in PDF-Dateien verwendet werden.



Wenn Sie ein Python-Projekt haben, kann der Quellcode dieser Anwendung einfach in das Projekt eingebettet werden und mithilfe der Haupt-Tpdf-Klasse PDF an einer beliebigen Stelle im Code generieren.



Oft ist es notwendig, nicht nur ein Dokument aus mehreren Seiten zu generieren, sondern mehrere Dokumente zu einer PDF-Datei zusammenzufügen, von denen jedes in der richtigen Reihenfolge und einige mehr als einmal gedruckt werden muss. Die Hauptklasse dieser Anwendung verfügt über eine spezielle Methode für diese Anforderungen, die eine Reihe von Dokumenten generiert (siehe Verarbeitungsmethode / tpdf / example /).



Daten müssen beim Instanziieren an die Hauptklasse übergeben werden. Die Hauptklasse kann um Eigenschaften (@property) erweitert werden, die anhand der Eingabedaten berechnet und unter Eigenschaftsname = Feldname in die PDF-Datei eingefügt werden. In diesem Beispiel wird das Feld fio angezeigt und die Daten werden nachname, vorname, zweiter vorname übertragen. Sie



können diese kleine Anwendung als unabhängigen Dienst bereitstellen, und alle anderen Anwendungen in der Umgebung greifen über das Netzwerk auf das erforderliche Dokument zu , aber dann entstehen Kosten für die Übertragung über das Netzwerk, Dateien PDFs sind nicht zu "leicht", die Dokumentenerstellung selbst ist schnell.



Anstelle von Hunderten von Wörtern ist es manchmal besser, eine Videoanweisung anzusehen (ich habe keinen Ton aufgenommen).





Implementierungserfahrung (Rechen).



  1. PyPDF2, 28 3 , - . , , , , , , , - . , — . , pdfrw , , . .. 28 0.3 . : , , , .
  2. ajax, , .
  3. PDF. , , 3/4, PDF. , , .


(TODO)



  1. .



    , / / / () fields.json
  2. , , .
  3. , PDF-.
  4. Eine generische Methode, die ein Dataset als Eingabe verwendet und eine Sammlung von Dokumenten zurückgibt.



All Articles