我目前正在使用 tm 包中的 readPDF() 函数从几个 PDF 中抓取一些文本数据。这一切都很好,在大多数情况下,编码似乎是“latin1” - 然而,在某些情况下,它不是。R中是否有检查字符编码的好方法?我在 tau 包中找到了函数 is.utf8() 和 is.local() ,但这显然只能让我到目前为止。
谢谢。
我目前正在使用 tm 包中的 readPDF() 函数从几个 PDF 中抓取一些文本数据。这一切都很好,在大多数情况下,编码似乎是“latin1” - 然而,在某些情况下,它不是。R中是否有检查字符编码的好方法?我在 tau 包中找到了函数 is.utf8() 和 is.local() ,但这显然只能让我到目前为止。
谢谢。
我对 R 了解不多。但我现在对 CRAN 进行了一些研究,看看提到的tm和tau包是什么。
所以tm用于文本挖掘,而对于 PDF 阅读,它需要并依赖于pdftotext
Poppler 的实用程序。起初我有[明显错误]的印象,您提到的readPDF()函数正在对 PDF 文件中的 PDF 对象进行一些基于库的低级访问……我错了!结果它“只”查看pdftotext
命令行工具的文本输出。
现在这解释了为什么您可能无法成功阅读任何使用比“简单”Latin1 更复杂的字体编码的 PDF。
恐怕,您的问题的原因是目前 Popplerpdftotext
根本无法处理这些问题。
也许您最好向tm维护人员询问功能请求::-)
PDF 规范为拉丁文本定义了这些简单字体(每种字体最多可包含 256 个字符形状)的编码,这些编码应在任何符合标准的阅读器中预定义:
/StandardEncoding
/MacRomanEncoding
/PDFDocEncoding
/WinAnsiEncoding
/MacExpertEncoding
然后有 2 种特定的符号字体编码:
此外,字体可以具有内置编码,这可能会偏离其创建者想要的标准编码的任何方式(当嵌入标准字体被子集化时,fe 也用于差异编码)。
因此,为了正确解释 PDF 文件,您必须查找所使用字体的每种字体编码,并且还必须考虑到任何/Encoding
使用/Differences
数组的情况。
但是,对于简单的字体,总体任务仍然相当简单。PDF 查看器程序只需将“我看到的用于表示文本字符串的字节序列中的每一个”按1:1 映射到“我可以在编码表中查找的确切一个字形”。
对于复合,CID 键控字体(可能包含数千个字符形状),查看器程序的查找/映射“这是我看到的字节序列,我应该将其绘制为文本”到“这是要绘制的字形形状的序列”不再是 1:1。在这里,需要对一个或多个字节的序列进行解码,以从 CIDFont中选择每个字形。
为了帮助这个 CIDFont 解码,周围需要有CMap结构。CMap 定义了从 Unicode 编码到字符集合的映射。PDF 规范为中文、日文和韩文字体定义了至少 5 打 CMap 及其标准名称。这些预定义的 CMap 不需要嵌入到 PDF 中(但符合要求的 PDF 阅读器需要知道如何正确处理它们)。但是(当然)也有自定义 CMap,当创建 PDF 的应用程序写出 PDF 时,这些 CMap 可能已经“即时”生成。在这种情况下,需要将 CMap 嵌入 PDF 文件中。
官方 PDF-1.7 规范中规定了有关这些复杂性的所有细节。