iText - 将图像添加到现有 PDF

iText - add image to an existing PDF

我正在使用 iText 执行以下操作。

  1. 我有一个 PDF
  2. 我将图像添加到 PDF
  3. 我保存修改后的PDF。

要在 PDF 中添加图像,我正在使用此方法 itext-add。 在我得到某个 PDF 之前,这一切都很好。在此 PDF 中,adding-image-to-the-pdf 方法不起作用。此外,它会损坏 PDF。

注意事项: 我从第三方获取 PDF,这些是合同 PDF。所以有可能是他们加了一些限制。

还有一个有趣的事实,当我在要添加该图像的同一页面上添加注释时,该图像开始出现!

我正在使用 iText 7.1.10

    String srcFileName = "/Users/kalpit/Desktop/step1-stack.pdf";
    String destFileName = "step1-test1-kd2.pdf";

    File destFile = new File(destFileName);
    PdfDocument pdf = new PdfDocument(new PdfReader(srcFileName), new PdfWriter(destFile),new StampingProperties().useAppendMode());

    Document document = new Document(pdf);

    String imFile = "/Users/kalpit/Desktop/sample-image.png";
    ImageData data = ImageDataFactory.create(imFile);

    Image image = new Image(data);
    document.add(image);

    document.close();

这是 PDF:https://ipupload.com/tP6/step1.pdf

嗯,appendMode 有问题。你真的需要他吗?尝试通过下一个代码添加图像:

PdfDocument pdf = new PdfDocument(new PdfReader(srcFile), new PdfWriter(outFileName));
Document doc = new Document(pdf);
PdfImageXObject xObject = new PdfImageXObject(ImageDataFactory.createPng(UrlUtil.toURL(pathToYourimage.png)));
Image image = new Image(xObject, 100).setHorizontalAlignment(HorizontalAlignment.RIGHT);
doc.add(image);
doc.close();

结果是下一个

,只有在追加模式下才会出现此问题。原因是在不幸的情况下没有存储更改的资源,这是一个错误。

这里的不幸情况是第 1 页上的情况

  • 内容流数组本身已经是一个间接对象,所以在添加显示图像的指令时,只有这个间接对象(而不是页面对象)被标记为已更改;和
  • 资源和资源类型字典是直接对象,但只有它们(而不是页面对象,持有它们的间接对象)在添加图像资源时被标记为已更改。

因此,页面内容流的更改被存储,但页面对象没有。 所以现在有一条从不存在的图像页面资源中绘制图像的指令。

解决此问题的一种方法是不使用 @Nikita 提议的追加模式。

或者,如果您需要使用追加模式,您可以将您的页面明确标记为已更改:

Document document = new Document(pdf);

String imFile = "/Users/kalpit/Desktop/sample-image.png";
ImageData data = ImageDataFactory.create(imFile);

Image image = new Image(data);
document.add(image);

pdf.getFirstPage().setModified(); // <-----

document.close();