r - 如何使用 R 从 pdf 中提取粗体和非粗体文本

标签 r pdf text extract

我正在使用 R 来提取文本。下面的代码可以很好地从 pdf 中提取非粗体文本,但它会忽略粗体部分。有没有办法同时提取粗体非粗体文本?

 news <-'http://www.frbe-kbsb.be/sites/manager/ICN/14-15/ind01.pdf'
 library(pdftools)
 library(tesseract)
 library(tiff)
 info <- pdf_info(news)
 numberOfPageInPdf <- as.numeric(info[2])
 numberOfPageInPdf
 for (i in 1:numberOfPageInPdf){
      bitmap <- pdf_render_page(news, page=i, dpi = 300, numeric = TRUE)
      file_name <- paste0("page", i, ".tiff") 
      file_tiff <- tiff::writeTIFF(bitmap, file_name)
      out <- ocr(file_name)
      file_txt <- paste0("text", i, ".txt") 
      writeLines(out, file_txt)
    }

最佳答案

为此,我喜欢使用 tabulizer 库。这是一个小例子:

devtools::install_github("ropensci/tabulizer")
library(tabulizer)

news <-'http://www.frbe-kbsb.be/sites/manager/ICN/14-15/ind01.pdf'

# note that you need to specify UTF-8 as the encoding, otherwise your special characters
# won't come in correctly

page1 <- extract_tables(news, guess=TRUE, page = 1, encoding='UTF-8')

page1[[1]]

      [,1] [,2]                    [,3]       [,4]                [,5]    [,6]                [,7]      
 [1,] ""   "Division: 1"           ""         ""                  ""      ""                  "Série: A"
 [2,] ""   "514"                   ""         "Fontaine 1 KBSK 1" ""      ""                  "303"     
 [3,] "1"  "62529 WIRIG ANTHONY"   ""         "2501 1⁄2-1⁄2"      "51560" "CZEBE ATTILLA"     "2439"    
 [4,] "2"  "62359 BRUNNER NICOLAS" ""         "2443 0-1"          "51861" "PICEU TOM"         "2401"    
 [5,] "3"  "75655 CEKRO EKREM"     ""         "2393 0-1"          "10391" "GEIRNAERT STEVEN"  "2400"    
 [6,] "4"  "50211 MARECHAL ANDY"   ""         "2355 0-1"          "35181" "LEENHOUTS KOEN"    "2388"    
 [7,] "5"  "73059 CLAESEN PIETER"  ""         "2327 1⁄2-1⁄2"      "25615" "DECOSTER FREDERIC" "2373"    
 [8,] "6"  "63614 HOURIEZ CLEMENT" ""         "2304 1⁄2-1⁄2"      "44954" "MAENHOUT THIBAUT"  "2372"    
 [9,] "7"  "60369 CAPONE NICOLA"   ""         "2283 1⁄2-1⁄2"      "10430" "VERLINDE TIEME"    "2271"    
[10,] "8"  "70653 LE QUANG KIM"    ""         "2282 0-1"          "44636" "GRYSON WOUTER"     "2269"    
[11,] ""   ""                      "< 2361 >" "12 - 20"           ""      "< 2364 >"          ""      

如果您只关心某些表,也可以使用 locate_areas 函数指定特定区域。请注意,要使 locate_areas 起作用,我必须先将文件下载到本地;使用 URL 返回错误。

您会注意到,每个表在返回的列表中都是它自己的元素。

这是一个使用自定义区域仅选择每个页面上的第一个表格的示例:

customArea <- extract_tables(news, guess=FALSE, page = 1, area=list(c(84,27,232,569), encoding = 'UTF-8')

这也是比使用 OCR(光学字符识别)库 tesseract 更直接的方法,因为您不依赖 OCR 库将像素排列转换回文本。在数字 PDF 中,每个文本元素都有一个 x 和 y 位置,tabulizer 库使用该信息来检测表格试探法并提取合理格式化的数据。您会发现您还有一些清理工作要做,但它非常易于管理。

编辑:只是为了好玩,这里有一个使用 data.table

开始清理的小例子
library(data.table)

cleanUp <- setDT(as.data.frame(page1[[1]]))

cleanUp[ ,  `:=` (Division = as.numeric(gsub("^.*(\\d+{1,2}).*", "\\1", grep('Division', cleanUp$V2, value=TRUE))),
  Series = as.character(gsub(".*:\\s(\\w).*","\\1", grep('Série:', cleanUp$V7, value=TRUE))))
  ][,ID := tstrsplit(V2," ", fixed=TRUE, keep = 1)
  ][, c("V1", "V3") := NULL
  ][-grep('Division', V2, fixed=TRUE)]

这里我们将 DivisionSeriesID 移到了它们自己的列中,并删除了 Division 标题行。这只是总体思路,需要稍加改进才能应用于所有 27 个页面。

                       V2                V4    V5                V6   V7 Division Series    ID
 1:                   514 Fontaine 1 KBSK 1                          303        1      A   514
 2:   62529 WIRIG ANTHONY      2501 1/2-1/2 51560     CZEBE ATTILLA 2439        1      A 62529
 3: 62359 BRUNNER NICOLAS          2443 0-1 51861         PICEU TOM 2401        1      A 62359
 4:     75655 CEKRO EKREM          2393 0-1 10391  GEIRNAERT STEVEN 2400        1      A 75655
 5:   50211 MARECHAL ANDY          2355 0-1 35181    LEENHOUTS KOEN 2388        1      A 50211
 6:  73059 CLAESEN PIETER      2327 1/2-1/2 25615 DECOSTER FREDERIC 2373        1      A 73059
 7: 63614 HOURIEZ CLEMENT      2304 1/2-1/2 44954  MAENHOUT THIBAUT 2372        1      A 63614
 8:   60369 CAPONE NICOLA      2283 1/2-1/2 10430    VERLINDE TIEME 2271        1      A 60369
 9:    70653 LE QUANG KIM          2282 0-1 44636     GRYSON WOUTER 2269        1      A 70653
10:                                 12 - 20                < 2364 >             1      A    NA

关于r - 如何使用 R 从 pdf 中提取粗体和非粗体文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49536590/

相关文章:

php - 具体编号如何转换使用 imagemagick 从 .pdf 文件到 .png 图像的页面

linux - 如何使用 grep 处理大量(数百万)文件来搜索字符串并在几分钟内获得结果

mysql - SQL 或 R : Find and display the index of all '1' s from a column with binary data type and store in another 1 or more columns

r - 避免在 Shiny 的情况下双重刷新情节

r - dplyr::filter 在过滤不等于值时删除 NA

html - 将从 .pdf 中提取的数据制表成 Pandas

python - 如何在Python中随意旋转,重新排列等pdf页面?

python - 如何增加/减少 x 和 y 刻度标签的字体大小

css - 如何使 div 框的高度取决于其中有多少文本

r - 强制申请返回 list