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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 00:08:13