我编写了一个代码,使用 Python 和 PyPDF2 lib 从 PDF 文件中提取文本。\n代码适用于大多数文档,但有时它会返回一些奇怪的字符。我认为那是因为 PDF 页面上有水印,所以它无法识别文本:
\nimport requests\nfrom io import StringIO, BytesIO\nimport PyPDF2\n\ndef pdf_content_extraction(pdf_link):\n\n all_pdf_content = ''\n\n #sending requests\n response = requests.get(pdf_link)\n my_raw_data = response.content\n\n\n pdf_file_text = 'PDF File: ' + pdf_link + '\\n\\n'\n #extract text page by page\n with BytesIO(my_raw_data) as data:\n read_pdf = PyPDF2.PdfFileReader(data)\n\n #looping trough each page\n for page in range(read_pdf.getNumPages()):\n page_content = read_pdf.getPage(page).extractText()\n page_content = page_content.replace("\\n\\n\\n", "\\n").strip()\n\n #store data into variable for each page\n pdf_file_text += page_content + '\\n\\nPAGE '+ str(page+1) + '/' + str(read_pdf.getNumPages()) +'\\n\\n\\n'\n\n all_pdf_content += pdf_file_text + "\\n\\n"\n \n return all_pdf_content\n\n\n\npdf_link = 'http://www.dielsdorf.ch/dl.php/de/5f867e8255980/2020.10.12.pdf'\n\nprint(pdf_content_extraction(pdf_link))\nRun Code Online (Sandbox Code Playgroud)\n这是我得到的结果:
\n#$%\xcb\x98\xcb\x98\n&'(\xcb\x9d\xcb\x99\xcb\x9d\xcb\x99)*+"*\xcb\x9c\n\xcb\x9c*\n,*\xcb\x9c*\xcb\x9c\xcb\x86+-*\xcb\x98!(\n.\xcb\x9c($*%(#%*\xcb\x9c-/\n"*\n*\xcb\x9c\xcb\x9c0!0\xcb\x98\xcb\x98*\xcb\x9c\xcb\x98\xcb\x9c\xcb\x86\n+\xcb\x9c(%\n*\n*(+%*\xcb\x9c+"*\xcb\x9c'\n$*1\xcb\x9c\xcb\x86\n...\n...\nRun Code Online (Sandbox Code Playgroud)\n我的问题是,如何解决这个问题?\n有没有办法从页面或类似的东西中删除水印?\n我的意思是,也许这个问题可以通过其他方式解决,也许问题不在于该水印/标识?
\n您遇到的乱码问题与文档中的水印无关。您的问题似乎与文档中的编码有关。文档中的德语字符应该能够使用PyPDF2提取,因为它使用 latin-1 (iso-8859-1) 编码/解码模型。此编码模型不适用于您的 PDF。
\n当我查看 PDF 的基础信息时,我注意到它是使用以下应用程序创建的:
\n当我查看这个问题中同样用德语编写的PDF之一时,我注意到它是使用不同的应用程序创建的:
\n我可以使用PyPDF2完美读取第二个文件。
\n当我从您的其他问题中查看此文件时,我注意到PyPDF2也无法正确读取该文件。该文件是使用与此赏金问题中的文件相同的应用程序创建的。
\n尝试使用 pdfreader.SimplePDFViewer 提取文本时,该文件会引发错误。
\n我查看了Ghostscript 的错误,并注意到 2015 年发布的 Ghostscript 9.10 存在一些与字体相关的问题。我还注意到有些人提到 2018 年发布的 PDFCreator 版本 1.7.3 也存在一些字体嵌入问题。
\n我一直在尝试找到正确的解码/编码序列,但到目前为止我还无法正确提取文本。
\n以下是一些序列:
\npage_content.encode(\'raw_unicode_escape\').decode(\'ascii\', \'xmlcharrefreplace\'))\n# output\n\\u02d8\n\\u02c7\\u02c6\\u02d9\\u02dd\\u02d9\\u02db\\u02da\\u02d9\\u02dc\n\\u02d8\\u02c6!"""\\u02c6\\u02d8\\u02c6!\n\n\npage_content.encode(\'ascii\', \'xmlcharrefreplace\').decode(\'raw_unicode_escape\'))\n# output\n# ˘\nˇˆ˙˝˙˛˚˙˜ \n˘ˆ!"""ˆ˘ˆ!\n\nRun Code Online (Sandbox Code Playgroud)\n我将继续寻找与 PyPDF2 一起使用的正确编码/解码序列。值得一提的是,PyPDF2自 2016 年 5 月 18 日以来就没有更新过。编码问题也是该模块的常见问题。另外,该模块的维护已经失效,因此可以移植到模块PyPDF3和PyPDF4。
\n我尝试使用 PyPDF2、PyPDF3 和 PyPDF4 从您的 PDF 中提取文本。所有 3 个模块均无法从您提供的 PDF 中提取内容。
\n您绝对可以使用其他Python模块从文档中提取内容。
\n蒂卡
\n此示例使用Tika和BeautifulSoup从源文档中提取德语内容。
\nimport requests\nfrom tika import parser\nfrom io import BytesIO\nfrom bs4 import BeautifulSoup\n\npdf_link = \'http://www.dielsdorf.ch/dl.php/de/5f867e8255980/2020.10.12.pdf\'\nresponse = requests.get(pdf_link)\nwith BytesIO(response.content) as data:\n parse_pdf = parser.from_buffer(data, xmlContent=True)\n\n # Parse metadata from the PDF\n metadata = parse_pdf[\'metadata\']\n\n # Parse the content from the PDF\n content = parse_pdf[\'content\']\n\n # Convert double newlines into single newlines\n content = content.replace(\'\\n\\n\', \'\\n\')\n soup = BeautifulSoup(content, "lxml")\n body = soup.find(\'body\')\n for p_tag in body.find_all(\'p\'):\n print(p_tag.text.strip())\n\nRun Code Online (Sandbox Code Playgroud)\npdf矿工
\n此示例使用pdfminer从源文档中提取内容。
\nimport requests\nfrom io import BytesIO\nfrom pdfminer.high_level import extract_text\n\n\npdf_link = \'http://www.dielsdorf.ch/dl.php/de/5f867e8255980/2020.10.12.pdf\'\nresponse = requests.get(pdf_link)\nwith BytesIO(response.content) as data:\n text = extract_text(data, password=\'\', page_numbers=None, maxpages=0, caching=True,\n codec=\'utf-8\', laparams=None)\n print(text.replace(\'\\n\\n\', \'\\n\').strip())\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
5288 次 |
| 最近记录: |