【问题标题】:How do you write text extracted from PDF (using textract) to docx files in python如何将从 PDF 中提取的文本(使用 textract)写入 python 中的 docx 文件
【发布时间】:2020-11-26 10:57:40
【问题描述】:

我在一个 pdf 文件中有几篇文章,我正在尝试将这些文章分开并将它们写入单独的 Docx 文件。我设法使用正则表达式将它们分开,但是当我尝试将它们写入 docx 文件时,它会抛出此错误:ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters.

我的代码如下:

my_path = "/path/to/pdf"

newpath = textract.process(my_path)
newpath2 = newpath.decode("UTF-8")

result = re.findall(r'\d+ words(.*?)Document \w+', newpath2, re.DOTALL)


save_path = "/path/to/write/docx/files/"

for each in result:
    import time
    time=str(time.time())
    finalpath = (os.path.join(save_path, time))
    finalpath2 = finalpath+".docx"
    mydoc = docx.Document()
    mydoc.add_paragraph(each)
    mydoc.save(finalpath2)

【问题讨论】:

  • 那么,为什么不删除它们呢? .add_paragraph(remove_control_characters(each.replace('\x00',''))) 与来自this answerremove_control_characters
  • @WiktorStribiżew 非常感谢。在这样做之前我需要导入一些东西吗?它抛出这个错误:NameError: name 'remove_control_characters' is not defined
  • 我与该函数定义共享了问题的链接。只需将该函数复制并粘贴到您的代码中即可。
  • @WiktorStribiżew 已接受!快速的问题。我将使用更多可能包含其他 unicode 字符的 PDF 文件。如何让这段代码预测其他 unicode 字符而不实际告诉它要替换什么字符
  • 我知道如果文本中包含 Unicode 字符不是问题。您只需要删除那些使其与您正在使用的解析器不兼容的那些。

标签: python regex docx text-extraction python-docx


【解决方案1】:

您可以删除所有 null 和控制字节字符并使用

.add_paragraph(remove_control_characters(each.replace('\x00','')))

remove_control_characters函数可以从Removing control characters from a string in python线程借用。

代码sn-p:

import unicodedata
def remove_control_characters(s):
    return "".join(ch for ch in s if unicodedata.category(ch)[0]!="C")

my_path = "/path/to/pdf"

newpath = textract.process(my_path)
newpath2 = newpath.decode("UTF-8")

result = re.findall(r'\d+ words(.*?)Document \w+', newpath2, re.DOTALL)

save_path = "/path/to/write/docx/files/"

for each in result:
    import time
    time=str(time.time())
    finalpath = (os.path.join(save_path, time))
    finalpath2 = finalpath+".docx"
    mydoc = docx.Document()
    mydoc.add_paragraph(remove_control_characters(each.replace('\x00','')))
    mydoc.save(finalpath2)

【讨论】:

    猜你喜欢
    • 2014-10-03
    • 1970-01-01
    • 2022-10-14
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多