首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅从带有CGPDFScanner的PDF文件中提取文本

仅从带有CGPDFScanner的PDF文件中提取文本
EN

Stack Overflow用户
提问于 2015-05-12 09:16:34
回答 1查看 843关注 0票数 4

有许多关于从PDF文件中提取简单文本的问题(一些问题得到了回答,另一些问题没有回答)。Stackoverflow有助于指出PDF文档在解析过程中非常清楚地检测对象:即在使用CGPDFScanner时应该使用'BT‘和'ET’PDF引用操作符来构造回调。

苹果文档显示了一个回调示例:

代码语言:javascript
复制
static void op_BT (CGPDFScannerRef s, void *info) {
    const char *name;
    if (!CGPDFScannerPopName(s, &name))
        return;
    printf("BT /%s\n", name);   
}

此外,在其他CGPDFScanner命令中,通过首先创建以下命令来设置上述回调:

代码语言:javascript
复制
myTable = CGPDFOperatorTableCreate();
CGPDFOperatorTableSetCallback (myTable, "BT", &op_BT);

到目前为止,一切都很好,但苹果文档似乎并没有帮助像我这样的低级到中级程序员理解下一步:除了识别文本块(大概是在BT和BE回调之间?),在回调期间/内部/外部需要哪些步骤/行来将标识的文本块捕获到NSString中?

非常感谢。

EN

回答 1

Stack Overflow用户

发布于 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文件中获得字节的含义,您需要知道如何使用字体来获得这个意义。

另外几点:

  • 不要假设BT和ET对应于实际的文本块或段落,因为您可能从应用程序(如InDesign或Word )中了解到这一点。一个文本块可能包含整个页面或单个字符(或不包含任何字符)。
  • 还有一些文本状态运算符,它们决定如何在页面上显示文本。例如,有一些方法可以绘制不可见文本;您可能希望或不希望提取该类型的文本。如果不支持,则需要支持足够的文本状态运算符,以区分不同之处。

(不是一项小任务:)

查看样例后进行更新

因为在注释中,对问题进行了改进,以指示特定类型PDF文件的文本提取,所以让我添加一些附加信息。

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

2)提取文本是可能的,如果您查看pdfToolbox的以下输出(警告,我非常重视这个工具):

代码语言:javascript
复制
<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时,当您到达该表时,挑战将是哪些文本属于哪个表格单元格,哪些行和列结束等等……

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30186577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档