PdfReader reader = new PdfReader("template.pdf");
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("output.pdf"));
PdfContentByte content = stamper.getOverContent(1); // first page == 1
Image image = Image.createInstance("someImage.png");
image.setAbsolutePosition(x, y);
image.setAbsoluteHeight(hei);
image.setAbsoluteWidth(wid);
content.addImage(image);
// instead of absolutely positioning the image, you can do:
//content.addImage(image, wid, 0f, 0f, hei, x, y);
// that's a transformation matrix, you can skew, rotate, scale, etc.
stamper.close();
Si vous ne connaissez pas l'emplacement exact, vous avez plusieurs options.
1) Remplacer une image existante.
Avec cette option, vous pouvez réellement faire dépasser un peu le modèle, utiliser l'alpha blending, etc. Fais envie. Vous pourriez faire la même chose avec le code ci-dessus si vous avez utilisé stamper.getUnderContent(1)
et construit votre modèle avec un fond transparent. Je viens de répondre à un replace an image question qui devrait aider sur ce front.
La nouvelle image héritera de tout l'état graphique de l'image d'espace réservé. x, y, wid, hei, groupes de contenu optionnels, transparence, toutes sortes de choses.
2) Ajoutez une annotation (les champs sont faciles d'accès) au modèle dans Acrobat (ou avec iText je suppose) et utilisez RECT pour fournir x, y, wid, hei pour le code ci-dessus.
// given the above stamper
AcroFields fields = stamper.getAcroFields();
PdfDictionary replaceAnnot = fields.getFieldItem("ReplaceMe").getMerged(0);
//we can remove the field from the PDF without breaking the info in replaceAnnot.
fields.removeField("ReplaceMe");
// rects are laid out [llx, lly, urx, ury]
PdfArray rect = replaceAnnot.getAsArray(PdfName.RECT);
float x = rect.getAsNumber(0).floatValue();
float y = rect.getAsNumber(1).floatValue();
float width = rect.getAsNumber(2).floatValue() - x;
float height = rect.getAsNumber(3).floatValue() - y;
Envoyez ces coordonnées au code image ci-dessus et vous êtes prêt à partir.