如何用R按页提取Word文档文本而非按段落?
按页提取Word文档文本的解决方案
针对你需要按页提取.docx文本(和pdftools::pdf_text输出格式一致)的需求,以下是两种无需转PDF的实现方法:
方法一:基于officer包拆分分页符
officer的docx_summary返回结果中,分页符会以文本"\f"的形式单独作为一行存在,我们可以基于这个标记拆分文本到对应页面:
library(officer) # 读取Word文档 doc <- read_docx("Test.docx") # 获取文档段落摘要 doc_summary <- docx_summary(doc) # 按分页符拆分页面文本 page_text <- character() current_page <- c() for (i in seq_len(nrow(doc_summary))) { line <- doc_summary$text[i] # 遇到分页符时,保存当前页面并重置 if (line == "\f") { page_text <- c(page_text, paste(current_page, collapse = "\n")) current_page <- c() } else if (line != "") { # 跳过空行 current_page <- c(current_page, line) } } # 处理文档最后一页内容 if (length(current_page) > 0) { page_text <- c(page_text, paste(current_page, collapse = "\n")) }
最终page_text是一个字符向量,每个元素对应文档的一页文本,和pdftools输出格式完全匹配。
方法二:使用docxtractr包直接解析XML结构
docxtractr可以直接读取Word文档的底层XML,通过识别分页标记(w:lastRenderedPageBreak或w:pageBreak)来拆分页面:
library(docxtractr) library(xml2) # 读取文档 doc <- read_docx("Test.docx") # 获取文档XML内容 doc_xml <- docx_xml(doc) # 定位所有段落节点 paras <- xml_find_all(doc_xml, "//w:p") page_text <- character() current_page <- c() for (para in paras) { # 检查当前段落是否包含分页标记 has_page_break <- xml_find_first(para, ".//w:lastRenderedPageBreak | .//w:pageBreak") %>% xml_length() > 0 # 提取段落文本 para_text <- xml_text(xml_find_first(para, ".//w:t")) if (has_page_break) { # 保存当前页面并重置 if (length(current_page) > 0) { page_text <- c(page_text, paste(current_page, collapse = "\n")) current_page <- c() } } else if (!is.na(para_text) && para_text != "") { current_page <- c(current_page, para_text) } } # 处理最后一页 if (length(current_page) > 0) { page_text <- c(page_text, paste(current_page, collapse = "\n")) }
这两种方法都无需将Word文档转换为PDF,直接原生解析即可得到按页拆分的文本向量。
内容的提问来源于stack exchange,提问作者Rasul89
相关产品推荐
相关产品推荐

