[python] PDF 파일에서 텍스트를 추출하는 방법은 무엇입니까?

PDF 파일에 포함 된 텍스트를 사용하여 추출하려고합니다.Python .

PyPDF2 모듈을 사용하고 있으며 다음 스크립트가 있습니다.

import PyPDF2
pdf_file = open('sample.pdf')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
page = read_pdf.getPage(0)
page_content = page.extractText()
print page_content

코드를 실행하면 PDF 문서에 포함 된 것과 다른 다음 출력이 나타납니다.

!"#$%#$%&%$&'()*%+,-%./01'*23%4
5'%1$#26%3/%7/))/8%&)/26%8#3"%3"*%313/9#&)
%

PDF 문서에서 그대로 텍스트를 추출하려면 어떻게해야합니까?



답변

파이썬 3.x 및 창에 사용할 간단한 솔루션을 찾고있었습니다. 불행히도 textract 에서의 지원이없는 것 같지만 Windows / Python 3에 대한 간단한 솔루션을 찾고 있다면 tika 패키지를 체크 아웃하십시오 .pdf 를 읽는 데 정말 간단합니다.

Tika-Python은 Apache Tika ™ REST 서비스에 대한 Python 바인딩으로, Python 커뮤니티에서 Tika를 기본적으로 호출 할 수 있습니다.

from tika import parser # pip install tika

raw = parser.from_file('sample.pdf')
print(raw['content'])

Tika는 Java로 작성되므로 Java 런타임이 설치되어 있어야합니다.


답변

textract를 사용하십시오.

PDF를 포함하여 많은 유형의 파일을 지원합니다

import textract
text = textract.process("path/to/file.extension")


답변

이 코드를보십시오 :

import PyPDF2
pdf_file = open('sample.pdf', 'rb')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
page = read_pdf.getPage(0)
page_content = page.extractText()
print page_content.encode('utf-8')

출력은 다음과 같습니다.

!"#$%#$%&%$&'()*%+,-%./01'*23%4
5'%1$#26%3/%7/))/8%&)/26%8#3"%3"*%313/9#&)
%

동일한 코드를 사용하여 201308FCR.pdf 에서 PDF를 읽습니다
. 출력은 정상입니다.

문서 는 이유를 설명합니다.

def extractText(self):
    """
    Locate all text drawing commands, in the order they are provided in the
    content stream, and extract the text.  This works well for some PDF
    files, but poorly for others, depending on the generator used.  This will
    be refined in the future.  Do not rely on the order of text coming out of
    this function, as it will change if this function is made more
    sophisticated.
    :return: a unicode string object.
    """


답변

textract (너무 많은 의존성이있는 것처럼 보임)와 pypdf2 (내가 테스트 한 pdf에서 텍스트를 추출 할 수 없음)와 tika (너무 느림) pdftotext를 시도한 후 xpdf에서 이미 사용했습니다 (다른 답변에서 이미 제안 했음). 파이썬에서 바이너리를 직접 호출했습니다 (pdftotext의 경로를 조정해야 할 수도 있습니다).

import os, subprocess
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
args = ["/usr/local/bin/pdftotext",
        '-enc',
        'UTF-8',
        "{}/my-pdf.pdf".format(SCRIPT_DIR),
        '-']
res = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = res.stdout.decode('utf-8')

pdftotext은 기본적으로 동일한 작업을 수행하지만 AWS 람다이를 사용하여 현재 디렉토리에서 사용하고 싶어하고있는 반면이 pdftotext에서 / usr / 지방 / 빈을 가정합니다.

Btw : 람다에서 이것을 사용하려면 바이너리와 의존성을 libstdc++.so람다 함수 에 넣어야합니다 . 개인적으로 xpdf를 컴파일해야했습니다. 이것에 대한 지침 이이 답변을 날려 버릴 수 있으므로 개인 블로그에 넣었습니다 .


답변

pyPDF2에 여러 가지 문제 가있는 것처럼 입증 된 xPDF 및 파생 도구를 사용하여 텍스트를 추출하는 것이 좋습니다. 여전히 텍스트 추출에 가있는 하여 텍스트를 추출 할 수 있습니다.

긴 대답은 텍스트가 PDF 내에서 인코딩되는 방식이 다양하고 PDF 문자열 자체를 디코딩해야 할 수도 있고 CMAP을 사용하여 매핑해야 할 수도 있고 단어와 문자 사이의 거리를 분석해야 할 수도 있다는 것입니다.

PDF가 손상된 경우 (즉, 올바른 텍스트를 표시하지만 복사 할 때 가비지가 발생 함) 실제로 텍스트를 추출해야하는 경우 PDF를 이미지로 변환 ( ImageMagik 사용 ) 한 다음 Tesseract 를 사용 하여 이미지에서 텍스트를 가져 오는 것이 좋습니다 OCR 사용


답변

많은 Python PDF 변환기를 사용해 보았 으며이 검토를 업데이트하고 싶습니다. 티카 는 최고 중 하나입니다. 그러나 PyMuPDF 는 @ehsaneha 사용자로부터 좋은 소식입니다.

https://github.com/erfelipe/PDFtextExtraction 에서 그들을 비교하는 코드를 만들었습니다 .

Tika-Python은 Apache Tika ™ REST 서비스에 대한 Python 바인딩으로, Python 커뮤니티에서 Tika를 기본적으로 호출 할 수 있습니다.

from tika import parser

raw = parser.from_file("///Users/Documents/Textos/Texto1.pdf")
raw = str(raw)

safe_text = raw.encode('utf-8', errors='ignore')

safe_text = str(safe_text).replace("\n", "").replace("\\", "")
print('--- safe text ---' )
print( safe_text )


답변

아래 코드는 Python 3 의 질문에 대한 솔루션 입니다. 코드를 실행하기 전에 PyPDF2환경에 라이브러리를 설치했는지 확인하십시오 . 설치되지 않은 경우 명령 프롬프트를 열고 다음 명령을 실행하십시오.

pip3 install PyPDF2

솔루션 코드 :

import PyPDF2
pdfFileObject = open('sample.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObject)
count = pdfReader.numPages
for i in range(count):
    page = pdfReader.getPage(i)
    print(page.extractText())