Wie "flathe" ich ein PDF-Formular (entferne das Formularfeld, behalte aber den Text des Feldes) mit PDFBox?
Die gleiche Frage wurde hier beantwortet:
Ein schneller Weg, dies zu tun, ist, die Felder aus dem ACROFrom zu entfernen.
Dafür brauchen Sie nur den Dokumentenkatalog, dann das Acroform und entferne dann alle Felder von diesem Acroform.
Die grafische Darstellung ist mit der Anmerkung verknüpft und bleibt erhalten das Dokument.
Also habe ich diesen Code geschrieben:
%Vor%Mit PDFBox 2 ist es jetzt möglich, ein PDF-Formular mit dieser neuen API-Methode einfach zu "glätten": PDAcroForm.flatten () .
Vereinfachter Code mit einem Beispielaufruf dieser Methode:
%Vor%Hinweis: dynamische XFA-Formulare können nicht reduziert werden.
Für die Migration von PDFBox 1. * zu 2.0, sehen Sie sich die offizielle Migration an Anleitung .
Das funktioniert ganz sicher - ich bin auf dieses Problem gestoßen, habe die ganze Nacht lang debugged, aber schließlich herausgefunden, wie man das macht :)
Dies ist unter der Annahme, dass Sie in der Lage sind, das PDF in irgendeiner Weise zu bearbeiten / etwas Kontrolle über das PDF zu haben.
Bearbeiten Sie zuerst die Formulare mit Acrobat Pro. Machen Sie sie verborgen und schreibgeschützt.
Dann müssen Sie zwei Bibliotheken verwenden: PDFBox und PDFClown.
PDFBox entfernt das, was Adobe Reader mitteilt, dass es sich um ein Formular handelt. PDFClown entfernt das eigentliche Feld. PDFClown muss zuerst gemacht werden, dann PDFBox (in dieser Reihenfolge. Umgekehrt funktioniert das nicht).
Einzelfeld-Beispielcode:
%Vor%Wahrscheinlich ein paar Tippfehler hier und da, aber das sollte genug sein, um den Kern zu bekommen :)
Nach dem Lesen des PDF-Referenzhandbuchs habe ich festgestellt, dass Sie den schreibgeschützten Modus für AcroForm-Felder ganz einfach festlegen können, indem Sie den "Ff" -Schlüssel (Feldflags) mit dem Wert 1 hinzufügen. Darum geht es in der Dokumentation:
Wenn gesetzt, darf der Benutzer den Wert des Feldes nicht ändern. Alle zugehörigen Widget-Annotationen werden nicht interagieren mit dem Benutzer; das heißt, sie werden nicht auf Maus reagieren klickt oder ändert ihr Aussehen als Antwort auf Mausbewegungen. Dieses Flag ist nützlich für Felder, deren Werte werden berechnet oder aus einer Datenbank importiert.
so könnte der Code so aussehen (mit pdfbox lib):
%Vor%Lösung zum Abflachen von Acroform UND Beibehalten der Formularfeldwerte mit pdfBox:
Die Lösung, die mir mit pdfbox 2.0.1 geholfen hat:
%Vor%Ich musste die zwei zusätzlichen Schritte in dem obigen Lösungslink nicht machen:
%Vor%Ich habe mein PDF-Formular in OpenOffice 4.1.1 erstellt und nach pdf exportiert. Die zwei im OpenOffice-Exportdialog ausgewählten Elemente waren:
Mit PdfBox habe ich die Formularfelder gefüllt und eine flachere PDF-Datei erstellt, die die Formularfelder entfernt, aber die Formularfeldwerte beibehalten hat.
Um ein Acrobat-Formularfeld wirklich zu "glätten", scheint es viel mehr zu geben als auf den ersten Blick. Nach der Prüfung des PDF-Standards konnte ich in drei Schritten eine echte Abschwächung erreichen:
Alle drei Schritte können mit pdfbox gemacht werden (ich benutzte 1.8.5). Im Folgenden werde ich skizzieren, wie ich es gemacht habe. Ein sehr hilfreiches Werkzeug, um zu verstehen, was los ist, ist der PDF Debugger .
Dies ist der komplizierteste Schritt der drei.
Um den Wert des Feldes zu speichern, müssen Sie seinen Inhalt für jedes der Widgets des Feldes im Inhalt der PDF speichern. Am einfachsten ist es, das Aussehen jedes Widgets auf die Seite des Widgets zu zeichnen.
%Vor%Die Darstellung ist ein XObject-Stream, der den gesamten Inhalt des Widgets (Wert, Schriftart, Größe, Drehung usw.) enthält. Sie müssen es nur an der richtigen Stelle auf der Seite platzieren, die Sie aus dem Rechteck des Widgets extrahieren können.
Wie oben erwähnt, kann jedes Feld mehrere Widgets haben. Ein Widget kümmert sich darum, wie ein Formularfeld bearbeitet werden kann, Trigger, Anzeige, wenn es nicht bearbeitet wird und solche Sachen.
Um einen zu entfernen, müssen Sie ihn aus den Anmerkungen seiner Seite entfernen.
%Vor%Beachten Sie, dass die Anmerkungen möglicherweise nicht das genaue PDAnnotationWidget enthalten, da es sich um eine Art Wrapper handelt. Sie müssen den mit passendem COSObject entfernen.
Als letzten Schritt entfernen Sie das Formularfeld selbst. Dies unterscheidet sich nicht sehr von den anderen obigen Posts.
%Vor%Beachten Sie, dass ich hier eine benutzerdefinierte removeAll-Methode verwendet habe, da removeCandidates.removeAll () nicht wie erwartet für mich funktioniert hat.
Entschuldigung, dass ich hier nicht den ganzen Code bereitstellen kann, aber mit dem oben genannten sollten Sie in der Lage sein, es selbst zu schreiben.
Ich habe nicht genug Punkte, um etwas zu kommentieren, aber SJohnsons Antwort, das Feld auf Lesen zu setzen, funktionierte perfekt für mich. Ich verwende so etwas mit PDFBox:
%Vor%Dies wird Ihren Feldwert schreiben und dann, wenn Sie das PDF nach dem Speichern öffnen, wird es Ihren Wert haben und nicht editierbar sein.