首页 > 解决方案 > pdftools 包无法解析字符

问题描述

我正在使用 pdftools 来解析 pdf,并且遇到了无法准确解析的 pdf(它正在处理其他 PDF,所以我认为它与代码无关)。

可在此处找到 PDF:https ://eeas.europa.eu/sites/eeas/files/st_10113_2007_init_en.pdf

我的代码是:

EU_text_2007 <- pdf_text("2007_CA_Strategy.pdf") %>% 
  readr::read_lines() %>% 
  str_squish()

退货

[1] " (''&#!\n %$+!&,!-%&!0+%'2-3!(4(-)!7'2-'+ 9!+,2!- !'+-!=-2'%+24$(.!\n!\n!\n#/!#%'2,&@0'(,%)!%$+!&,!-% &!0+%'2-3!(4(-!\n!\n345678&!'):8!;8)!8!%456$7:4)3 & !678 :6: 5! @!( 7:5(:5(!-$7*B4!85 !'):8!6*

EU_text_2007_long <- paste(EU_text_2007, collapse = ' ')

EU_text_2007_long <- EU_text_2007_long %>% 
  as.data.frame() 

colnames(EU_text_2007_long) <- c('Text')

EU_text_2007_long <- EU_text_2007_long %>%
  mutate(Year = 2007) %>% 
  mutate(Text = as.character(Text))


EU_text_2007_tokens <- EU_text_2007_long %>% 
  unnest_tokens(tokens, Text, token = "words")

标记化后的数据如下所示:

年份 |代币

1 2007 0
1.1 2007 2
1.2 2007 3
1.3 2007 4
1.4 2007 7'2
1.5 2007 9
1.6 2007 2
1.7 2007 2
1.8 2007 24
1.9 2007 2

如果水印引起问题,我尝试删除第一页,但这并没有成功。

有人可以看看他们是否也无法解析此文档,或者对为什么会发生这种情况没有任何建议。谢谢!

标签: rpdf

解决方案


这是您在提取 pdf 文本时偶尔会遇到的问题。pdf 格式可以处理几种不同的字体类型,并且以不同的方式处理它们。对于您的文档,相关文本的字体是 type0 (PostScript) 字体,称为 CAL invisible TT。

通常,pdf 中的页面描述程序将以低值、非 ascii 字节输出字符串。然后在字体的编码字典中查找这些字形,并从嵌入在文件中的字体描述程序中提取适当的字形。您的字体没有编码字典 - 它被标记为 Identity-H。通常这意味着它将有一个 ToUnicode 条目,而您的确实如此 - 但它实际上是空的。

有时会发生,在您的情况下,字体描述程序中的字形未映射到其正确的 Ascii 值,而只是直接映射到那些低字节值(例如,A 字形可能映射到 0x01 而不是其通常的值0x41)。

在这个特定文档的情况下,这实际上是为了防止复制/粘贴而故意这样做的。

那么为什么文本在页面上看起来不错呢?

这是因为字体描述程序收到了打印字形 0x01 的消息,但它绘制的图片是字母 A。pdf 本身从不“知道”它正在打印的内容的 ascii 值。除了可能的 OCR 程序之外,任何其他程序也没有。

您可以通过尝试复制和粘贴文本来证明是这种情况。它不起作用,因为显示的字形没有准确的底层 ascii 表示。

如果没有一些严肃的逆向工程,你就不能从这个特定的文档中复制和粘贴,任何 pdf 文本提取工具也不能。我并不是说这是不可能的,但它不太可能是可以通过 Stack Overflow 解决的那种微不足道的问题。

最好的选择可能是 OCR。


推荐阅读