【问题标题】:pdftools package failing to parse characterspdftools 包无法解析字符
【发布时间】:2020-03-01 14:45:02
【问题描述】:

我正在使用 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")

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

年份 |tokens

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

我已尝试删除第一页以防水印引起问题,但这并未成功。

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

【问题讨论】:

    标签: r pdf


    【解决方案1】:

    这是您在提取 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。

    【讨论】:

      【解决方案2】:

      另一个答案在问题诊断中是完全正确且非常清楚的(并提供了大量的背景信息)。我同意,光学字符识别 (OCR) 可能是最好的方法。

      在这种情况下也应该不是什么大问题,因为 PDF 确实包含高质量的文本图像(即使基础文本数据不可用)。

      pdftools 幸运的是已经包含了一个很好的功能来解决这个问题,它应该正确地检索到这个文档中的(大部分)文本:

      text <- pdftools::pdf_ocr_text("https://eeas.europa.eu/sites/eeas/files/st_10113_2007_init_en.pdf", pages = 1)
      #> Converting page 1 to st_10113_2007_init_en_1.png... done!
      text[1]
      #> [1] "COUNCIL OF Brussels, 31 May 2007\nTHE EUROPEAN UNION\n10113/07\nLIMITE\nPESC 655\nCOEST 179\nNOTE\nfrom: The Permanent Representatives Committee\ndated: 31 May 2007\nto: Council\nSubject : The EU and Central Asia: Strategy for a New Partnership\n1. |The Permanent Representatives Committee has endorsed at its meeting on 30 May 2007\nStrategy for a New Partnership with Central Asia as set out in Annex.\n2. The Council (General Affairs and External Relations) is invited to reach an agreement on the\ntext as set out in Annex with the view to its submission to the European Council.\n10113/07 AA/gso l\nDGE VI LIMITE EN\n"
      

      (设置pages = NULL获取整个文档。)

      【讨论】:

      • 我同意 OCR 是前进的方向(我赞成您的回答,以便清楚地演示如何轻松地做到这一点)。你说你不同意我说这是一个很难解决的问题,但我认为我的回答很清楚,它是逆向工程非常困难的 文本编码,而不是提取文本,所以通过展示如何进行 OCR,你根本不同意我所说的。
      • 你是对的。我刚刚重新阅读了您的答案(我已经为诊断和有趣的技术信息投了赞成票)并改变了我的答案。我认为我的基本上是对您建议的补充。
      • 谢谢 - 虽然我认为你的回答可能对 OP 更有帮助!
      猜你喜欢
      • 1970-01-01
      • 2020-05-01
      • 2013-08-31
      • 2020-11-21
      • 2019-04-20
      • 1970-01-01
      • 2013-11-26
      • 2019-01-15
      • 1970-01-01
      相关资源
      最近更新 更多