PDFBox: Comment faire pour “aplatir” une PDF-forme?
Comment faire pour "aplatir" une PDF-formulaire (supprimer le champ de formulaire, mais de garder le texte du champ) avec PDFBox?
Même question a été répondu ici:
un moyen rapide de le faire, c'est de supprimer les champs de la acrofrom.
Pour cela, vous avez juste besoin d'obtenir, le catalogue du document, puis le acroform
et puis supprimez tous les champs de ce acroform.La représentation graphique est lié avec l'annotation et de rester dans
le document.
J'ai donc écrit ce code:
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
import org.apache.pdfbox.pdmodel.interactive.form.PDField;
public class PdfBoxTest {
public void test() throws Exception {
PDDocument pdDoc = PDDocument.load(new File("E:\\Form-Test.pdf"));
PDDocumentCatalog pdCatalog = pdDoc.getDocumentCatalog();
PDAcroForm acroForm = pdCatalog.getAcroForm();
if (acroForm == null) {
System.out.println("No form-field --> stop");
return;
}
@SuppressWarnings("unchecked")
List<PDField> fields = acroForm.getFields();
//set the text in the form-field <-- does work
for (PDField field : fields) {
if (field.getFullyQualifiedName().equals("formfield1")) {
field.setValue("Test-String");
}
}
//remove form-field but keep text ???
//acroForm.getFields().clear(); <-- does not work
//acroForm.setFields(null); <-- does not work
//acroForm.setFields(new ArrayList()); <-- does not work
//???
pdDoc.save("E:\\Form-Test-Result.pdf");
pdDoc.close();
}
}
quel a été le résultat du code?
le résultat est un fichier PDF avec "Test-String" dans le champ de formulaire. Mais le champ de formulaire est toujours là et modifiable.
voir blogs.adobe.com/jlockman/2011/10/08/...
Merci, mais je dois le faire automatiquement et je recherche une solution avec PDFBox. Mais je vais lire l'article attentivement, peut-être il ya quelque chose d'utile.
si je poste c'est une réponse wil vous upvote et à l'accepter?
le résultat est un fichier PDF avec "Test-String" dans le champ de formulaire. Mais le champ de formulaire est toujours là et modifiable.
voir blogs.adobe.com/jlockman/2011/10/08/...
Merci, mais je dois le faire automatiquement et je recherche une solution avec PDFBox. Mais je vais lire l'article attentivement, peut-être il ya quelque chose d'utile.
si je poste c'est une réponse wil vous upvote et à l'accepter?
OriginalL'auteur Lukas | 2013-01-22
Vous devez vous connecter pour publier un commentaire.
Avec PDFBox 2 il est maintenant possible de "aplatir" un document PDF-formulaire facilement à l'appel de la
flatten
méthode sur unPDAcroForm
objet. Voir La Javadoc: PDAcroForm.aplatir().Simplifié de code avec un appel d'exemple de cette méthode:
Remarque: dynamique de formulaires XFA ne peut pas être aplatir.
Pour la migration de PDFBox 1.* à 2.0, jetez un oeil à l'officiel du guide de migration.
Fonctionne comme un charme.
OriginalL'auteur Sylvain Bugat
Cela fonctionne pour vous - j'ai rencontré ce problème, débogué toute la nuit, mais enfin compris comment faire 🙂
Ce est en supposant que vous avez une capacité à modifier le fichier PDF en quelque sorte/d'avoir un certain contrôle sur le PDF.
Tout d'abord, modifier les formes à l'aide d'Acrobat Pro. Rendre caché et en lecture seule.
Alors vous devez utiliser les deux bibliothèques: PDFBox et PDFClown.
PDFBox supprime la chose qui raconte Adobe Reader que c'est une forme; PDFClown supprime le champ réel. PDFClown doit être fait en premier, puis PDFBox (dans cet ordre. L'inverse ne fonctionne pas).
Champ unique exemple de code:
Probablement quelques fautes ici et là, mais cela devrait être suffisant pour prendre connaissance de l'essentiel 🙂
Merci beaucoup pour l'exemple de code. Il a travaillé pour moi!
Je suis heureux de vous annoncer que PDF Clown prend nativement en charge la forme d'aplatissement depuis la version 0.2.0 (et 0.1.2.1). Plus d'infos ici: PDF Clown 0.2.0 — Amélioré la gestion de contenu
OriginalL'auteur bfjules
setReadOnly a fonctionné pour moi comme illustré ci-dessous -
OriginalL'auteur SJohnson
Après une lecture de pdf, guide de référence, j'ai découvert que vous pouvez très facilement régler le mode de lecture seule pour AcroForm champs en ajoutant "Ff" (Champ flags) avec la valeur 1.
C'est ce que la documentation se dresse à ce sujet:
de sorte que le code pourrait ressembler à ça (à l'aide de pdfbox lib):
OriginalL'auteur Przemek Grzesiowski
Solution à l'aplatissement acroform ET de retenir les valeurs de champ de formulaire à l'aide de pdfBox:
La solution qui a fonctionné pour moi avec pdfbox 2.0.1:
Je n'ai pas besoin de faire les 2 étapes supplémentaires dans la solution ci-dessus lien:
J'ai créé mon formulaire pdf dans OpenOffice 4.1.1, et a exporté au format pdf. Les 2 éléments sélectionnés dans le OpenOffice de dialogue d'exportation ont été:
À l'aide de PdfBox j'ai renseigné les champs de formulaire et créé un pdf aplati fichier supprimé les champs du formulaire, mais conservé les valeurs de champ de formulaire.
OriginalL'auteur David Miller
Afin de vraiment "aplatir" un acrobate champ de formulaire, il semble y avoir beaucoup plus qu'au premier coup d'œil.
Après examen de la La norme PDF j'ai réussi à atteindre le vrai aplatissement en trois étapes:
Toutes les trois étapes peut être fait avec pdfbox (j'ai utilisé 1.8.5). Ci-dessous, je vais esquisser la façon dont je l'ai fait.
Un outil très utile pour comprendre ce qui se passe est le PDF Débogueur.
Enregistrer le champ
C'est l'étape la plus compliquée de la trois.
Pour enregistrer la valeur du champ que vous avez à enregistrer son contenu dans le fichier pdf du contenu pour chaque du champ de widgets. Façon la plus simple de le faire est de tirer chaque widget de l'apparence du widget de la page.
L'apparence est un XObject flux contenant tous le widget du contenu (la valeur, la police, la taille, la rotation, etc.). Il vous suffit de le placer à la bonne position sur la page sur laquelle vous pouvez extraire à partir du widget du rectangle.
Supprimer les widgets
Comme noté au-dessus de chaque champ peut avoir plusieurs widgets. Un widget prend soin de la façon dont un champ de formulaire peut être modifié, les déclencheurs, l'affichage lorsqu'il n'est pas d'édition et de telles choses.
Afin de supprimer un, vous devez les supprimer de sa page d'annotations.
Noter que les annotations ne peuvent pas contenir exactement les mêmes PDAnnotationWidget puisque c'est une sorte de wrapper. Vous devez supprimer l'un avec l'appariement COSObject.
Supprimer un champ de formulaire
Comme étape finale, vous retirez le champ de formulaire lui-même. Ce n'est pas très différente de celle des autres postes ci-dessus.
Notez que j'ai utilisé une coutume removeAll méthode ici depuis le removeCandidates.removeAll() ne fonctionne pas comme prévu pour moi.
Désolé de ne pas fournir tout le code ici, mais avec le ci-dessus, vous devriez être en mesure de l'écrire vous-même.
OriginalL'auteur Oliver
C'est le code que j'ai est venu avec après faire la synthèse de toutes les réponses que j'ai pu trouver sur le sujet. Cela gère l'aplatissement des zones de texte, des combos, des listes, cases à cocher et les radios de:
Classe complète ici:
https://gist.github.com/jribble/beddf7620536939f88db
J'ai utilisé ce code et pour une raison quelconque, mes cases gris en couleur. Aucune idée de pourquoi?
J'ai mis à jour le code pour fixer le fond gris de tirage sur les cases à cocher. La première byteArray dans le
tmpfield instanceof PDChoiceButton
en était responsable.OriginalL'auteur jribble
C'est la réponse de Thomas, de la PDFBox-Mailinglist:
Vous aurez besoin pour obtenir les Champs au cours de la COSDictionary. Essayez ceci
code...
Cela ne fonctionne pas car l'annotation widgets peuvent vivre de façon indépendante à partir d'un champ de formulaire. Lorsque vous supprimez les champs, ne pas supprimer les widgets, qui restent là, même si elles n'appartiennent à aucun champ de formulaire. Pour être efficace, vous devez supprimer les widgets " annotations à partir de chaque page; pour être efficace, vous devez supprimer le widget des objets du document (qui signifie enlever les parties qui ne sont pas référencées plus).
OriginalL'auteur Lukas
Je n'ai pas assez de points de commenter, mais SJohnson réponse de réglage du champ en lecture seule a fonctionné parfaitement pour moi. Je suis en utilisant quelque chose comme ça avec PDFBox:
Cela permettra d'écrire votre valeur de champ et puis quand vous ouvrez le fichier PDF après l'enregistrement, il sera votre valeur et de ne pas être modifiable.
OriginalL'auteur Merric Huffstutler
J'ai pensé partager notre approche qui a travaillé avec PDFBox 2+.
Nous avons utilisé le
PDAcroForm.flatten()
méthode.Les champs requis certains de prétraitement et, surtout, le champ imbriqué structure a dû être traversés et DV et V de vérifier la valeur.
Enfin ce qui a fonctionné a été le suivant:
OriginalL'auteur Matyas