You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用R提取PDF中的粗体与非粗体文本?现有代码仅提取非粗体

解决PDF粗体+非粗体文本提取问题

嘿,我来帮你搞定这个问题~你当前用的是把PDF转成图片再OCR的方式,这种方法确实很难区分粗体和普通文本,而且容易丢失原文档的结构化信息。其实pdftools包里的pdf_data()函数能直接提取带字体样式的文本元数据,完美解决这个问题!

下面是调整后的完整代码,我会一步步给你解释:

步骤1:加载工具包并获取PDF的结构化数据

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

# 获取PDF所有页面的文本细节(包含字体、坐标等信息)
pdf_pages <- pdf_data(news)

步骤2:写个函数提取单页的粗体+非粗体文本

PDF里的粗体字体通常会在名称里带Bold、Bd这类关键词,我们可以用这个特征来识别粗体字符:

extract_formatted_text <- function(page_data) {
  # 筛选粗体字符:匹配字体名里的粗体关键词
  bold_chars <- page_data[grepl("Bold|Bd|bold", page_data$font, ignore.case = TRUE), ]
  # 剩下的就是非粗体字符
  regular_chars <- page_data[!grepl("Bold|Bd|bold", page_data$font, ignore.case = TRUE), ]
  
  # 按行拼接字符(同一行的y坐标基本一致)
  # 处理粗体文本,用Markdown粗体标记包裹
  bold_lines <- aggregate(text ~ y, data = bold_chars, FUN = paste, collapse = "")
  bold_lines <- paste0("**", bold_lines$text, "**")
  
  # 处理非粗体文本
  regular_lines <- aggregate(text ~ y, data = regular_chars, FUN = paste, collapse = "")
  regular_lines <- regular_lines$text
  
  # 合并所有行并按页面原顺序排序(根据y坐标从小到大)
  all_lines <- c(bold_lines, regular_lines)
  line_order <- order(c(bold_chars$y, regular_chars$y))
  sorted_text <- paste(all_lines[line_order], collapse = "\n")
  
  return(sorted_text)
}

步骤3:遍历所有页面提取并合并文本

# 批量处理每个页面
all_pages_content <- lapply(pdf_pages, extract_formatted_text)

# 把所有页面的文本合并到一起
full_formatted_text <- paste(unlist(all_pages_content), collapse = "\n\n")

# 查看结果,粗体内容会用**标记出来
cat(full_formatted_text)

补充说明

如果你的PDF是扫描件类型的图像PDF,那pdf_data()就没法直接提取文本了,这时候还是得用OCR,但可以先对图像做预处理(比如增强粗体区域的对比度),让tesseract能更好地识别样式。不过看你提供的PDF链接,这应该是可编辑的文本型PDF,上面的方法完全适用~

内容的提问来源于stack exchange,提问作者emeryville

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:34:32