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

从含半填充列的PDF提取表格:列内容错位问题求助

解决PDF半填充列表格提取问题

你的问题根源在于用strsplit(split = " ")按空格分割文本——半填充列的行中,第一列内容较短,后续空格会被str_squish()压缩,导致第二列内容被错误合并到第一列。以下是两种可靠的解决方法:

方法1:基于字符坐标精确分割(手动控制)

利用pdf_data()获取PDF中每个字符的坐标,通过x轴位置划分列,彻底避免空格分割的混乱:

# 加载所需包
library(tidyverse)
library(rvest)
library(httr2)
library(pdftools)
library(curl)

# 下载PDF(保留你的原代码)
url_ <- 
  request("https://www.bankofgreece.gr/en/statistics/real-estate-market/residential-and-commercial-property-price-indices-and-other-short-term-indices") |> 
  req_user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") |> 
  req_perform() |> 
  resp_body_html() |> 
  html_elements("div[title = 'Office Price Index']") |> 
  html_attr("data-pdf-file")

pdf_ <- curl_download(url_, basename(url_))  

# 获取带坐标的PDF字符数据
pdf_data <- pdf_data(pdf_)
page1_data <- pdf_data[[1]] # 假设表格在第一页

# 自动识别列边界(按x坐标分位数划分,可根据实际调整)
x_breaks <- c(0, quantile(page1_data$x, c(0.3, 0.6, 1)))
page1_data <- page1_data |>
  mutate(col = cut(x, breaks = x_breaks, labels = c("Period", "Index", "Change"))) # 自定义列名

# 聚合字符生成表格
clean_table <- page1_data |>
  group_by(y, col) |>
  summarise(content = str_c(text, collapse = ""), .groups = "drop") |>
  pivot_wider(names_from = col, values_from = content) |>
  arrange(y) |>
  mutate(across(everything(), str_squish)) |>
  filter(if_any(everything(), ~.x != "")) # 过滤空行

# 查看结果
print(clean_table)

方法2:用专业表格提取包(简便高效)

使用tabulizer包,它基于Java PDFBox能自动识别表格结构,对非标准填充的表格适配性更好:

# 安装包(首次运行需执行)
# install.packages("tabulizer")
library(tabulizer)

# 直接提取表格
extracted_tables <- extract_tables(pdf_)
# 转换为整洁数据框
table_df <- as_tibble(extracted_tables[[1]], .name_repair = "unique")

# 可选:清理列名和内容
table_df <- table_df |>
  rename_with(~str_remove_all(., "\\W")) |>
  mutate(across(everything(), str_squish))

print(table_df)

注意事项

  • 如果tabulizer安装失败,需确保本地安装了Java环境;
  • 方法1中的x_breaks可根据实际PDF的列宽度调整,通过查看page1_data$x的分布来优化分割点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 14:53:11