PdfBox 将多个图像添加到 pdf [英] PdfBox adding multiple images into pdf
问题描述
我尝试使用 pdfbox 2.0.8 将多个图像添加到 pdf 中,但目前只会添加一个.我有两个不同的图像,它们应该附加到两个不同的 acrofields 上,但只会添加我列表中的最后一个.
I try to add multiple images into a pdf with pdfbox 2.0.8, but currently only one will be added. I have two different images which should be attached to two different acrofields, but only the last one of my list will be added.
这是我的测试函数:
@Test
public void attachBulkImageToField(){
List<ImageData> data = new ArrayList<>();
data.add(new ImageData(signatureAusstellerField,signatureAussteller.toPath()));
data.add(new ImageData(signatureDienstleisterField, signatureDienstleister.toPath()));
ImageToFieldDrawer imgDrawer = new ImageToFieldDrawer(pdf);
assertTrue(imgDrawer.drawImageToField(data, Paths.get("d:\\imageBulk.pdf")));
}
public boolean drawImageToField(List<ImageData> data, final Path outPath) {
try {
for (ImageData element : data) {
addImageForField(element.getImagePath(), getAcroFieldWithName(element.getFieldName()));
}
savePdf(outPath);
return true;
} catch (IOException e) {
e.printStackTrace();
} catch (PDFSizeException e) {
e.printStackTrace();
}
return false;
}
private void savePdf(Path outPath) throws IOException {
pdDocument.save(outPath.toFile());
pdDocument.close();
}
private void addImageForField(Path signature, AcroField targetField) throws IOException {
PDPage page = pdDocument.getPage(targetField.getPageNr() - 1);
DrawImage image = new DrawImage(Files.readAllBytes(signature), 0, 0);
PDImageXObject pdImage = PDImageXObject.createFromFile(signature.toAbsolutePath().toString(), pdDocument);
try(PDPageContentStream contentStream = new PDPageContentStream(pdDocument, page)){
contentStream.drawImage(pdImage, targetField.getX(), targetField.getY(), targetField.getWidth(), targetField.getHeight());
}
}
public class ImageData {
private String fieldName;
private Path imagePath;
public ImageData(String fieldName, Path imagePath) {
this.fieldName = fieldName;
this.imagePath = imagePath;
}
public String getFieldName() {
return fieldName;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
public Path getImagePath() {
return imagePath;
}
public void setImagePath(Path imagePath) {
this.imagePath = imagePath;
}
}
推荐答案
您使用
PDPageContentStream contentStream = new PDPageContentStream(pdDocument, page)
这个构造函数被记录为
/**
* Create a new PDPage content stream. This constructor overwrites all existing content streams
* of this page.
*
* @param document The document the page is part of.
* @param sourcePage The page to write the contents to.
* @throws IOException If there is an error writing to the page contents.
*/
public PDPageContentStream(PDDocument document, PDPage sourcePage) throws IOException
因此,使用此构造函数,您覆盖该页面的所有现有内容流!特别是您覆盖了之前添加的任何绘制另一个图像的说明...
So using this constructor you overwrite all existing content streams of that page! In particular you overwrite any previously added instructions for drawing another image...
您应该使用不同的构造函数,例如
You should use a different constructor, e.g.
/**
* Create a new PDPage content stream. If the appendContent parameter is set to
* {@link AppendMode#APPEND}, you may want to use
* {@link #PDPageContentStream(PDDocument, PDPage, PDPageContentStream.AppendMode, boolean, boolean)}
* instead, with the fifth parameter set to true.
*
* @param document The document the page is part of.
* @param sourcePage The page to write the contents to.
* @param appendContent Indicates whether content will be overwritten, appended or prepended.
* @param compress Tell if the content stream should compress the page contents.
* @throws IOException If there is an error writing to the page contents.
*/
public PDPageContentStream(PDDocument document, PDPage sourcePage, AppendMode appendContent,
boolean compress) throws IOException
使用 AppendMode.APPEND
或 AppendMode.PREPEND
取决于新内容应该绘制在先前绘制的内容之上还是之下.
using AppendMode.APPEND
or AppendMode.PREPEND
depending on whether the new content should be drawn over or under previously drawn content.
这篇关于PdfBox 将多个图像添加到 pdf的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!