首页 > 解决方案 > 通过在 PDF 内容后附加一些内容,在现有 PDF 文档上添加文本

问题描述

我想通过在 PDF 文件的末尾(在 %%EOF 之后)附加一些内容来将文本“覆盖”到现有的 PDF 文档上。在 %%EOF 被修改之前什么都不要修改是非常重要的。

甚至有可能做到这一点吗?

对于给定的文本,我如何“生成”在 %%EOF 之后要附加的内容?技术并不重要,一旦我有了我的“blob”,我就会自己附加它。

非常感谢!

标签: pdf

解决方案


对于给定的文本,我如何“生成”在 %%EOF 之后要附加的内容?技术并不重要,一旦我有了我的“blob”,我就会自己附加它。

要附加的“blob”取决于要附加到的 PDF。本质上,您必须解析原始 PDF 并找到要覆盖的页面的页面对象。然后,您可以附加一个带有覆盖文本的新注释或内容流、一个带有对该新注释或内容流的引用的页面对象的副本,以及一个新的交叉引用部分。通常,您可以使用您首选的编程语言的 PDF 库来执行此操作。


在对您的问题的评论中,您要求运行示例代码并查看之前/之后并对其进行逆向工程。

在以下示例中,我使用 Java 和 iText 7 PDF 库(当前开发负责人,但任何 7.1.x 版本都应该这样做):

try (   PdfReader pdfReader = new PdfReader(SOURCE_PDF);
        PdfWriter pdfWriter = new PdfWriter(TARGET_PDF);
        PdfDocument pdfDocument = new PdfDocument(pdfReader, pdfWriter, new StampingProperties().useAppendMode());
        Document document = new Document(pdfDocument)
) {
    pdfWriter.setCompressionLevel(0);
    Paragraph paragraph = new Paragraph("Hello! This text is added for Fratt");
    paragraph
        .setWidth(100)
        .setBorder(new SolidBorder(new DeviceRgb(0f, 0f, 0.6f), 3))
        .setRotationAngle(Math.PI / 4);
    Rectangle box = pdfDocument.getFirstPage().getCropBox();
    document.showTextAligned(paragraph,
        (box.getLeft() + box.getRight()) / 2,
        (box.getTop() + box.getBottom()) / 2,
        1,
        TextAlignment.CENTER,
        VerticalAlignment.MIDDLE,
        0);
}

ShowTextAtPosition测试testAddCenteredBorderedParagraph

这会将以下旋转的框架文本添加到源文档的第一页:

截屏

在我的示例文档中,在原始文档之后添加了以下“blob” %%EOF

16 0 obj
<</CreationDate(D:20060808104513+02'00')/Creator(TeX)/ModDate(D:20201221183247+01'00')/PTEX.Fullbanner(This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4)/Producer(pdfeTeX-1.21a; modified using iText® 7.1.14-SNAPSHOT ©2000-2020 iText Group NV \(AGPL-version\))>>
endobj
19 0 obj
<</BaseFont/Helvetica/Encoding/WinAnsiEncoding/Subtype/Type1/Type/Font>>
endobj
1 0 obj
<</Font<</F1 19 0 R/F73 6 0 R/F8 9 0 R>>/ProcSet[/PDF /Text]>>
endobj
2 0 obj
<</Contents[18 0 R 3 0 R 17 0 R]/MediaBox[0 0 595.2756 841.8898]/Parent 10 0 R/Resources 1 0 R/Type/Page>>
endobj
17 0 obj
<</Length 568>>stream
Q
q
0.70711 0.70711 -0.70711 0.70711 358.89 -66.87 cm
q
0 0 0.6 rg
251.62 401.57 m
351.62 401.57 l
354.62 404.57 l
248.62 404.57 l
251.62 401.57 l
f
Q
q
0 0 0.6 rg
351.62 401.57 m
351.62 374.93 l
354.62 371.93 l
354.62 404.57 l
351.62 401.57 l
f
Q
q
0 0 0.6 rg
351.62 374.93 m
251.62 374.93 l
248.62 371.93 l
354.62 371.93 l
351.62 374.93 l
f
Q
q
0 0 0.6 rg
251.62 374.93 m
251.62 401.57 l
248.62 404.57 l
248.62 371.93 l
251.62 374.93 l
f
Q
q
BT
/F1 12 Tf
255.94 391.23 Td
(Hello! This text is)Tj
( )Tj
ET
Q
q
BT
/F1 12 Tf
262.27 377.91 Td
(added for Fratt)Tj
ET
Q
Q

endstream
endobj
18 0 obj
<</Length 2>>stream
q

endstream
endobj
xref
1 2
0000009898 00000 n 
0000009976 00000 n 
16 4
0000009500 00000 n 
0000010098 00000 n 
0000010715 00000 n 
0000009809 00000 n 
trailer
<</ID [<98bc0d0e9347d0a066ab140ebd9ce62c><fa0dda3a13b826a6ecbd129bb048a3d0>]/Info 16 0 R/Prev 9003/Root 15 0 R/Size 20>>
%iText-7.1.14-SNAPSHOT
startxref
10764
%%EOF

由于pdfWriter.setCompressionLevel(0)在代码中,内容流没有被压缩,您可以轻松阅读和理解它。


推荐阅读