簡體   English   中英

Python:使用 UTF-8 以二進制模式打開 PDF

[英]Python: open PDF in in binary mode with UTF-8

我正在嘗試使用 PyPDF4 打開 PDF 文件。

import PyPDF4

text = ""

pdf_file = open(filename,mode='rb')
pdfReader = PyPDF4.PdfFileReader(pdf_file)
pdfObj = pdfReader.getPage(0)
text = pageObj.extract(pdfObj)

print(text)

這工作正常,除了 PDF 的內容是德語並且特殊字符 (Umlaute) 編碼錯誤(例如 zun-chst 而不是 zunächst)。

我無法更改二進制代碼的編碼,但如果我不使用二進制代碼,則會出現錯誤

文件 "/usr/local/lib/python3.8/site-packages/PyPDF4/pdf.py", line 1754, in read stream.seek(-1, 2) io.UnsupportedOperation: can't do nonzero end-relative尋求

這個錯誤有多個線程(例如, 從文件末尾尋找拋出不受支持的異常)但是,似乎沒有一個解決方案對我有用。 非常感謝任何幫助,謝謝。

PDF 文件肯定是二進制的; 您絕對不應該嘗試使用'rb'模式以外'rb'任何其他方式來閱讀它。

可以做的是解碼您提取的文本。 如果您知道編碼是 UTF-8(根據您展示的示例,這可能不是真的),

print(text.decode('utf-8'))

根據您的單個樣本,我認為可以肯定地說編碼不是 UTF-8,但是因為我們不知道您在查看文本時使用的是哪種編碼,所以這都是猜測。 如果您可以顯示字符串中的實際字節,那么從幾個樣本中找出實際編碼應該不難,也許可以借助像https://tripleee.github.io/8bit/這樣的字符圖表。 您粘貼的字符是U+2212 ,它似乎並不直接對應於任何常見的 ä 8 位編碼,但也許這只是粘貼中的錯誤。

也許另請參閱有關某些背景的解碼錯誤的問題 理想情況下,也許可以更新您的問題以提供它要求的詳細信息,如果這還沒有讓您到達可以自己解決問題的地方。

如果 PyPDF 真的認為字符是"−"那么它的提取邏輯可能是錯誤的,或者 PDF 有缺陷。 如果您無法修復它,可能只需在您找到有問題的字符時手動重新映射它們。 您可能希望添加帶有logging的調試打印,以突出顯示提取文本中可打印 ASCII 范圍之外的任何字符,直到您知道已涵蓋所有字符。

import re
import logging

# ...
text = text.replace("\u2212", "ä").replace("\u1234", "ö")  # etc
for match in re.findall(r'(.{1,5})?([^äö\n -\u007f])(.{1,5})?', text):
    logging.warning("{0} found in {1}".format(match[1], "".join(match)))

不幸的是,以上並不完全有效——尤其是 U+2212 似乎作為 ASCII 范圍的一部分匹配,無論我傳入什么re標志。(還要注意占位符"\ሴ" ——用一些東西替換它有用,並在發現它們時添加更多。)

@downbydawn 對上面評論中提到的錯誤有同樣的經歷

我最終使用了https://stackoverflow.com/a/26351413/1497139的修改版本:

# derived from
# https://stackoverflow.com/a/26351413/1497139

from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from io import StringIO

class PDFMiner:
    '''
    PDFMiner wrapper to get PDF Text
    '''

    @classmethod
    def getPDFText(cls,pdfFilenamePath,throwError:bool=True):
        retstr = StringIO()
        parser = PDFParser(open(pdfFilenamePath,'rb'))
        try:
            document = PDFDocument(parser)
        except Exception as e:
            errMsg=f"error {pdfFilenamePath}:{str(e)}"
            print(errMsg)
            if throwError:
                raise e
            return ''
        if document.is_extractable:
            rsrcmgr = PDFResourceManager()
            device = TextConverter(rsrcmgr,retstr,  laparams = LAParams())
            interpreter = PDFPageInterpreter(rsrcmgr, device)
            for page in PDFPage.create_pages(document):
                interpreter.process_page(page)
            return retstr.getvalue()
        else:
            print(pdfFilenamePath,"Warning: could not extract text from pdf file.")
            return ''

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM