【问题标题】:R/Python: Converting PDF's To TablesR/Python:将 PDF 转换为表格
【发布时间】:2022-12-09 08:12:52
【问题描述】:

我有一个 PDF 图像文件(例如“p1.pdf”——这是原始文档的扫描副本)保存在我的电脑上——这个文件看起来像这样(我添加了红线以显示区别):

我想将此 PDF 导入 R,并将其转换为“表格对象”。我试图通过关注这个tutorial(+ https://cran.r-project.org/web/packages/tesseract/vignettes/intro.html)来做到这一点:

library(tesseract)
library(magick)
library(png)
library(pdftools)
library(tidyverse)

pngfile <- pdftools::pdf_convert('p1.pdf', dpi = 600)
text <- tesseract::ocr(pngfile)
cat(text)

raw_img <- image_read(pngfile)

raw_img %>% 
    image_ocr()

这似乎奏效了——我继续按照教程进行操作:

num_only <- tesseract::tesseract(
  options = list(tessedit_char_whitelist = c(".0123456789 "))
  )

raw_img %>% 
  image_quantize(colorspace = 'gray') %>% 
  image_threshold() %>% 
  image_crop(geometry_area(100, 0, 600, 40)) %>% 
  ocr(engine = num_only) 

combo <- tesseract::tesseract(
    options = list(
      tessedit_char_whitelist = paste0(
        c(letters, LETTERS, " ", ".0123456789 (-)"), collapse = "")
      ))

raw_text <- raw_img %>%
  image_quantize(colorspace = "gray") %>%
  image_transparent("white", fuzz = 22) %>%
  image_background("white") %>%
  image_threshold() %>%
  image_crop(geometry_area(0, 0, 110, 45)) %>%  
  ocr(engine = combo)

现在,我正在尝试将其转换为表格(“tibble”):

raw_tibble <- raw_text %>% 
  str_split(pattern = "\n") %>% 
  unlist() %>%
  tibble(data = .) 

# A tibble: 68 x 1
   data                                        
   <chr>                                       
 1 "- ALPHABETICAL LISTING ABT"                
 2 "a PlaceYear of Reg"                        
 3 "Name Address Graduation Year"              
 4 ""                                          
 5 "- (John Smith) BC ABC Uni~
 6 ""                                          
 7 "Email: jsmith@gmail.com P"999-999-~
 8 "BCC University 2002"                     
 9 "- Jane Smith HGH Univer~
10 "Email janes@gmail.com "    
# ... with 58 more rows

问题出在此处 - 有关进一步整理教程中结果的说明似乎非常针对教程中的示例(即与足球相关)。因此,我不能将它们应用于我的问题。 有人可以告诉我如何获取我的结果并将它们转换成看起来更接近原始 PDF 的表格吗?

也许有人可以尝试将我上传的图片另存为 png 文件,看看他们是否可以让这段代码工作?

谢谢!

注一:

  • 因此,我只对“名称”和“地址”列感兴趣
  • 我也对表格的最终格式有很大的灵活性持开放态度。例如“401 Fake St Some City, Some State A1C B23 P: 555-555-5555 501 Fake St Some City, Some State A1C B23 p:666-666-6666 601 Fake St Some City, Some State A1C B23 p:666-666-6666”都可以显示为单行
  • 这意味着在最终表中,2 组红线之间的所有“条目”都可以用 3 列和 1 行表示

因此,决赛桌可能看起来像这样:

  id                                 Name                                                                                                                                                                     Address
1  1  (John Smith) Email:jsmith@gmail.com                                                                                                                                                           AB p:999-999-9999
2  2     Jane Smith Email:janes@gmail.com                                                                                                                                                              p:111-111-1111
3  3                          Henry Smith                                                                                                                    201 Fake St,Some City, Some State A1C B23 P:111-222-3333
4  4                          Jason Smith                                                                                                                     301 Fake St Some City,Some State A1C B23 P:555-555-5555
5  5         Luke Smith lsmith2@gmail.com 401 Fake St Some City, Some State A1C B23 P: 555-555-5555 501 Fake St Some City, Some State A1C B23 p:666-666-6666 601 Fake St Some City, Some State A1C B23 p:666-666-6666
                                         Place_Year_Graduation Reg_Year
1 ABC University 2001, BCC University 2002,DEF University 2003     2000
2                  HGH University/2001, Some Other School 2002     2000
3                                               University ABC     1999
4                                                   Univer 123     2005
5                                                  ABC College     2010

final = structure(list(id = 1:5, Name = c(" (John Smith) Email:jsmith@gmail.com", 
"Jane Smith Email:janes@gmail.com", "Henry Smith", "Jason Smith", 
"Luke Smith lsmith2@gmail.com"), Address = c("AB p:999-999-9999", 
"p:111-111-1111", "201 Fake St,Some City, Some State A1C B23 P:111-222-3333", 
"301 Fake St Some City,Some State A1C B23 P:555-555-5555", "401 Fake St Some City, Some State A1C B23 P: 555-555-5555 501 Fake St Some City, Some State A1C B23 p:666-666-6666 601 Fake St Some City, Some State A1C B23 p:666-666-6666"
), Place_Year_Graduation = c("ABC University 2001, BCC University 2002,DEF University 2003", 
"HGH University/2001, Some Other School 2002", "University ABC", 
"Univer 123", "ABC College"), Reg_Year = c(2000, 2000, 1999, 
2005, 2010)), class = "data.frame", row.names = c(NA, -5L))

笔记2:我知道这是一个难题,R 可能不是解决这个问题的最佳工具——因此,我也愿意使用 Python 来解决这个问题。

【问题讨论】:

  • 作为起点,如果您尝试text &lt;- pdftools::pdf_text('p1.pdf'),值得检查您得到的结果 - 许多 PDF 以表格格式存储文本,因此您可以跳过 OCR 步骤以获得更高的准确度读取。
  • @Paul:谢谢你的回答!当我尝试你的代码时,这就是我得到的:
  • 对于单个文件,可以通过屏幕剪切和粘贴来避免为每个文件编写代码所花费的时间,因此对于名称Name (John Smith) Email : jsmith@gmail.com Jane Smith Email: janes@gmail.com Henry Smith Jason Smith Luke Smith Ismith2@gmail.com,但是与所有 OCR 一样,存在错误,因此最后一个应该是lsmith,但因为它不在字典 I smith 对 OCR 更有意义每个 OCR 页面都需要人眼,因此最容易看到剪切和粘贴。
  • 我玩过一出戏,但被难住了 - 综合挑战(多行单元格,无单元格边界)似乎使这变得非常棘手。我看到帖子建议 daiR 可以让它工作,但我不能在我工作的地方使用该服务。您可以创建一个列边缘向量和一个行开始向量,并在每个单独的“单元格”上运行 OCR,但这对于大型表格来说似乎非常手动。 magicK 包可能会包含一些可以以编程方式检测列/行边缘的东西,但我还不够熟悉,无法弄清楚。对不起!
  • @PaulStaffordAllen OCR 并不严格按行工作,除非以非常基本的术语指示它扫描一个像素然后扫描另一个像素直到它有一行然后向前和向下下一个像素行然后击中一条全白的线&假设它有一行一个时间字符匹配然后如果有空格假设它已经扫描了一个单词以在语言词典中查找如果字符是数字忘记任何数字安全的想法,不要依赖 OCR 发票/患者或其他日期数据关键条目。我离题了 在线转换为 PDF 通常很好transfer.sh/s5jgOU/a.pdf

标签: python r ocr tesseract data-manipulation


【解决方案1】:

虽然不是 R 特定的,但在这种情况下,我会尝试通过 pdf 服务 (API) 从 shell 命令行尽可能地运行 tesseract,它应该重新生成和维护 pdf 文本布局。就我个人而言,我一次只运行几个文件,因为每个文件都需要进行一些编辑。

在这种情况下,它的次要 Ismith2@gmail.com 应该是 lsmith2@gmail.com 但永远不要相信“数字”,当数字加起来不等于利润时,或者使用错误的医疗剂量时,它可能会很昂贵。

一旦你有了文本布局,它就像一个可搜索的 pdf 一样处理,所以在这种情况下它

xpdf-tools-win-4.03in64>pdftotext -layout -table a.pdf&type a.txt
                                          ALPHABETICAL                      LISTING                                        ABT

                                                                                     Place/Year                  of        Reg

      Name                              Addresss                                     Graduation                            Year

(John   Smith)                      AB                                               ABC   University    2001

                                                                                     BCC   University    2002              2000

Email:      jsmith@gmail.com            P:999-999-9999

                                                                                     DEF   University    2003

Jane    Smith                                                                        HGH   University/2001

                                    P:  111-111-111                                                                        2000

Email:      janes@gmail.com                                                          Some    Other       School      2002

                              201 FakeSt

Henry         Smith           Some        City,      Some  State  A1C  B23           University     ABC                    1999

                              P:111-2223333

                              301   Fake       St

Jason   Smith                 Some      City,      Some    State  A1C  B23           Univer         123                    2005

                              P:555-555-5555

                              401   Fake         St                                  ABC College                           2010

Luke   Smith                  Some      City,        Some  State  A1C  B23

Ismith2@gmail.com             P:   666-666-6666

                              501   Fake         St

                              Some      City,        Some  State  A1C  B23

                              P:666-666-6666

                              601   Fake       5St

                              Some      City,        Some  State  A1C  B23

                              P:   666-666-6666

和文本导入到电子表格或您喜欢的其他方式应该重新解析为单元格,这需要最少的表格改装。

【讨论】:

  • @KJ:谢谢你的回答!如果您有时间,能否请您提供更多有关如何“通过 pdf 服务 (API) 从 shell 命令行尽可能最好地运行 tesseract”的信息?我对“shell 命令”的一切都是一个完全的菜鸟,他们有点吓到我......非常感谢!
  • 我已经很长时间没有使用 r 了,所以其他人可以更好地描述它,但是您需要查看任务量我只是使用了拖放上传下载网页,但是说 100 人甚至可能考虑支付密码费用-基于 API 或 google 的接口,我通常不会这样做。
  • 有经济学如果它需要 2 小时来 web drop 120 个文件或 3 小时来抓取一个程序一起 web drop 获胜。
【解决方案2】:

这是否需要在 R 或 Python 中完成? Tabula https://tabula.technology/ 是专门为处理这个问题而编写的,它做得很好,尤其是在像你这样的基本表上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 2019-11-03
    相关资源
    最近更新 更多