如何从PDF嵌入图表中提取数值至R语言变量?
解决PDF折线图数据提取的问题
先给你捋清楚核心问题:你之前用pdftools提取文本的思路,只能拿到PDF里的纯文字内容,但折线图上的数值是嵌入在图形元素里的(不是可复制的普通文本),所以自然抓不到这些数据。下面给你两种可行的解决思路:
方法一:OCR识别图表区域(适合大多数场景)
这个方法是先把PDF里的图表页面转成图片,再用OCR工具识别图片里的数值,步骤如下:
- 先安装需要的R包:
install.packages(c("pdftools", "tesseract", "magick"))
- 提取目标页面(你的PDF里折线图在第4页)并转成高清图片:
library(pdftools) library(magick) pdf_file <- "Weekly-Flu-Report-01-19-2018.pdf" # 提取第4页为PNG图片,设置高DPI保证识别精度 page_img <- pdf_convert(pdf_file, pages = 4, format = "png", dpi = 300) img <- image_read(page_img)
- 裁剪出折线图的精准区域(你可以用图片查看工具获取坐标,下面是示例值):
# 裁剪参数格式为"x起始坐标y起始坐标x结束坐标y结束坐标",自行调整匹配你的图表 chart_img <- image_crop(img, "x120y250x780y620") image_write(chart_img, "flu_chart_cropped.png")
- 用Tesseract进行OCR识别并提取数值:
library(tesseract) library(stringr) # 加载英文语言包(首次运行会自动下载) eng_tesseract <- tesseract("eng") # 识别裁剪后的图表文本 chart_text <- ocr("flu_chart_cropped.png", engine = eng_tesseract) # 提取所有数字(包含小数) extracted_values <- str_extract_all(chart_text, "\\d+\\.?\\d*")[[1]] print(extracted_values)
方法二:解析PDF矢量图形路径(仅适合矢量PDF)
如果你的PDF是矢量格式(不是扫描生成的),可以提取折线的坐标数据,再对应坐标轴刻度计算实际数值:
- 提取页面的图形与文本数据:
library(pdftools) pdf_data <- pdf_data(pdf_file, pages = 4) page_content <- pdf_data[[1]]
- 筛选出折线的路径坐标:
# 筛选出类型为path的行,也就是折线的坐标数据 line_coords <- page_content[page_content$type == "path", ]
- 匹配坐标轴刻度,映射坐标到实际数值:
# 提取Y轴刻度的文本和坐标(假设Y轴在页面左侧,x坐标小于100) y_ticks <- page_content[page_content$type == "text" & page_content$x < 100, ] # 把刻度文本转成数值 y_tick_values <- as.numeric(y_ticks$text) # 获取刻度的Y坐标范围 min_y_coord <- min(y_ticks$y) max_y_coord <- max(y_ticks$y) min_y_val <- min(y_tick_values) max_y_val <- max(y_tick_values) # 线性映射折线坐标到实际数值 line_coords$actual_value <- (max_y_val - min_y_val) * (max_y_coord - line_coords$y) / (max_y_coord - min_y_coord) + min_y_val
注意:这个方法只对矢量PDF有效,如果是扫描版PDF,路径数据会是位图像素信息,无法解析出有效坐标。
如果OCR识别准确率不够,可以尝试提高图片DPI、调整裁剪范围,或者用Tesseract的自定义训练模型优化识别效果。
内容的提问来源于stack exchange,提问作者Dee V
相关产品推荐
相关产品推荐

