Le filigrane avec PDFBox
Je suis en train d'ajouter un filigrane à un document PDF spécifiquement avec PDFBox. J'ai été en mesure d'obtenir l'image à afficher sur chaque page, mais il perd l'arrière-plan de la transparence, car il semble comme si PDJpeg convertit en un fichier JPG. Peut-être il y a un moyen de le faire à l'aide de PDXObjectImage.
Voici ce que j'ai écrit jusqu'à présent:
public static void watermarkPDF(PDDocument pdf) throws IOException
{
//Load watermark
BufferedImage buffered = ImageIO.read(new File("C:\\PDF_Test\\watermark.png"));
PDJpeg watermark = new PDJpeg(pdf, buffered);
//Loop through pages in PDF
List pages = pdf.getDocumentCatalog().getAllPages();
Iterator iter = pages.iterator();
while(iter.hasNext())
{
PDPage page = (PDPage)iter.next();
//Add watermark to individual page
PDPageContentStream stream = new PDPageContentStream(pdf, page, true, false);
stream.drawImage(watermark, 100, 0);
stream.close();
}
try
{
pdf.save("C:\\PDF_Test\\watermarktest.pdf");
}
catch (COSVisitorException e)
{
e.printStackTrace();
}
}
Problème avec l'-dessous de la réponse est que le positionnement ne fonctionne pas comme je m'attends (en haut à gauche justifiée) si les pages sont différentes dimensions. J'ai besoin d'ajouter un filigrane de texte en haut de chaque page dans un document PDF, et la solution ci-dessus est exactement ce dont j'avais besoin, donc, de supplantation cette solution.
OriginalL'auteur aosmith | 2012-01-19
Vous devez vous connecter pour publier un commentaire.
Mise à JOUR de RÉPONSE (Meilleure version avec un moyen facile de filigrane, grâce à l'commentateurs ci-dessous et @okok qui ont fourni des renseignements dans sa réponse)
Si vous utilisez PDFBox 1.8.10 ou au-dessus, vous pouvez ajouter un filigrane sur votre document PDF facilement avec un meilleur contrôle sur ce que les pages de besoins pour être en filigrane. En supposant que vous avez une page, un document PDF a l'image de filigrane, vous pouvez superposer des ce sur le document que vous souhaitez filigrane comme suit.
Exemple de Code à l'aide de 1.8.10
Échantillon à l'aide de PDFBox la Version 2.0.0 candidat
Si vous souhaitez utiliser le nouveau package org.apache.pdfbox.outils.OverlayPDF pour les superpositions vous pouvez le faire de cette façon. (Merci l'affiche ci-dessous)
VIEILLE RÉPONSE moyen Inefficace, n'est pas recommandée.
Bien, OP demandé comment faire dans PDFBox, la première réponse ressemble à un exemple d'utilisation de la bibliothèque iText. Création d'un filigrane dans PDFBox est vraiment simple. Le truc est, vous devriez avoir un vide document PDF avec le filigrane de l'image. Alors tout ce que vous avez à faire est de Superposer ces filigrane document sur le document que vous souhaitez ajouter le filigrane.
Attention: assurez-Vous de faire correspondre le nombre de pages dans le document..Sinon, vous vous retrouvez avec un document avec le nombre de pages correspondant à celui qui a le moins de nombre de pages. Vous pouvez manipuler le filigrane document et de dupliquer les pages correspondant à votre document.
Espère que cette aide.!
Après avoir joué avec ce peu plus, il semble bien fonctionner, mais dans des scénarios particuliers. Le filigrane ne semble pas bien fonctionner si elle n'est rien d'autre que du texte (n'a pas pu obtenir la transparence au travail). La superposition ne peut COSArray (dont je ne suis toujours pas sûr d'où il vient, peut-être liée à des signets ou texte).
Bonjour - Est-il une solution pour en filigrane des pages spécifiques sur le PDF et pas tous d'entre eux?
Ézéchiel, je ne suis pas sûr si il ya un moyen plus facile. Probablement lorsque vous créez filigrane document qui sera placée sur le document final, vous pouvez assurez-vous de faire correspondre les pages vides sur filigrane document pour les pages que vous ne voulez pas de filigrane. Pas essayé, juste une pensée.
Ne confondez pas les paquets
org.apache.pdfbox.util.Overlay
etorg.apache.pdfbox.Overlay
. La dernière est la bonne.OriginalL'auteur Droidman
Viens de faire ce bout de code à ajouter (transparent) des images (jpg, png, gif) pour une page pdf avec pdfbox:
Exemple:
Cela a fonctionné pour moi avec jdk 1.7 et bcmail-jdk16-140.jar, bcprov-jdk16-140.jar, commons-logging-1.1.3.jar, fontbox-1.8.3.jar, jempbox-1.8.3.jar et pdfbox-1.8.3.jar.
OriginalL'auteur Nick Russler
@Androidman : Plus de https://stackoverflow.com/a/9382212/7802973
Il semble que de nombreuses méthodes sont enlevés avec chaque version de PDFBox. De sorte que le code ne fonctionnera pas sur PDFBox 2.0.7.
Au lieu de cela, utiliser
void org.apache.pdfbox.pdmodel.PDDocument.save(String fileName)
, je pense:Edit:
Je suis à l'aide de
org.apache.pdfbox.tools.OverlayPDF
pour les superpositions maintenant et il fonctionne très bien. Le code ressemble à ceci:Que je n'avais pas assez de réputation pour ajouter un commentaire, j'ai pensé qu'il serait approprié d'ajouter un nouvel élément de réponse.
OriginalL'auteur christopher westburry
Il y a une autre Superposition de classe à l'intérieur util paquet, qui vous permet d'économiser de la création d'un pdf avec le même nombre de pages que le document source et ensuite de faire de la superposition.
Pour comprendre son utilisation, jetez un oeil à pdfbox code source, plus précisément le OverlayPDF classe.
OriginalL'auteur OKOK
Oeil à cette méthode, auquel ajouter une image en filigrane dans le fichier pdf de sources à l'aide de PDFBOX bibliothèque
Comment voulez-vous faire avec Rails?
OriginalL'auteur Nelson