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


190

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 문서에서 그대로 텍스트를 추출하려면 어떻게해야합니까?


9
나는 그 모듈을 사용한 적이 없지만 바이너리 모드에서 파일을 열면 차이가 pdf_file = open('sample.pdf', 'rb')있습니까?
PM 2Ring

2
답장을 보내 주셔서 감사합니다. 바이너리 모드로 시도했지만 아무것도 바뀌지 않았습니다
단순성

3
가능한 경우 Adobe의 표준 Acrobat Reader 인 우수한 PDF 뷰어를 사용하여 텍스트를 복사하십시오. 같은 결과를 얻습니까? 차이점은 텍스트 가 다르다는 것이 아니라 글꼴 이 다릅니다 -문자 코드는 다른 값에 매핑됩니다. 모든 PDF에이를 복원하기위한 올바른 데이터가있는 것은 아닙니다.
usr2564301

2
이 PDF에는 문자 CMap 테이블이 포함되어 있으므로이 스레드에서 설명하는 제한 사항과 해결 방법은 관련이 있습니다. - stackoverflow.com /questions/4203414/ …
난쟁이

2
PDF에는 실제로 올바른 CMAP이 포함되어 있으므로 임시 문자 매핑을 일반 텍스트로 변환하는 것이 쉽지 않습니다. 그러나 올바른 텍스트 순서 를 검색하려면 추가 처리가 필요 합니다. Mac OS X의 Quartz PDF 렌더러는 불쾌한 작업입니다! 원래의 렌더링 순서에서 "m T'h iuss iisn ga tosam fopllloew DalFo dnogc wumithe ntht eI tutorial"을 얻었습니다. x 좌표로 정렬 한 후에야 훨씬 더 정확한 결과를 얻을 수 있습니다. "이것은 샘플 PDF 문서입니다. '튜토리얼과 함께 사용하고 있습니다'.
usr2564301

답변:


199

파이썬 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 런타임이 설치되어 있어야합니다.


17
pypdf2, tika를 테스트하고 textract 및 pdftotext를 설치하지 못했습니다. Pypdf2는 99 단어를 반환했지만 tika는 테스트 송장에서 858 단어를 모두 반환했습니다. 그래서 나는 tika와 함께 갔다.
Stian

8
사랑해. 왜 그런 좋은 대답이 StackOverflow에 숨겨져 있는지 모르겠습니다. 누구나 PyPDF2 또는 pdfminer를 사용해야한다고 언급하지만 악취가납니다. 나는 지금 tika와 사랑에 빠졌다
jxpython

15
"런타임 오류 : Tika 서버를 시작할 수 없습니다"오류가 계속 발생합니다.
Nav

3
답변 평생 동안 검색을 해왔는데 왜 다른 사람이 Tika를 추천하지 않습니까? 감사!
Jacob-Jan Mosselman

4
디렉토리의 모든 PDF 파일에서 (재귀 적으로) 이것을 실행해야하는 경우이 스크립트를 사용하십시오
Hope

58

textract를 사용하십시오.

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

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

24
Textwrap은 훌륭한 래퍼 인 것처럼 보이지만 주어진 시스템에서 쉽게 사용할 수없는 많은 비 Python 유틸리티에 의존합니다.
David Brown

1
PDF, epub 등에서 작동-PDFMiner조차도 실패한 PDF를 처리합니다.
울 라드 카사 흐

aws lambda에서 사용하는 방법, 나는 이것을 시도했지만 수입 오류는 textract에서 발생했습니다
Arun Kumar

5
textract에 대한 래퍼입니다 Poppler:pdftotext.
onewhaleid

1
@ArunKumar : AWS Lambda에서 기본 제공되지 않는 항목을 사용하려면 번들과 함께 모든 추가 종속성을 포함시켜야합니다.
Jeff Learman 2016

51

이 코드를보십시오 :

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.
    """

@VineeshTP : page_content에 대한 내용이 있습니까? 그렇다면 (utf-8) 이외의 다른 인코딩을 사용하여 도움이되는지 확인하십시오
Quinn

파이썬을 사용하여 PDF를 읽는 데 가장 적합한 라이브러리는 'tika'입니다
Vineesh TP

201308FCR.pdf를 찾을 수 없습니다.
Chaitanya Bapat

30

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를 컴파일해야했습니다. 이것에 대한 지침 이이 답변을 날려 버릴 수 있으므로 개인 블로그에 넣었습니다 .


4
세상에, 작동합니다 !! 마지막으로 올바른 순서로 텍스트를 추출하는 솔루션! 이 답변에 대해 포옹하고 싶습니다! (또는 포옹을 좋아하지 않는다면 여기에 가상 커피 / 맥주 / ...가 있습니다)
DonQuiKong

4
도움이됐다 니 다행입니다! 공감은 포옹과 같은 느낌을주기 때문에 괜찮습니다!
hansaplast

상자 생각에서 간단 ... gr8!
shantanu pathak

10

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

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

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


-1은 OP가 파이썬에서 pdf를 읽을 것을 요구하고 있기 때문에 파이썬에 대한 xpdf 래퍼가 있지만 유지 관리가 잘되지 않습니다.
cduguet '12

9

많은 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 )

3
특별히 감사합니다.encode('utf-8', errors='ignore')
Evgeny

AttributeError : 'os'모듈에 'setsid'속성이 없습니다.
keramat

7

아래 코드는 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())

2
모든 내용을 하나의 텍스트 파일로 저장하고 추가 분석에 사용하는 방법
Rahul Agarwal

7
실제 질문에서 언급 한 문제는 해결되지 않습니다.
Soumik Rakshit

7

경우에 따라 PyPDF2는 공백을 무시하고 결과 텍스트를 엉망으로 만들지 만 PyMuPDF를 사용 하며 자세한 내용을 보려면 이 링크 를 사용할 수 있다고 확신합니다.


pymupdf는 제가 관찰 한 최고의 솔루션입니다. pdftotext 또는 tika와 같은 Java와 같은 추가 C ++ 라이브러리가 필요하지 않습니다
Kay

pymypdf는 실제로 최상의 솔루션이며 추가 서버 또는 라이브러리가 없으며 PyPDF2 PypDF3 PyPDF4가 빈 텍스트 문자열을 검색하는 파일과 함께 작동합니다. 많은 감사합니다!
Andrea Bisello

pymupdf를 설치하려면을 실행하십시오 pip install pymupdf==1.16.16. 최신 버전 (17)이 작동하지 않으므로이 특정 버전을 사용하십시오. 새 줄 char에서 텍스트 줄 바꿈 필드를 추출하기 때문에 pymupdf를 선택했습니다 \n. 그래서 pdf에서 pymupdf가있는 문자열로 텍스트를 추출한 다음 텍스트를 my_extracted_text.splitlines()줄로 나눠 목록으로 가져옵니다.
erickfis

PyMuPDF는 정말 놀랍습니다. 감사.
erfelipe

6

pdftotext 는 가장 좋고 가장 간단한 것입니다! pdftotext는 또한 구조를 예약합니다.

PyPDF2, PDFMiner 및 기타 몇 가지를 시도했지만 그중 어느 것도 만족스러운 결과를 얻지 못했습니다.


pdf2text를 설치할 때 다음과 같은 메시지가 표시 되므로이 Collecting PDFMiner (from pdf2text)답변을 이해할 수 없습니다.
zhy

pdf2text와 pdftotext는 다릅니다. 답변에서 링크를 사용할 수 있습니다.
Dharam

확인. 약간 혼란 스럽습니다.
zhy


5

아래 코드를 사용하여 개별 페이지 번호를 인수로 제공하는 대신 여러 페이지로 된 PDF를 한 번에 텍스트로 추출 할 수 있습니다.

import PyPDF2
import collections
pdf_file = open('samples.pdf', 'rb')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
c = collections.Counter(range(number_of_pages))
for i in c:
   page = read_pdf.getPage(i)
   page_content = page.extractText()
   print page_content.encode('utf-8')

유일한 문제는 여기에 새로운 페이지의 내용이 마지막을 덮어 씁니다
라훌 아가 왈에게

3

텍스트를 추출하는 가장 간단한 코드는 다음과 같습니다.

암호:

# importing required modules
import PyPDF2

# creating a pdf file object
pdfFileObj = open('filename.pdf', 'rb')

# creating a pdf reader object
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

# printing number of pages in pdf file
print(pdfReader.numPages)

# creating a page object
pageObj = pdfReader.getPage(5)

# extracting text from page
print(pageObj.extractText())

# closing the pdf file object
pdfFileObj.close()

'티카'Recomending
Vineesh TP

2

여기에서 해결책을 찾았습니다 .PDFLayoutTextStripper

원본 PDF의 레이아웃을 유지할 수 있기 때문에 좋습니다 .

Java로 작성되었지만 Python을 지원하기 위해 게이트웨이를 추가했습니다.

샘플 코드 :

from py4j.java_gateway import JavaGateway

gw = JavaGateway()
result = gw.entry_point.strip('samples/bus.pdf')

# result is a dict of {
#   'success': 'true' or 'false',
#   'payload': pdf file content if 'success' is 'true'
#   'error': error message if 'success' is 'false'
# }

print result['payload']

PDFLayoutTextStripper의 샘플 출력 : 여기에 이미지 설명을 입력하십시오

자세한 내용은 여기 스트리퍼 (파이썬 포함)


2

OCR보다 더 나은 해결 방법이 있으며 PDF에서 텍스트를 추출하는 동안 페이지 정렬을 유지합니다. 도움이되어야합니다 :

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO

def convert_pdf_to_txt(path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = open(path, 'rb')
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos=set()


    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
        interpreter.process_page(page)


    text = retstr.getvalue()

    fp.close()
    device.close()
    retstr.close()
    return text

text= convert_pdf_to_txt('test.pdf')
print(text)

Nb. 최신 버전은 더 이상 codecarg를 사용하지 않습니다 . 나는 이것을 제거함으로써 이것을 device = TextConverter(rsrcmgr, retstr, laparams=laparams)
고쳤다.

1

PDF에서 텍스트를 추출하려면 아래 코드를 사용하십시오.

import PyPDF2
pdfFileObj = open('mypdf.pdf', 'rb')

pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

print(pdfReader.numPages)

pageObj = pdfReader.getPage(0)

a = pageObj.extractText()

print(a)

0

이것을 달성하기 위해 코드를 추가하고 있습니다 : 그것은 나를 위해 잘 작동합니다 :

# This works in python 3
# required python packages
# tabula-py==1.0.0
# PyPDF2==1.26.0
# Pillow==4.0.0
# pdfminer.six==20170720

import os
import shutil
import warnings
from io import StringIO

import requests
import tabula
from PIL import Image
from PyPDF2 import PdfFileWriter, PdfFileReader
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage

warnings.filterwarnings("ignore")


def download_file(url):
    local_filename = url.split('/')[-1]
    local_filename = local_filename.replace("%20", "_")
    r = requests.get(url, stream=True)
    print(r)
    with open(local_filename, 'wb') as f:
        shutil.copyfileobj(r.raw, f)

    return local_filename


class PDFExtractor():
    def __init__(self, url):
        self.url = url

    # Downloading File in local
    def break_pdf(self, filename, start_page=-1, end_page=-1):
        pdf_reader = PdfFileReader(open(filename, "rb"))
        # Reading each pdf one by one
        total_pages = pdf_reader.numPages
        if start_page == -1:
            start_page = 0
        elif start_page < 1 or start_page > total_pages:
            return "Start Page Selection Is Wrong"
        else:
            start_page = start_page - 1

        if end_page == -1:
            end_page = total_pages
        elif end_page < 1 or end_page > total_pages - 1:
            return "End Page Selection Is Wrong"
        else:
            end_page = end_page

        for i in range(start_page, end_page):
            output = PdfFileWriter()
            output.addPage(pdf_reader.getPage(i))
            with open(str(i + 1) + "_" + filename, "wb") as outputStream:
                output.write(outputStream)

    def extract_text_algo_1(self, file):
        pdf_reader = PdfFileReader(open(file, 'rb'))
        # creating a page object
        pageObj = pdf_reader.getPage(0)

        # extracting extract_text from page
        text = pageObj.extractText()
        text = text.replace("\n", "").replace("\t", "")
        return text

    def extract_text_algo_2(self, file):
        pdfResourceManager = PDFResourceManager()
        retstr = StringIO()
        la_params = LAParams()
        device = TextConverter(pdfResourceManager, retstr, codec='utf-8', laparams=la_params)
        fp = open(file, 'rb')
        interpreter = PDFPageInterpreter(pdfResourceManager, device)
        password = ""
        max_pages = 0
        caching = True
        page_num = set()

        for page in PDFPage.get_pages(fp, page_num, maxpages=max_pages, password=password, caching=caching,
                                      check_extractable=True):
            interpreter.process_page(page)

        text = retstr.getvalue()
        text = text.replace("\t", "").replace("\n", "")

        fp.close()
        device.close()
        retstr.close()
        return text

    def extract_text(self, file):
        text1 = self.extract_text_algo_1(file)
        text2 = self.extract_text_algo_2(file)

        if len(text2) > len(str(text1)):
            return text2
        else:
            return text1

    def extarct_table(self, file):

        # Read pdf into DataFrame
        try:
            df = tabula.read_pdf(file, output_format="csv")
        except:
            print("Error Reading Table")
            return

        print("\nPrinting Table Content: \n", df)
        print("\nDone Printing Table Content\n")

    def tiff_header_for_CCITT(self, width, height, img_size, CCITT_group=4):
        tiff_header_struct = '<' + '2s' + 'h' + 'l' + 'h' + 'hhll' * 8 + 'h'
        return struct.pack(tiff_header_struct,
                           b'II',  # Byte order indication: Little indian
                           42,  # Version number (always 42)
                           8,  # Offset to first IFD
                           8,  # Number of tags in IFD
                           256, 4, 1, width,  # ImageWidth, LONG, 1, width
                           257, 4, 1, height,  # ImageLength, LONG, 1, lenght
                           258, 3, 1, 1,  # BitsPerSample, SHORT, 1, 1
                           259, 3, 1, CCITT_group,  # Compression, SHORT, 1, 4 = CCITT Group 4 fax encoding
                           262, 3, 1, 0,  # Threshholding, SHORT, 1, 0 = WhiteIsZero
                           273, 4, 1, struct.calcsize(tiff_header_struct),  # StripOffsets, LONG, 1, len of header
                           278, 4, 1, height,  # RowsPerStrip, LONG, 1, lenght
                           279, 4, 1, img_size,  # StripByteCounts, LONG, 1, size of extract_image
                           0  # last IFD
                           )

    def extract_image(self, filename):
        number = 1
        pdf_reader = PdfFileReader(open(filename, 'rb'))

        for i in range(0, pdf_reader.numPages):

            page = pdf_reader.getPage(i)

            try:
                xObject = page['/Resources']['/XObject'].getObject()
            except:
                print("No XObject Found")
                return

            for obj in xObject:

                try:

                    if xObject[obj]['/Subtype'] == '/Image':
                        size = (xObject[obj]['/Width'], xObject[obj]['/Height'])
                        data = xObject[obj]._data
                        if xObject[obj]['/ColorSpace'] == '/DeviceRGB':
                            mode = "RGB"
                        else:
                            mode = "P"

                        image_name = filename.split(".")[0] + str(number)

                        print(xObject[obj]['/Filter'])

                        if xObject[obj]['/Filter'] == '/FlateDecode':
                            data = xObject[obj].getData()
                            img = Image.frombytes(mode, size, data)
                            img.save(image_name + "_Flate.png")
                            # save_to_s3(imagename + "_Flate.png")
                            print("Image_Saved")

                            number += 1
                        elif xObject[obj]['/Filter'] == '/DCTDecode':
                            img = open(image_name + "_DCT.jpg", "wb")
                            img.write(data)
                            # save_to_s3(imagename + "_DCT.jpg")
                            img.close()
                            number += 1
                        elif xObject[obj]['/Filter'] == '/JPXDecode':
                            img = open(image_name + "_JPX.jp2", "wb")
                            img.write(data)
                            # save_to_s3(imagename + "_JPX.jp2")
                            img.close()
                            number += 1
                        elif xObject[obj]['/Filter'] == '/CCITTFaxDecode':
                            if xObject[obj]['/DecodeParms']['/K'] == -1:
                                CCITT_group = 4
                            else:
                                CCITT_group = 3
                            width = xObject[obj]['/Width']
                            height = xObject[obj]['/Height']
                            data = xObject[obj]._data  # sorry, getData() does not work for CCITTFaxDecode
                            img_size = len(data)
                            tiff_header = self.tiff_header_for_CCITT(width, height, img_size, CCITT_group)
                            img_name = image_name + '_CCITT.tiff'
                            with open(img_name, 'wb') as img_file:
                                img_file.write(tiff_header + data)

                            # save_to_s3(img_name)
                            number += 1
                except:
                    continue

        return number

    def read_pages(self, start_page=-1, end_page=-1):

        # Downloading file locally
        downloaded_file = download_file(self.url)
        print(downloaded_file)

        # breaking PDF into number of pages in diff pdf files
        self.break_pdf(downloaded_file, start_page, end_page)

        # creating a pdf reader object
        pdf_reader = PdfFileReader(open(downloaded_file, 'rb'))

        # Reading each pdf one by one
        total_pages = pdf_reader.numPages

        if start_page == -1:
            start_page = 0
        elif start_page < 1 or start_page > total_pages:
            return "Start Page Selection Is Wrong"
        else:
            start_page = start_page - 1

        if end_page == -1:
            end_page = total_pages
        elif end_page < 1 or end_page > total_pages - 1:
            return "End Page Selection Is Wrong"
        else:
            end_page = end_page

        for i in range(start_page, end_page):
            # creating a page based filename
            file = str(i + 1) + "_" + downloaded_file

            print("\nStarting to Read Page: ", i + 1, "\n -----------===-------------")

            file_text = self.extract_text(file)
            print(file_text)
            self.extract_image(file)

            self.extarct_table(file)
            os.remove(file)
            print("Stopped Reading Page: ", i + 1, "\n -----------===-------------")

        os.remove(downloaded_file)


# I have tested on these 3 pdf files
# url = "http://s3.amazonaws.com/NLP_Project/Original_Documents/Healthcare-January-2017.pdf"
url = "http://s3.amazonaws.com/NLP_Project/Original_Documents/Sample_Test.pdf"
# url = "http://s3.amazonaws.com/NLP_Project/Original_Documents/Sazerac_FS_2017_06_30%20Annual.pdf"
# creating the instance of class
pdf_extractor = PDFExtractor(url)

# Getting desired data out
pdf_extractor.read_pages(15, 23)

0

여기 에서 tika-app-xxx.jar (latest)를 다운로드 할 수 있습니다 .

그런 다음이 .jar 파일을 파이썬 스크립트 파일의 동일한 폴더에 넣으십시오.

그런 다음 스크립트에 다음 코드를 삽입하십시오.

import os
import os.path

tika_dir=os.path.join(os.path.dirname(__file__),'<tika-app-xxx>.jar')

def extract_pdf(source_pdf:str,target_txt:str):
    os.system('java -jar '+tika_dir+' -t {} > {}'.format(source_pdf,target_txt))

이 방법의 장점 :

더 적은 의존성. 단일 .jar 파일은 해당 파이썬 패키지를 관리하기가 더 쉽습니다.

다중 형식 지원. 위치 source_pdf는 모든 종류의 문서 디렉토리가 될 수 있습니다. (.doc, .html, .odt 등)

최신 정보. tika-app.jar은 항상 관련 버전의 tika python 패키지보다 먼저 릴리스됩니다.

안정된. PyPDF보다 훨씬 안정적이고 잘 관리되어 있습니다 (Apache 제공).

불리:

jre-headless가 필요합니다.


완전히 pythonic 솔루션이 아닙니다. 이것을 추천한다면, 파이썬 패키지를 만들어 사람들에게 가져와야합니다. 파이썬에서 Java 코드의 명령 행 실행을 사용하지 않는 것이 좋습니다.
Michael Tamillow

@MichaelTamillow, pypi에 업로드 될 코드를 작성하면 좋은 생각이 아니라는 것을 인정합니다. 그러나 임시 사용을 위해 shebang이있는 파이썬 스크립트 인 경우 나쁘지 않습니까?
pah8J

글쎄, 그 질문의 제목은 "python"이 아니기 때문에 "여기에 Java 로하는 방법이 있습니다"라고 말하는 것이 이것보다 더 수용 가능하다고 생각합니다. 기술적으로 파이썬에서 원하는 모든 것을 할 수 있습니다. 그것이 굉장하고 끔찍한 이유입니다. 임시 사용법은 나쁜 습관입니다.
Michael Tamillow

0

Windows의 Anaconda에서 시도하면 PyPDF2가 비표준 구조 또는 유니 코드 문자가있는 일부 PDF를 처리하지 못할 수 있습니다. 많은 pdf 파일을 열고 읽어야 할 경우 다음 코드를 사용하는 것이 좋습니다. 상대 경로 .//pdfs//가있는 폴더의 모든 pdf 파일의 텍스트가 목록에 저장됩니다 pdf_text_list.

from tika import parser
import glob

def read_pdf(filename):
    text = parser.from_file(filename)
    return(text)


all_files = glob.glob(".\\pdfs\\*.pdf")
pdf_text_list=[]
for i,file in enumerate(all_files):
    text=read_pdf(file)
    pdf_text_list.append(text['content'])

print(pdf_text_list)

-1

PyPDF2는 작동하지만 결과는 다를 수 있습니다. 결과 추출에서 일관되지 않은 결과가 나타납니다.

reader=PyPDF2.pdf.PdfFileReader(self._path)
eachPageText=[]
for i in range(0,reader.getNumPages()):
    pageText=reader.getPage(i).extractText()
    print(pageText)
    eachPageText.append(pageText)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.