如何使用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
相关产品推荐
相关产品推荐

