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