gpt4 book ai didi

python - 如何遍历 PDF 页面中的所有对象并检查哪些是文本对象?

转载 作者:太空狗 更新时间:2023-10-30 01:09:30 24 4
gpt4 key购买 nike

我想使用 pypdf 遍历 pdf 页面中的所有对象。

我还想检查对象的类型是什么,是文本还是图形。

代码片段将是一个很大的帮助。

非常感谢

最佳答案

我认为 PyPDF 不是这项工作的正确工具。您需要的是解析页面本身(PyPDF 对其支持有限,请参阅 the API documentation ),然后在更改某些对象后能够将结果保存在另一个 PDF 对象中。

您可以使用 pdftk 解压 PDF ,这将允许您使用 pdfrw .

但是,从你写的内容来看,

My ultimate goal is to color each text object differently.



“文本对象”可能是一个非常复杂的对象,由(例如)不同段落中的不同行组成。这可能是,您可能将其视为 单个实体 .在这个实体中可能已经有几个不同的文本颜色命令。

例如,您可能有一个包含此文本序列的流(这是用“内部”语言编写的):
12.84 0 Td(S)Tj
0.08736 Tc
9 0 Td(e)Tj
0.06816 Tc
0.5 g
7.55999 0 Td(qu)Tj
0.08736 Tc
1 g
16.5599 0 Td(e)Tj
0.06816 Tc
7.55999 0 Td(n)Tj
0.08736 Tc
8.27996 0 Td(c)Tj
-0.03264 Tc
0.13632 Tw
7.55999 0 Td(e )Tj
0.06816 Tc
0 Tw

这可能会写成“ Se qu ence ”。它实际上由七个文本子对象组成,我知道没有任何库可以将流“解密”到其组件子对象中,更不用说为它们分配适当的属性(在 PDF 中从图形状态下降,而在任何层次结构中XML 等结构可能会与单个节点相关联,可能是通过继承)。

更多:流可能包含非文本命令(例如行)。然后更改“文本”描边颜色实际上也会更改非文本对象的颜色。

库应该为您提供类似于直接读取文本流所实现的详细访问级别;所以通过图书馆这样做似乎不太可能。

由于这是文字处理工作,您可能会研究将 PDF 转换为 OpenOffice(使用 PDF 导入 扩展名)的可能性,通过 OOo python 对其进行操作。 ,然后将其从 OpenOffice 本身导出回 PDF。

但是,请注意 there be dragons : 文档很粗略,界面有时不稳定。访问“文本”可能不切实际(更是如此,因为文本只能逐行提供给您)。

另一种可能性(同样,不适合胆小的人)是自己解码 PDF。首先通过 pdftk 以未压缩格式获取它.这将产生一个标题,后跟一个表单中的对象流
INDEX R obj
<<
COMMANDS OR DATA
>>
[ stream
STREAM OF TEXT
endstream ]
endobj

您可以读取流,并且对于每个对象:
  • 如果 COMMANDS OR DATA 只有 /Length长度,它可能是一个文本流。否则转到 3。
  • 解析对象(见下文)。如果长度有变化,记得更新 /Length适本地。
  • 注意当前输出文件的偏移量,将其保存在 XREF[i](“第 i 个对象的引用偏移量”)中,并将其保存到输出文件中。

  • 在对象的末尾,您会找到一个 XREF 对象,其中每个对象都用它所在的文件偏移量表示。这些偏移(10 位数字)必须根据您保存在 XREF 中的新偏移进行重写。此对象的开头应进入 PDF 文件末尾的 startxref。

    (要调试,首先编写一个例程,无需修改即可复制所有对象。它必须重新计算外部参照和偏移量,并且仍然生成与原始对象相同的 PDF 对象)。

    这样得到的PDF可以通过 pdftk重新压缩以节省空间。

    关于 PDF 文本对象解析,您基本上逐行检查以查找文本输出命令(请参阅 PDF Reference 5.3.2)。大多数情况下,您将看到的命令是 Tj :
    9.95999 0 Td(Hello, world)Tj

    和颜色改变命令(见#4.5.1;同样最常用的是 g 和 rg。)
    1 g             # Sets color to black (1 in colorspace Gray)
    1 0 0 rg # Sets color to red (1,0,0 in colorspace RGB)

    然后您将跟踪我们使用的任何颜色,例如可能包括每个 Tj几个 RG 之间的命令您选择的命令 - 设置文本颜色的命令,恢复原始颜色的命令。通过这种方式,您将确保图形状态不会“溢出”到任何附近的对象、线条等;它将增加对象 Length并使生成的 PDF 变慢一点(但不是很慢。您甚至可能不会注意到)。

    关于python - 如何遍历 PDF 页面中的所有对象并检查哪些是文本对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12986611/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com