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

Sha*_*han 5 python pypdf

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

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

代码段将提供很大的帮助。

非常感谢

LSe*_*rni 5

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

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

但是,根据您的写作,

我的最终目标是为每个文本对象着色不同的颜色。

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

例如,您可能只有一个具有以下文本序列的流(这是用“内部”语言编写的):

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
Run Code Online (Sandbox Code Playgroud)

这可能会写“ ENCE ”。它实际上由七个文本子对象组成,据我所知,没有一个可将流“解密”为其子对象的库,更不用说为它们分配适当的属性了(在PDF中,它属于图形状态,而在任何层次结构中XML之类的结构可能会通过继承与单个节点相关联。

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

一个库应该为您提供类似于通过直接读取文本流实现的详细信息访问级别;因此通过库执行此操作似乎不太可能。

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

但是要当心,因为这里有龙:文档是粗略的,并且界面有时是不稳定的。访问“文本”可能不切实际(更重要的是,因为文本只能逐行提供给您)。

另一个可能性(再次,不是出于胆小)是自己解码PDF。首先通过获取未压缩格式的文件pdftk。这将产生一个标头,然后是形式的对象流

INDEX R obj
<<
COMMANDS OR DATA
>>
[ stream 
STREAM OF TEXT
endstream ]
endobj
Run Code Online (Sandbox Code Playgroud)

您可以读取流,并针对每个对象:

  1. 如果COMMANDS OR DATA仅是/Length length,则可能是文本流。否则转到3。
  2. 解析对象(请参见下文)。如果长度发生变化,请记住进行/Length适当的更新。
  3. 注意当前输出文件的偏移量,将其保存在XREF [i](“第i个对象的参考偏移量”)中,然后将其保存到输出文件中。

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

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

如此获得的PDF可以重新压缩pdftk以节省空间。

关于PDF文本对象解析,您基本上逐行检查它以查找文本输出命令(请参见PDF参考 5.3.2)。通常,您将看到的命令将是Tj

9.95999 0 Td(Hello, world)Tj
Run Code Online (Sandbox Code Playgroud)

和颜色更改命令(请参阅#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)
Run Code Online (Sandbox Code Playgroud)

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