如何将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
相关产品推荐
相关产品推荐

