r - 使用R从PDF文件中提取字符字体大小

标签 r pdf text-mining

我一直在尝试重现 paper 中解释的类似数据集(我强调不完全相同)出于类似的目的。但我在使用 R 编码时无法想出获取字体大小的想法。其他解决方案似乎可以在其他编码语言中使用。

例如,人们可以非常轻松地提取有关页面中字符数量的信息,或者转换图像中的每个页面并获取有关像素数量等的数据 - 无论如何,这将成为我的元数据的一部分。比如下面的例子:

library(pdftools)
library(png)

download.file("http://arxiv.org/pdf/1403.2805.pdf", "1403.2805.pdf", mode = "wb")

txt <- pdf_text("1403.2805.pdf")

num_char_page = unlist(lapply(txt,nchar))

height = 1:length(txt)
width =1:length(txt)

for (i in 1:length(txt)) {

  bitmap <- pdf_render_page("1403.2805.pdf", page = i)

  png::writePNG(bitmap, paste0("page",i,".png"))

  photo=readPNG(paste0("page",i,".png"))

  height[i]  = dim(photo)[1]

  width[i] = dim(photo)[2]

}

layout_df = data.frame(page=1:length(txt), num_char_page=num_char_page, height=height, width=width)

所以这相当简单,尽管在循环部分(也许)使用一些 lapply 版本可以使代码更快。但我不知道如何获取字体大小。我该怎么做呢?特别是如果我们假设文档的扫描版本,例如上述论文中的文档。


观察:我可能会在一个单独的问题中提出这个问题,但如果有人能够在评论中指出有关边距大小和行间距的一些想法,我会很高兴。

第二个观察:我认为(在这种特殊情况下)我用作示例的 PDF 可能具有可以启用字体大小提取的元数据。但我试图从扫描的(也许是 OCR 的)PDF 中获取字体大小。人们可以将 PDF 的页面(在示例中)转换为图像,然后再次将其转换为非 OCR 的 PDF,这可能有点类似于扫描的 PDF 情况。

最佳答案

可能无法确定实际的字体大小,至少在不知道确切的字体及其规范的情况下是如此。 see here for an explanation of why

如果您只想比较文档之间的字体大小,使用平均行高作为比较可能就足够了,这可能更容易做到。如果您不关心实际值而只需要知道文档之间的相对大小,则以下方法可能有效。您必须考虑或避免不同文档大小和/或 DPI 的潜在影响。

library(tesseract)
library(dplyr)
library(tidyr)

df <- ocr_data("http://arxiv.org/pdf/1403.2805.pdf")

df %>% 
  separate(bbox, c('x1', 'y1', 'x2', 'y2'), convert = T) %>% 
  mutate(line_height = y2 - y1) %>% 
  summarise(avg_line_height = mean(line_height))

# # A tibble: 1 x 1
#   avg_line_height
#             <dbl>
# 1            58.7

平均字母高度和宽度的示例...

df %>%
  separate(bbox, c('x1', 'y1', 'x2', 'y2'), convert = T) %>%
  mutate(word_height = y2 - y1) %>%
  mutate(word_width = x2 - x1) %>%
  mutate(num_letters = nchar(word)) %>%
  mutate(avg_letter_width = word_width / num_letters) %>%
  summarise(avg_letter_height = mean(word_height),
            avg_letter_width = mean(avg_letter_width))

# # A tibble: 1 x 2
#   avg_letter_height avg_letter_width
#               <dbl>            <dbl>
# 1              58.7             37.3

如果您想按页执行此操作,可以使用 pdftools 单独渲染多页 PDF 的每一页,并在每一页上运行 ocr_data,然后结合...

library(pdftools)
library(tesseract)
library(dplyr)
library(tidyr)

download.file(url = "http://arxiv.org/pdf/1403.2805.pdf",
              destfile = pdf_path <- tempfile(fileext = ".pdf"))

page_pngs <-
  lapply(seq_len(pdf_info(pdf_path)$pages), function(page_num) {
    pdf_convert(pdf_path, pages = page_num, dpi = 300)
  })

df <-
  bind_rows(
    lapply(seq_len(length(page_pngs)), function(page_num) {
      ocr_data(page_pngs[[page_num]]) %>%
        separate(bbox, c('x1', 'y1', 'x2', 'y2'), convert = T) %>%
        mutate(word_height = y2 - y1) %>%
        mutate(word_width = x2 - x1) %>%
        mutate(num_letters = nchar(word)) %>%
        mutate(avg_letter_width = word_width / num_letters) %>%
        mutate(page = page_num) %>%
        select(page, letter_height = word_height, letter_width = avg_letter_width)
    })
  )

df %>%
  group_by(page) %>%
  summarise(avg_letter_height = mean(letter_height),
            avg_letter_width = mean(letter_width)) %>%
  mutate(avg_letter_area = avg_letter_height * avg_letter_width)

# # A tibble: 29 x 4
#     page avg_letter_height avg_letter_width avg_letter_area
#    <int>             <dbl>            <dbl>           <dbl>
#  1     1              29.4             17.9            525.
#  2     2              29.3             18.9            554.
#  3     3              30.0             19.1            574.
#  4     4              30.2             18.7            565.
#  5     5              29.8             19.0            566.
#  6     6              28.2             17.7            498.
#  7     7              28.9             18.3            529.
#  8     8              29.8             18.6            554.
#  9     9              29.1             18.6            541.
# 10    10              28.3             18.3            519.
# # ... with 19 more rows

关于r - 使用R从PDF文件中提取字符字体大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49321238/

相关文章:

r - 在 ggplot2 中自定义图例大小符号项

从 R 包函数中检索并执行示例代码作为 R-markdown 中的代码块

pdf - 如何使用 iText 将 XHTML 嵌套列表转换为 pdf?

python - 从数据框格式的文本列中提取单词

r - 在 R 中绘制数据框中的多条线

在 mutate_each 或 summarise_each 之后以 'canonical' 的方式对列重新排序

node.js - 如何在NodeMailer的附件邮件选项中使用PDFMake的pdf输出?

javascript - D3.js SVG 为其提供 ID 或将 SVG 添加到 PDF

python - 如何仅使用 TfidfVectorizer 获取 TF?

python - 在 python (sklearn) 中使用亲和传播聚类 word2vec 向量