使用R的pdftools包提取表格:单元格换行问题求助
解决方案(仅使用pdftools)
核心思路是利用pdf_data()返回的坐标、字体信息对内容进行分组,识别同一单元格内的换行文本并合并,最终生成规整表格,同时保留字体数据。
步骤1:加载依赖并提取PDF词级数据
library(pdftools) library(dplyr) library(tibble) library(stringr) # 替换为你的PDF文件路径 pdf_path <- "your_target_file.pdf" # 提取全页词级数据(包含x/y坐标、字体、字号、文本) pdf_raw_data <- pdf_data(pdf_path) %>% bind_rows(.id = "page") %>% mutate(page = as.integer(page))
步骤2:基于坐标划分表格列
通过x坐标区分不同列(这里假设表格为2列,第一列是cat_number,第二列是cat_label):
# 方法1:手动设置x阈值(更稳定,建议先查看pdf_raw_data$x的分布确定阈值) pdf_raw_data <- pdf_raw_data %>% mutate(col = ifelse(x < 120, "cat_number", "cat_label")) # 示例阈值,需根据实际调整 # 方法2:自动聚类划分列(适合未知结构的表格) # x_clusters <- kmeans(pdf_raw_data$x, centers = 2)$cluster # pdf_raw_data <- pdf_raw_data %>% # mutate(col = ifelse(x_clusters == 1, "cat_number", "cat_label"))
步骤3:为同一单元格内容分配组ID
识别哪些行属于同一个单元格(比如cat_label内的换行内容,对应同一个cat_number):
pdf_raw_data <- pdf_raw_data %>% arrange(page, y) %>% # 按页面和纵向坐标排序 group_by(page) %>% mutate( # 标记属于cat_number的行 is_cat_row = col == "cat_number" & text != "", # 为每个cat_number及其对应的cat_label分配唯一组ID group_id = cumsum(is_cat_row) ) %>% ungroup() # 处理无cat_number的行(如示例中最后一行NA的情况) pdf_raw_data <- pdf_raw_data %>% mutate(group_id = ifelse(group_id == 0, max(group_id) + 1, group_id))
步骤4:合并单元格内容并保留字体信息
final_table <- pdf_raw_data %>% group_by(group_id, col) %>% summarise( content = str_c(text, collapse = " "), # 合并同一单元格内的换行文本 font = first(font), # 保留单元格字体(取第一个词的字体,若单元格字体一致则准确) font_size = first(size), # 保留字号 .groups = "drop" ) %>% pivot_wider(names_from = col, values_from = content) %>% rename(cat_number = cat_number, cat_label = cat_label) %>% # 将空的cat_number转为NA mutate(cat_number = ifelse(cat_number == "", NA_character_, cat_number))
最终输出
运行后final_table会生成你需要的规整表格,同时包含font和font_size列供后续使用,示例输出如下:
# A tibble: 4 × 4 group_id cat_number cat_label font font_size <int> <chr> <chr> <chr> <dbl> 1 1 01 How to consistently identify category labels and to match them with cat. numbers despite the line breaks? ArialMT 12 2 2 02 Easy to get ArialMT 12 3 3 03 Easy to get as well. ArialMT 12 4 4 NA Don't know / Missing. ArialMT 12
关键说明
- 坐标阈值需根据你的PDF实际情况调整:先查看
pdf_raw_data$x的分布,确定两列的x分界点。 - 若表格字体不一致,可修改
font的提取逻辑(比如取出现次数最多的字体)。 - 所有操作仅依赖pdftools(和常规数据处理包dplyr等,未引入其他PDF处理工具),满足你后续使用字体信息的需求。
内容的提问来源于stack exchange,提问作者Val
相关产品推荐
相关产品推荐

