使用CGPDFScanner从PDF文件中提取文本



关于从PDF文件中提取简单文本的许多问题(有些没有回答,其他问题)。Stackoverflow在解析过程中很清楚地指出,PDF Adobe文档非常清楚:即,在使用CGPDFScanner时,应该使用" BT"one_answers" ET" PDF参考操作员来构建 callbacks

Apple文档显示回调示例:

static void op_BT (CGPDFScannerRef s, void *info) {
    const char *name;
    if (!CGPDFScannerPopName(s, &name))
        return;
    printf("BT /%sn", name);   
}

和,在其他CGPDFScanner命令中,上述呼叫背包是通过首先创建设置的:

myTable = CGPDFOperatorTableCreate();
CGPDFOperatorTableSetCallback (myTable, "BT", &op_BT);

到目前为止都不错,但是Apple文档似乎没有帮助像我这样的低到中间的程序员了解下一步:除了识别文本块(大概是在BT和BE BE BEABLACK之间),什么几个步骤/在回调期间/在/in/infore otalback中需要行以将已确定的文本块捕获到NSString中?

非常感谢。

您应该做的第一件事就是下载PDF参考。如今,这是ISO标准,但是您可以下载Acrobat SDK(http://www.adobe.com/devnet/acrobat.html),其中包含一个也可以为您服务的Adobe副本。

阅读第9章。它会教您一方面,您需要了解文本操作员(TJ,',",TJ),另一方面,您需要了解字体和编码。

文本操作员是可以拦截将"字符串"添加到PDF文档的运算符;虽然所有文本运算符必须出现在BT和ET块之间,但我认为拦截这些BT和ET块并没有为您做太多。

字体很重要,因为它们将定义这些操作员使用的字节与实际(Unicode)字符相对应。因此,如果要从PDF文件中得出字节的含义,则需要知道如何使用字体来得出该含义。

一些其他点:

  • 不要假设BT和ET对应于实际的文本块或段落,因为您可能会从Indesign或Word等应用程序中知道它。一个文本块可能包含整页或单个字符(或没有)。

  • 也有文本状态运算符来确定如何在页面上显示文本。例如,有一些方法可以绘制隐形文本;您可能希望提取这种类型的文本。如果不这样做,您需要支持足够的文本状态操作员,您可以说出差异。

不是一个小任务:)

更新示例PDF

因为在评论中,该问题被完善以指示特定类型的PDF文件的文本提取,所以我添加一些其他信息。

1)查看您引用的PDF文件,您将无法跳过字体/编码问题。示例PDF文件中的字体是子集的,这意味着您在PDF页面描述中没有" clearText",而是必须通过用于获取有意义文本的字体的编码来映射的索引。

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时,挑战将是哪个文本属于哪个表单元格,排和列结束等...

...

在某种程度上,这个问题比简单地检测文本行的问题要困难,因为您正在处理一个非常密集的表(在我的问题上很大程度上是一维的(在同一条线上收集所有内容)这个问题是二维。

相关内容

  • 没有找到相关文章

最新更新