有许多关于从PDF文件中提取简单文本的问题(一些问题得到了回答,另一些问题没有回答)。Stackoverflow有助于指出PDF文档在解析过程中非常清楚地检测对象:即在使用CGPDFScanner时应该使用'BT‘和'ET’PDF引用操作符来构造回调。
苹果文档显示了一个回调示例:
static void op_BT (CGPDFScannerRef s, void *info) {
const char *name;
if (!CGPDFScannerPopName(s, &name))
return;
printf("BT /%s\n", name);
}此外,在其他CGPDFScanner命令中,通过首先创建以下命令来设置上述回调:
myTable = CGPDFOperatorTableCreate();
CGPDFOperatorTableSetCallback (myTable, "BT", &op_BT);到目前为止,一切都很好,但苹果文档似乎并没有帮助像我这样的低级到中级程序员理解下一步:除了识别文本块(大概是在BT和BE回调之间?),在回调期间/内部/外部需要哪些步骤/行来将标识的文本块捕获到NSString中?
非常感谢。
发布于 2015-05-12 10:24:27
首先要做的是下载PDF引用。这些天,这是一个ISO标准,但您可以下载Acrobat (http://www.adobe.com/devnet/acrobat.html),其中包含一个Adobe副本,也可以为您提供服务。
阅读第9章,它会告诉你,一方面你需要理解文本运算符(Tj,',",TJ),另一方面你需要理解字体和编码。
文本运算符是可以截取的操作符,可以在PDF文档中添加“字符串”;而所有文本运算符必须出现在BT和ET块之间,而拦截这些BT和ET块本身对您没有多大帮助。
字体很重要,因为它们将定义这些运算符使用的字节与实际(Unicode)字符的对应方式。因此,如果您想从PDF文件中获得字节的含义,您需要知道如何使用字体来获得这个意义。
另外几点:
(不是一项小任务:)
查看样例后进行更新
因为在注释中,对问题进行了改进,以指示特定类型PDF文件的文本提取,所以让我添加一些附加信息。
1)查看引用的PDF文件,您将无法跳过字体/编码问题。示例PDF文件中的字体是子设置的,这意味着PDF页面描述中没有“明文”,而是必须通过用于获取有意义文本的字体编码来映射索引。
2)提取文本是可能的,如果您查看pdfToolbox的以下输出(警告,我非常重视这个工具):
<page id="33">
<words>
<word txt="Senator">
<parts>
<part tlh="28.3481" tlv="868.534" trh="55.4455" trv="868.534" blh="28.3481" blv="859.902" brh="55.4455" brv="859.902"></part>
</parts>
</word>
<word txt="House,">
<parts>
<part tlh="57.5305" tlv="868.534" trh="82.123" trv="868.534" blh="57.5305" blv="859.902" brh="82.123" brv="859.902"></part>
</parts>
</word>
<word txt="85">
<parts>
<part tlh="84.208" tlv="868.534" trh="92.548" trv="868.534" blh="84.208" blv="859.902" brh="92.548" brv="859.902"></part>
</parts>
</word>毫无疑问,还有其他工具可以提供类似的(或更好的)结果,因此,单独提取文本应该是可行的。
最大的问题将是找到你感兴趣的文本,按照正确的顺序。我在这里使用的提取给出了每个“单词”的文本以及它在页面上的位置(边框)。当我浏览XML时,当您到达该表时,挑战将是哪些文本属于哪个表格单元格,哪些行和列结束等等……
在某种程度上,这个问题比简单地检测文本行的问题更困难,因为您正在处理一个非常密集的表(而我的问题主要是一维的(将所有内容都集中在同一条线上),这个问题是二维的。
https://stackoverflow.com/questions/30186577
复制相似问题