如何使用Python的PyPDF2库从PDF文件中删除水印

tag*_*aga 2 python pdf

我编写了一个代码,使用 Python 和 PyPDF2 lib 从 PDF 文件中提取文本。\n代码适用于大多数文档,但有时它会返回一些奇怪的字符。我认为那是因为 PDF 页面上有水印,所以它无法识别文本:

\n
import 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))\n
Run 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...\n
Run Code Online (Sandbox Code Playgroud)\n

我的问题是,如何解决这个问题?\n有没有办法从页面或类似的东西中删除水印?\n我的意思是,也许这个问题可以通过其他方式解决,也许问题不在于该水印/标识?

\n

Lif*_*lex 5

您遇到的乱码问题与文档中的水印无关。您的问题似乎与文档中的编码有关。文档中的德语字符应该能够使用PyPDF2提取,因为它使用 latin-1 (iso-8859-1) 编码/解码模型。此编码模型不适用于您的 PDF。

\n

当我查看 PDF 的基础信息时,我注意到它是使用以下应用程序创建的:

\n
    \n
  • \'制作人\':\'GPL Ghostscript 9.10\'
  • \n
  • \'Creator\': \'PDFCreator 版本 1.7.3
  • \n
\n

当我查看这个问题中同样用德语编写的PDF之一时,我注意到它是使用不同的应用程序创建的:

\n
    \n
  • \'/Creator\': \'Acrobat PDFMaker 11 f\xc3\xbcr Excel\'
  • \n
  • \'/Producer\': \'Adobe PDF Library 11.0\'
  • \n
\n

我可以使用PyPDF2完美读取第二个文件。

\n

当我从您的其他问题中查看此文件时,我注意到PyPDF2也无法正确读取该文件。该文件是使用与此赏金问题中的文件相同的应用程序创建的。

\n
    \n
  • \'制作人\':\'GPL Ghostscript 9.10\'
  • \n
  • \'Creator\': \'PDFCreator 版本 1.7.3
  • \n
\n

尝试使用 pdfreader.SimplePDFViewer 提取文本时,该文件会引发错误

\n

我查看了Ghostscript 的错误,并注意到 2015 年发布的 Ghostscript 9.10 存在一些与字体相关的问题。我还注意到有些人提到 2018 年发布的 PDFCreator 版本 1.7.3 也存在一些字体嵌入问题。

\n

我一直在尝试找到正确的解码/编码序列,但到目前为止我还无法正确提取文本。

\n

以下是一些序列:

\n
page_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\n
Run Code Online (Sandbox Code Playgroud)\n

我将继续寻找与 PyPDF2 一起使用的正确编码/解码序列。值得一提的是,PyPDF2自 2016 年 5 月 18 日以来就没有更新过。编码问题也是该模块的常见问题。另外,该模块的维护已经失效,因此可以移植到模块PyPDF3PyPDF4

\n

我尝试使用 PyPDF2、PyPDF3 和 PyPDF4 从您的 PDF 中提取文本。所有 3 个模块均无法从您提供的 PDF 中提取内容。

\n
\n

您绝对可以使用其他Python模块从文档中提取内容。

\n

蒂卡

\n

此示例使用TikaBeautifulSoup从源文档中提取德语内容。

\n
import 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\n
Run Code Online (Sandbox Code Playgroud)\n

pdf矿工

\n

此示例使用pdfminer从源文档中提取内容。

\n
import 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())\n
Run Code Online (Sandbox Code Playgroud)\n