如何使用 PDFBox 从 xRef Stream 读取翻译矩阵

How to read Translation Matrix from xRef Stream using PDFBox

提问人:TheMulittle 提问时间:10/28/2023 最后编辑:John KugelmanTheMulittle 更新时间:10/28/2023 访问量:39

问:

我有一个 PDF,我想从中读取特定文本注释的翻译矩阵。使用 iText RUPS 我可以看到 /AP 键有一个指向 xRef 流的 /N 条目

查看 xRef 表,我可以看到流包含我正在寻找的转换矩阵

问题是我没有找到一种通过 PDFBox 3.0.0 以编程方式访问此信息的方法(我也尝试了 iText)。我得到的最接近的是使用以下代码摘录:

URL file = Main.class.getClassLoader().getResource("document.pdf");
PDDocument document = Loader.loadPDF(new File(file.toURI()));
System.out.println(document.getDocument().getObjectFromPool(new COSObjectKey(28, 0)).getObject())

这段代码打印了表示对象的字符串,最后我可以看到 COSStream{363946310},但找不到访问此内容的方法

COSDictionary{COSName{Length}:COSInt{189};COSName{BBox}:COSArray{COSFloat{153.0};COSFloat{198.0};COSFloat{459.0};COSFloat{594.0};};COSName{Resources}:COSDictionary{COSName{ExtGState}:COSDictionary{COSName{TRP11}:COSDictionary{COSName{CA}:COSFloat{0.300003};COSName{Type}:COSName{ExtGState};COSName{ca}:1050253822;};};COSName{Font}:COSDictionary{COSName{C2_0}:COSObject{COSNull{}};};COSName{ProcSet}:COSArray{COSName{PDF};COSName{Text};};};COSName{Subtype}:COSName{Form};}**COSStream{363946310}**

我也尝试了以下代码:

URL file = Main.class.getClassLoader().getResource("document.pdf");
PDDocument document = Loader.loadPDF(new File(file.toURI()));
 document.getPage(0).getAnnotations().get(0).getAppearance().getNormalAppearance().getAppearanceStream().getMatrix()

但是这段代码返回的翻译矩阵与我在 RUPS 中看到的翻译矩阵不同:

[1.0,0.0,0.0,1.0,0.0,0.0]

这是在 PDFBox Debugger 中分析的相同文件

Java PDF 格式 itext PDF

评论

1赞 Tilman Hausherr 10/28/2023
请分享您的文件,并尝试使用 PDFBox PDFDebugger 查看它。
0赞 TheMulittle 10/28/2023
@TilmanHausherr感谢您的回复!我编辑了帖子,添加了通过 PDFBox PDFDebugger 分析的相同文件,至于文件,我需要在上传之前剥离一些内容
1赞 Tilman Hausherr 10/29/2023
哎呀,当我写评论时,我没有看到矩阵在那里(在我的移动设备上被切断;我现在坐在我的桌面前)。因此,这是在注释的外观流的顶部内容流中。可以有多个,也可以没有,它不是一个属性。您可以使用来解析这些内容。PDFStreamParser
0赞 TheMulittle 10/29/2023
非常感谢@TilmanHausherr!PDFStreamParser 缺失的部分。此外,通过您的回复,我能够搜索到此类的用途,并找到了帮助我了解如何 java2s.com/example/java-src/pkg/airviewer/ 使用它的方法......

答: 暂无答案