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

如何将PDF元数据中的目录信息转换为R语言data.frame?

嘿,我来帮你搞定这个R语言提取PDF书签的后续操作!你已经把目标区域的内容拆分好了,接下来只需要把这些零散的键值对按每个书签对应Title/Level/PageNumber一组来整理成data.frame就行,这里给你两种实用的方法:

方法一:分组循环提取

咱们先把拆分后的列表按每3个元素为一组(每个书签刚好对应这三个条目),然后逐个提取每组的信息:

# 先假设你拆分后的列表叫 split_list(就是你给出的那个列表)
split_list <- list(
  c("BookmarkTitle", "Contents"),
  c("BookmarkLevel", "1"),
  c("BookmarkPageNumber", "11"),
  c("BookmarkTitle", "Preface "),
  c("BookmarkLevel", "1"),
  c("BookmarkPageNumber", "5"),
  c("BookmarkTitle", "Explanatory Note and Abbreviations Used "),
  c("BookmarkLevel", "1"),
  c("BookmarkPageNumber", "7")
)

# 计算总共有多少个书签条目
total_bookmarks <- length(split_list) / 3

# 循环提取每个书签的信息并组合成data.frame
toc_result <- lapply(1:total_bookmarks, function(idx) {
  # 计算当前书签组的起始位置
  start_pos <- (idx - 1) * 3 + 1
  # 提取并清理内容(trimws去掉多余空格)
  title <- trimws(split_list[[start_pos]][2])
  level <- as.integer(split_list[[start_pos + 1]][2])
  page_num <- as.integer(split_list[[start_pos + 2]][2])
  # 生成单条记录的data.frame
  data.frame(
    BookmarkTitle = title,
    BookmarkLevel = level,
    BookmarkPageNumber = page_num,
    stringsAsFactors = FALSE
  )
}) %>% 
  # 把所有单条记录合并成一个大的data.frame(如果不用dplyr,就用do.call(rbind, .))
  dplyr::bind_rows()

# 查看最终结果
print(toc_result)
方法二:矩阵转换法(更简洁)

如果觉得循环麻烦,咱们可以把列表转换成矩阵,再按分组重新排列:

# 把拆分后的列表转成矩阵,每行是一个键值对
toc_matrix <- do.call(rbind, split_list)
# 把值列(第二列)按每3个为一组转成列,形成每行对应一个书签
grouped_matrix <- matrix(toc_matrix[, 2], ncol = 3, byrow = TRUE)
# 转换成data.frame并设置列名、处理数据类型
toc_result <- data.frame(
  BookmarkTitle = trimws(grouped_matrix[, 1]),
  BookmarkLevel = as.integer(grouped_matrix[, 2]),
  BookmarkPageNumber = as.integer(grouped_matrix[, 3]),
  stringsAsFactors = FALSE
)

# 查看结果
print(toc_result)

两种方法都能得到你想要的data.frame格式,而且trimws()还能帮你去掉标题里多余的空格(比如示例里"Preface "末尾的空格),让结果更整洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:10:22