从含半填充列的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
相关产品推荐
相关产品推荐

