【问题标题】:Extraction of text page by page from MS word docx file using python使用python从MS word docx文件中逐页提取文本
【发布时间】:2020-04-10 15:09:26
【问题描述】:

我有一个 MS docx 文件,我需要逐页从中提取文本。 我尝试过使用 python-docx,但它可以提取整个文本,但不能提取分页。 我还将我的 docx 转换为 pdf,然后尝试提取文本。问题是,转换后 docx 的页面结构发生了变化。例如,在转换时,字体大小发生了变化,docx一页中的文本内容占用了pdf中的一页以上。

我正在寻找一种稳定的解决方案,可以从 docx 中提取页面文本(不转换为 pdf 对我的整个解决方案来说会更好)。有人可以帮我吗?

【问题讨论】:

    标签: python python-3.x document extraction text-extraction


    【解决方案1】:

    在我看来,docx 格式(以及 python docx 库)只支持段落和部分。

    Microsoft Word 不支持硬页的概念。反而, 在 Word 中打开导出的文档时,Word 会重新分页 再次基于页面大小。 (source)

    所以实际上分页并没有存储在docx文件中,而是由渲染引擎进行的:

    DOCX 文件不包含有关分页的信息。你不会找到 文档中的页数,除非您计算了多少空间 您需要确定每行的页数。 (source)

    This page 有更多背景,如果必须保留分页,建议使用 PDF。

    【讨论】:

      【解决方案2】:

      我发现 Tika 库在读取文件时有一个 xmlContent 解析。我用它来捕获 xml 格式并使用正则表达式来捕获它。在对我有用的 python 代码下面编写。

      raw_xml = parser.from_file(file, xmlContent=True)
      body = raw_xml['content'].split('<body>')[1].split('</body>')[0]
      body_without_tag = body.replace("<p>", "").replace("</p>", "").replace("<div>", "").replace("</div>","").replace("<p />","")
      text_pages = body_without_tag.split("""<div class="page">""")[1:]
      num_pages = len(text_pages)
      if num_pages==int(raw_xml['metadata']['xmpTPg:NPages']) : #check if it worked correctly
           return text_pages
      

      【讨论】:

        【解决方案3】:

        我最近遇到了类似的情况。以下使用docx2python 为我工作:

        from docx2python import docx2python
        doc_result = docx2python('page-wise-file.docx')
        count = 0
        para = 0
        pages= []
        while para < len(doc_result.body[0][0][0]):
            if doc_result.body[0][0][0][para] != "":
                current_page = {}
                current_page_paras = []
                count+=1
                while doc_result.body[0][0][0][para]!= "" and para<len(doc_result.body[0][0][0]):
                    current_page_paras.append(doc_result.body[0][0][0][para])
                    para+=1
                current_page["page_text"] = "\n".join(current_page_paras)
                current_page["page_no"] = count
                pages.append(current_page)
            else:
                para+=1
        

        虽然这会导致从文本中丢失任何格式信息或任何其他元数据,但如果提取文本是唯一目的,那么这应该可行。

        正如Gerd 所提到的,将文件转换为 PDF 然后对其进行处理也会有所帮助,因为像 PyPDF2 这样的库允许您阅读单个页面,例如:

        from PyPDF2 import PdfFileReader
        pdf = PdfFileReader(open("page-wise-file.pdf", "rb"))
        page = pdf.getPage(0)
        page.extractText()
        

        【讨论】:

          【解决方案4】:

          试试这个

          
          from docx import Document
          
          document = Document('anydoccumnet.docx')
          for para in document.paragraphs:
              print(para.text)
          

          【讨论】:

          • 我也试过这个,它会给出整个文档中的所有段落,但不是页面明智的。我正在尝试逐页获取文本
          猜你喜欢
          • 1970-01-01
          • 2010-09-12
          • 2018-04-05
          • 2014-10-03
          • 1970-01-01
          • 1970-01-01
          • 2011-10-06
          • 1970-01-01
          • 2013-10-30
          相关资源
          最近更新 更多