PDFBox: Wie man ein PDF-Formular "flattert"?

7

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%     
Lukas 22.01.2013, 08:32
quelle

9 Antworten

10

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 .

    
Sylvain Bugat 14.06.2016 18:24
quelle
7

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 :)

    
bfjules 01.11.2013 08:52
quelle
6

setReadOnly hat für mich funktioniert, wie unten gezeigt -

%Vor%     
SJohnson 18.07.2013 15:11
quelle
3

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%     
Przemek Grzesiowski 23.01.2015 17:37
quelle
3

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:

  1. ausgewählt "PDF-Formular erstellen"
  2. Format von "PDF" einreichen - Ich fand, dass dies eine kleinere PDF-Dateigröße ergab als die Auswahl von "FDF", aber immer noch als PDF-Formular betrieben wurde.

Mit PdfBox habe ich die Formularfelder gefüllt und eine flachere PDF-Datei erstellt, die die Formularfelder entfernt, aber die Formularfeldwerte beibehalten hat.

    
David Miller 15.05.2016 19:04
quelle
2

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:

  1. Feldwert speichern
  2. Widgets entfernen
  3. Entfernen Sie das Formularfeld

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 .

Speichern Sie das Feld

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.

Widgets entfernen

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.

Entfernen Sie das Formularfeld

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.

    
Oliver 08.07.2014 13:27
quelle
1

Dies ist der Code, den ich mir ausgedacht habe, nachdem ich alle Antworten zusammengestellt hatte, die ich zu dem Thema finden konnte. Dies behandelt das Reduzieren von Textfeldern, Combos, Listen, Kontrollkästchen und Funkgeräten:

%Vor%

Volle Klasse hier: Ссылка

    
jribble 06.06.2014 21:57
quelle
0

Das ist die Antwort von Thomas aus der PDFBox-Mailingliste:

Sie müssen die Felder über das COSDictionary holen. Versuche dies Code ...

%Vor%     
Lukas 25.01.2013 07:13
quelle
0

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.

    
Merric Huffstutler 27.08.2015 17:58
quelle

Tags und Links