pdf - 通过在 PDF 内容后附加一些内容,在现有 PDF 文档上添加文本
问题描述
我想通过在 PDF 文件的末尾(在 %%EOF 之后)附加一些内容来将文本“覆盖”到现有的 PDF 文档上。在 %%EOF 被修改之前什么都不要修改是非常重要的。
甚至有可能做到这一点吗?
对于给定的文本,我如何“生成”在 %%EOF 之后要附加的内容?技术并不重要,一旦我有了我的“blob”,我就会自己附加它。
非常感谢!
解决方案
对于给定的文本,我如何“生成”在 %%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)
在代码中,内容流没有被压缩,您可以轻松阅读和理解它。
推荐阅读
- reporting-services - SSRS 页脚计数器
- javascript - 函数名以'$'开头是什么意思?
- docker - `docker-compose build` 和 `docker build` 有什么区别?
- c# - 在索引上创建令牌过滤器时使用 Elasticsearch Nest 库会引发错误
- angular - ERROR 错误:无法设置未定义的属性“文本”
- google-sheets - 谷歌电子表格:同一列的 SUMIFS
- python-3.x - 在python中使用opencv进行图像处理
- java - 使用 KMS 的弹性 beanstalk 环境变量加密
- c# - 使用 XName 和命名空间时出现异常
- arrays - 如何在pascal中检查数组中的所有元素