繁体   English   中英

PdfBox将多个图像添加到pdf

[英]PdfBox adding multiple images into pdf

我尝试使用pdfbox 2.0.8将多个图像添加到pdf中,但是目前仅会添加一个。 我有两个不同的图像,应该附加到两个不同的acrofield,但是只会添加列表的最后一个。

这是我的测试功能:

@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

因此,使用此构造函数,您将覆盖该页面的所有现有内容流 特别是,您覆盖了先前添加的用于绘制其他图像的说明。

您应该使用其他构造函数,例如

/**
 * 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.APPENDAppendMode.PREPEND具体取决于应在新内容之上还是之下绘制新内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM