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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:43:35