PDF를 텍스트로 변환하는 Python 모듈 [닫기]


385

PDF 파일을 텍스트로 변환하는 파이썬 모듈이 있습니까? pypdf를 사용하는 Activestate에서 발견 된 한 가지 코드를 시도했지만 생성 된 텍스트 사이에 공백이없고 사용되지 않았습니다.


1
비슷한 솔루션을 찾고있었습니다. pdf 파일에서 텍스트를 읽으면됩니다. 이미지가 필요 없습니다. pdfminer는 좋은 선택이지만 텍스트를 추출하는 방법에 대한 간단한 예를 찾지 못했습니다. 마지막 으로이 SO 답변 ( stackoverflow.com/questions/5725278/… )을 얻었 으며 이제는 그것을 사용하고 있습니다.
Nayan

2
질문이 닫혀있어 이후 나는 누군가가 새 응답을 작성하고자하는 경우에는 소프트웨어 권장 사항에 전용 스택 거래소에 그것을 다시 게시 : 파이썬 모듈을 텍스트로 PDF를 변환
프랑크 Dernoncourt을

1
UTF-8 컨텐츠를 위해 나를 위해 일한 유일한 솔루션 : Apache Tika
Shoham

Python, GroupDocs 에서 PDF를 텍스트로 변환하는 데 사용할 수있는 옵션 목록을 업데이트하고 싶습니다. Python 용 변환 클라우드 SDK 는 PDF를 텍스트로 정확하게 변환합니다.
Tilal Ahmad

답변:


142

PDFMiner를 사용해보십시오 . PDF 파일에서 HTML, SGML 또는 "Tagged PDF"형식으로 텍스트를 추출 할 수 있습니다.

태그가있는 PDF 형식이 가장 깔끔한 것으로 보이며 XML 태그를 제거하면 텍스트 만 남습니다.

Python 3 버전은 다음에서 사용할 수 있습니다.


2
방금 pdfminer를 라이브러리로 사용하는 방법을 설명하는 답변을 추가했습니다.
codeape

24
python 3 지원 없음 :(
Karl Adler

1
이 글 에서 내가 제공 한 답변은이 답변을보고 라이브러리 사용법을 궁금해하는 사람들에게 유용 할 수 있습니다. PDFMiner 라이브러리를 사용하여 PDF에서 텍스트를 추출하는 방법에 대한 예를 제공합니다. 문서가 약간 희박하기 때문에 몇 사람에게 도움이 될 것이라고 생각했습니다.
DuckPuncher

17
파이썬 (3)에 대해 여섯 기반 포크가 pypi.python.org/pypi/pdfminer.six
데니스 Cornehl


136

PDFMiner의 이후 패키지가 변경되었습니다 codeape을 기록했다.

편집 (다시) :

PDFMiner가 버전에서 다시 업데이트되었습니다 20100213

다음과 같이 설치 한 버전을 확인할 수 있습니다.

>>> import pdfminer
>>> pdfminer.__version__
'20100213'

다음은 업데이트 된 버전입니다 (변경 / 추가 한 내용에 대한 설명 포함).

def pdf_to_csv(filename):
    from cStringIO import StringIO  #<-- added so you can copy/paste this to try it
    from pdfminer.converter import LTTextItem, TextConverter
    from pdfminer.pdfparser import PDFDocument, PDFParser
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter

    class CsvConverter(TextConverter):
        def __init__(self, *args, **kwargs):
            TextConverter.__init__(self, *args, **kwargs)

        def end_page(self, i):
            from collections import defaultdict
            lines = defaultdict(lambda : {})
            for child in self.cur_item.objs:
                if isinstance(child, LTTextItem):
                    (_,_,x,y) = child.bbox                   #<-- changed
                    line = lines[int(-y)]
                    line[x] = child.text.encode(self.codec)  #<-- changed

            for y in sorted(lines.keys()):
                line = lines[y]
                self.outfp.write(";".join(line[x] for x in sorted(line.keys())))
                self.outfp.write("\n")

    # ... the following part of the code is a remix of the 
    # convert() function in the pdfminer/tools/pdf2text module
    rsrc = PDFResourceManager()
    outfp = StringIO()
    device = CsvConverter(rsrc, outfp, codec="utf-8")  #<-- changed 
        # becuase my test documents are utf-8 (note: utf-8 is the default codec)

    doc = PDFDocument()
    fp = open(filename, 'rb')
    parser = PDFParser(fp)       #<-- changed
    parser.set_document(doc)     #<-- added
    doc.set_parser(parser)       #<-- added
    doc.initialize('')

    interpreter = PDFPageInterpreter(rsrc, device)

    for i, page in enumerate(doc.get_pages()):
        outfp.write("START PAGE %d\n" % i)
        interpreter.process_page(page)
        outfp.write("END PAGE %d\n" % i)

    device.close()
    fp.close()

    return outfp.getvalue()

편집 (다시) :

여기에서 최신 버전 업데이트입니다 pypi는 , 20100619p1. 간단히 말해서 LAParams 인스턴스를 CsvConverter 생성자 로 대체 LTTextItem하여 LTChar전달했습니다.

def pdf_to_csv(filename):
    from cStringIO import StringIO  
    from pdfminer.converter import LTChar, TextConverter    #<-- changed
    from pdfminer.layout import LAParams
    from pdfminer.pdfparser import PDFDocument, PDFParser
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter

    class CsvConverter(TextConverter):
        def __init__(self, *args, **kwargs):
            TextConverter.__init__(self, *args, **kwargs)

        def end_page(self, i):
            from collections import defaultdict
            lines = defaultdict(lambda : {})
            for child in self.cur_item.objs:
                if isinstance(child, LTChar):               #<-- changed
                    (_,_,x,y) = child.bbox                   
                    line = lines[int(-y)]
                    line[x] = child.text.encode(self.codec)

            for y in sorted(lines.keys()):
                line = lines[y]
                self.outfp.write(";".join(line[x] for x in sorted(line.keys())))
                self.outfp.write("\n")

    # ... the following part of the code is a remix of the 
    # convert() function in the pdfminer/tools/pdf2text module
    rsrc = PDFResourceManager()
    outfp = StringIO()
    device = CsvConverter(rsrc, outfp, codec="utf-8", laparams=LAParams())  #<-- changed
        # becuase my test documents are utf-8 (note: utf-8 is the default codec)

    doc = PDFDocument()
    fp = open(filename, 'rb')
    parser = PDFParser(fp)       
    parser.set_document(doc)     
    doc.set_parser(parser)       
    doc.initialize('')

    interpreter = PDFPageInterpreter(rsrc, device)

    for i, page in enumerate(doc.get_pages()):
        outfp.write("START PAGE %d\n" % i)
        if page is not None:
            interpreter.process_page(page)
        outfp.write("END PAGE %d\n" % i)

    device.close()
    fp.close()

    return outfp.getvalue()

편집 (한 번 더) :

버전에 맞게 업데이트되었습니다 20110515(Oeufcoque Penteano 덕분에!) :

def pdf_to_csv(filename):
    from cStringIO import StringIO  
    from pdfminer.converter import LTChar, TextConverter
    from pdfminer.layout import LAParams
    from pdfminer.pdfparser import PDFDocument, PDFParser
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter

    class CsvConverter(TextConverter):
        def __init__(self, *args, **kwargs):
            TextConverter.__init__(self, *args, **kwargs)

        def end_page(self, i):
            from collections import defaultdict
            lines = defaultdict(lambda : {})
            for child in self.cur_item._objs:                #<-- changed
                if isinstance(child, LTChar):
                    (_,_,x,y) = child.bbox                   
                    line = lines[int(-y)]
                    line[x] = child._text.encode(self.codec) #<-- changed

            for y in sorted(lines.keys()):
                line = lines[y]
                self.outfp.write(";".join(line[x] for x in sorted(line.keys())))
                self.outfp.write("\n")

    # ... the following part of the code is a remix of the 
    # convert() function in the pdfminer/tools/pdf2text module
    rsrc = PDFResourceManager()
    outfp = StringIO()
    device = CsvConverter(rsrc, outfp, codec="utf-8", laparams=LAParams())
        # becuase my test documents are utf-8 (note: utf-8 is the default codec)

    doc = PDFDocument()
    fp = open(filename, 'rb')
    parser = PDFParser(fp)       
    parser.set_document(doc)     
    doc.set_parser(parser)       
    doc.initialize('')

    interpreter = PDFPageInterpreter(rsrc, device)

    for i, page in enumerate(doc.get_pages()):
        outfp.write("START PAGE %d\n" % i)
        if page is not None:
            interpreter.process_page(page)
        outfp.write("END PAGE %d\n" % i)

    device.close()
    fp.close()

    return outfp.getvalue()

1
[6]에서 : pdfminer 가져 오기에서 [7] : pdfminer .__ version__ Out [7] : '20100424'에서 [8] : from pdfminer.converter에서 가져 오기 LTTextItem ImportError : LTTextItem 이름을 가져올 수 없습니다. .... LITERALS_DCT_DECODE LTChar LTImage LTPolygon LTTextBox LTContainer LTLine LTRect LTTextGroup LITERAL_DEVICE_RGB LTFigure LTPage LTText LTTextLine
Skylar Saveland

@skyl, 위 코드는 이전 버전 '20100213'용입니다. 그들은 변화처럼 자신의 웹 사이트에 대한 변경 사항 목록에서, 그것은 외모 LTTextItemLTChar. unixuser.org/~euske/python/pdfminer/index.html#changes
tgray

2
@Oeufcoque Penteano, 감사합니다! 20110515귀하의 의견에 따라 버전에 대한 답변에 다른 섹션을 추가했습니다 .
tgray

1
@ user3272884의 답변은 5-1-2014
jmunsch

1
오늘 같은 문제를 해결하고 공백에 대한 정보를 추출하기 위해 tgray의 코드를 약간 수정하여 여기에
tarikki

67

이러한 솔루션에 대해 최신 버전의 PDFMiner를 지원하지 않으므로 PDFMiner를 사용하여 pdf 텍스트를 반환하는 간단한 솔루션을 작성했습니다. 가져 오기 오류가 발생하는 사람들에게 효과적입니다.process_pdf

import sys
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter
from pdfminer.layout import LAParams
from cStringIO import StringIO

def pdfparser(data):

    fp = file(data, 'rb')
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    # Create a PDF interpreter object.
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    # Process each page contained in the document.

    for page in PDFPage.get_pages(fp):
        interpreter.process_page(page)
        data =  retstr.getvalue()

    print data

if __name__ == '__main__':
    pdfparser(sys.argv[1])  

Python 3에서 작동하는 아래 코드를 참조하십시오.

import sys
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter
from pdfminer.layout import LAParams
import io

def pdfparser(data):

    fp = open(data, 'rb')
    rsrcmgr = PDFResourceManager()
    retstr = io.StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    # Create a PDF interpreter object.
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    # Process each page contained in the document.

    for page in PDFPage.get_pages(fp):
        interpreter.process_page(page)
        data =  retstr.getvalue()

    print(data)

if __name__ == '__main__':
    pdfparser(sys.argv[1])  

2
이것은 내가 발견 한 첫 번째 스 니펫이며 실제로 이상한 PDF 파일 (특히 전자 도서는 packtpub에서 얻을 수 있음)과 함께 작동합니다. 다른 모든 코드는 이상하게 인코딩 된 원시 항목을 반환하지만 실제로는 텍스트를 반환합니다. 감사!
somada141

데이터를 얻은 후 retstr.seek (0)을 수행하거나 모든 페이지에서 텍스트를 축적 할 수 있습니다.
Tshirtman

2
와 함께 사용하려면 python3, print명령 뒤에 명백한 괄호 외에 file명령을 패키지로 openStringIOio
바꾸고

1
와. 이 블록은 처음 복사 할 때 완벽하게 작동했습니다. 데이터를 구문 분석하고 수정하고 입력에 스트레스를주지 않아도됩니다.
SecsAndCyber ​​1

1
pdfminer는 python3에서 작동하지 않습니다. 이 코드는 pdfminer3k에 대한 작업을하지 않습니다

47

Pdftotext 파이썬에서 호출 할 수있는 오픈 소스 프로그램 (Xpdf의 일부) (요청한 것이 아니라 유용 할 수 있음). 문제없이 사용했습니다. Google은 Google 데스크톱에서 사용한다고 생각합니다.


6
이것은 -layoutPDF에있는 것과 동일한 위치에 텍스트를 유지 하는 옵션 과 함께 여기에 나열된 도구 중 가장 유용한 것 같습니다 . 이제 PDF의 내용을 PDF로 파이프하는 방법을 알아낼 수 있다면.
Matthew Schinckel

여러 솔루션을 테스트 한 후이 솔루션은 가장 단순하고 강력한 옵션 인 것 같습니다. 출력 파일이 쓰여지는 위치를 지시하기 위해 임시 파일을 사용하여 Python에 의해 쉽게 래핑 될 수 있습니다.
Cerin

Cerin 에서는 '-'를 파일 이름으로 사용하여 출력을 stdout으로 리디렉션하십시오. 이렇게하면 간단한 subprocess.check_output을 사용할 수 있으며이 호출은 내부 함수처럼 느껴집니다.
Ctrl-C

그것을 사용하는 사람을 다시 강화하기 위해. . . pdftotextstdout에서 결과를 보려면 하이픈 인 두 번째 인수가 필요합니다.
Gordon

1
현재 폴더에서 시작하여 모든 PDF 파일을 재귀 적으로 변환합니다. find . -iname "*.pdf" -exec pdftotext -enc UTF-8 -eol unix -raw {} \;기본적으로 생성 된 파일의 .txt확장자 는 원래 이름입니다 .
ccpizza

43

pyPDF 는 잘 작동합니다 (잘 구성된 PDF로 작업하고 있다고 가정). 공백이있는 텍스트 만 있으면 다음을 수행 할 수 있습니다.

import pyPdf
pdf = pyPdf.PdfFileReader(open(filename, "rb"))
for page in pdf.pages:
    print page.extractText()

메타 데이터, 이미지 데이터 등에 쉽게 액세스 할 수 있습니다.

extractText 코드 주석의 주석 :

컨텐츠 스트림에 제공된 순서대로 모든 텍스트 드로잉 명령을 찾고 텍스트를 추출하십시오. 이것은 사용되는 생성기에 따라 일부 PDF 파일에는 적합하지만 다른 PDF 파일에는 적합하지 않습니다. 이것은 앞으로 개선 될 것입니다. 이 기능이 더 정교 해지면 변경 될 것이므로이 기능에서 나오는 텍스트 순서에 의존하지 마십시오.

이것이 문제인지의 여부는 텍스트로 무엇을하고 있는지에 달려 있습니다 (예를 들어 순서가 중요하지 않거나 괜찮거나 생성기가 스트림에 텍스트를 표시되는 순서대로 추가하면 괜찮습니다) . 매일 문제없이 pyPdf 추출 코드가 있습니다.


7
유니 코드 지원 없음 :(
PanosJee

7
pyPdf는 현재 UTF를 지원합니다.
lbolla

2
이 라이브러리는 쓰레기처럼 보입니다. 임의의 PDF에서 테스트하면 "pyPdf.utils.PdfReadError : EOF 마커를 찾을 수 없음"오류가 발생합니다
Cerin

4
질문에서 : 생성 된 텍스트 사이에 공간이 없었고 사용되지 않았습니다 . pyPDF를 사용하고 동일한 결과를 얻었습니다. 텍스트 사이에 공백이 없어 추출됩니다.
Jordan Reiter

page.extractText () 함수를 실행할 때 'TypeError :'bytes '객체를 str으로 암시 적으로 변환 할 수 없습니다'라는 오류가 발생합니다. 어떻게 처리 할 수 ​​있습니까?
juankysmith

21

pdfminer를 라이브러리로 쉽게 사용할 수도 있습니다. pdf의 컨텐츠 모델에 액세스하여 자신 만의 텍스트 추출을 작성할 수 있습니다. 아래 코드를 사용하여 pdf 내용을 세미콜론으로 구분 된 텍스트로 변환하기 위해이 작업을 수행했습니다.

이 함수는 단순히 y 및 x 좌표에 따라 TextItem 내용 객체를 정렬하고 하나의 텍스트 줄과 동일한 y 좌표를 가진 항목을 출력하여 같은 줄의 객체를 ';' 문자.

이 방법을 사용하면 다른 도구로는 더 이상 구문 분석에 적합한 내용을 추출 할 수없는 PDF에서 텍스트를 추출 할 수있었습니다. 내가 시도한 다른 도구로는 pdftotext, ps2ascii 및 온라인 도구 pdftextonline.com이 있습니다.

pdfminer는 pdf- 스크래핑에 매우 유용한 도구입니다.


def pdf_to_csv(filename):
    from pdflib.page import TextItem, TextConverter
    from pdflib.pdfparser import PDFDocument, PDFParser
    from pdflib.pdfinterp import PDFResourceManager, PDFPageInterpreter

    class CsvConverter(TextConverter):
        def __init__(self, *args, **kwargs):
            TextConverter.__init__(self, *args, **kwargs)

        def end_page(self, i):
            from collections import defaultdict
            lines = defaultdict(lambda : {})
            for child in self.cur_item.objs:
                if isinstance(child, TextItem):
                    (_,_,x,y) = child.bbox
                    line = lines[int(-y)]
                    line[x] = child.text

            for y in sorted(lines.keys()):
                line = lines[y]
                self.outfp.write(";".join(line[x] for x in sorted(line.keys())))
                self.outfp.write("\n")

    # ... the following part of the code is a remix of the 
    # convert() function in the pdfminer/tools/pdf2text module
    rsrc = PDFResourceManager()
    outfp = StringIO()
    device = CsvConverter(rsrc, outfp, "ascii")

    doc = PDFDocument()
    fp = open(filename, 'rb')
    parser = PDFParser(doc, fp)
    doc.initialize('')

    interpreter = PDFPageInterpreter(rsrc, device)

    for i, page in enumerate(doc.get_pages()):
        outfp.write("START PAGE %d\n" % i)
        interpreter.process_page(page)
        outfp.write("END PAGE %d\n" % i)

    device.close()
    fp.close()

    return outfp.getvalue()

최신 정보 :

위의 코드는 이전 버전의 API에 대해 작성되었습니다. 아래 내 의견을 참조하십시오.


배우자가 작동하려면 어떤 종류의 플러그인이 필요합니까? pdfminer를 다운로드하여 설치했지만 충분하지 않습니다 ...
kxk

1
위의 코드는 이전 버전의 PDFminer에 대해 작성되었습니다. 최신 버전에서 API가 변경되었습니다 (예 : 패키지가 pdfminer아닌 pdflib). pdf2txt.pyPDFminer 소스 의 소스를 살펴볼 것을 제안합니다. 위의 코드는 해당 파일의 이전 버전에서 영감을 얻은 것입니다.
codeape

17

slate 라이브러리에서 PDFMiner를 사용하는 것이 매우 간단한 프로젝트입니다.

>>> with open('example.pdf') as f:
...    doc = slate.PDF(f)
...
>>> doc
[..., ..., ...]
>>> doc[1]
'Text from page 2...'   

1
"가져 오기 슬레이트"를 실행하는 동안 가져 오기 오류가 발생합니다. {파일 "C : \ Python33 \ lib \ site-packages \ slate-0.3-py3.3.egg \ slate_ init_ .py", 48 행 <모듈> ImportError : 이름 PDF를 가져올 수 없습니다} PDF 클래스가 있습니다! 이 문제를 해결하는 방법을 알고 있습니까?
juankysmith

아니요, 매우 이상하게 들립니다. 종속성이 있습니까?
Tim McNamara

일반적으로 누락 된 종속성에 대한 메시지가 표시됩니다.이 경우 기본 메시지 "슬레이트 파일 가져 오기"C : \ Python33 \ lib \ site-packages \ slate-0.3-py3.3.egg \ slate_ init_ .py ", 48 행 , <module> ImportError : name PDF 이름을 가져올 수 없습니다 "
juankysmith

슬레이트 0.3 이에 따라 pdfminer 20,110,515을 필요 GitHub의 문제
jabbett

6
이 패키지는 더 이상 유지 관리되지 않습니다. 사용하지 마십시오. 파이썬 3.5에서도 사용할 수 없습니다
Sivasubramaniam Arunachalam

9

파이썬 모듈 내에서 특정 PDF를 일반 텍스트로 변환해야했습니다. pdf2txt.py 도구를 읽은 후 PDFMiner 20110515를 사용 했습니다. 이 간단한 스 니펫을 작성했습니다.

from cStringIO import StringIO
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams

def to_txt(pdf_path):
    input_ = file(pdf_path, 'rb')
    output = StringIO()

    manager = PDFResourceManager()
    converter = TextConverter(manager, output, laparams=LAParams())
    process_pdf(manager, converter, input_)

    return output.getvalue() 

1
데프 to_txt (pdf_path) :
Cătălin George Feștilă

특정 페이지 수만 변환하려면이 코드를 어떻게 사용합니까?
psychok7

@ psychok7 pdf2txt 도구를 사용해 보셨습니까? 현재 버전에서 -p 플래그를 사용하여 해당 기능을 지원하는 것 같습니다. 구현이 따르기 쉽고 사용자 정의하기도 쉽습니다. github.com/euske/pdfminer/blob/master/tools/pdf2txt.py 도움이 되길 바랍니다 ! :)
gonz

1
고맙습니다 @ gonz, 위의 모든 시도했지만 귀하의 솔루션은 나에게 완벽한 공간으로 출력됩니다 :)
lazarus

pdf2txt.py는 나를 위해 여기에 설치됩니다 :C:\Python27\Scripts\pdfminer\tools\pdf2txt.py
The Red Pea

6

pdfminer와 함께 제공되는 pdf2txt.py 코드를 용도 변경 pdf에 대한 경로를 취하는 기능을 만들 수 있습니다. 선택적으로 출력 형식 (txt | html | xml | tag)이며 명령 줄 pdf2txt { '-o': '/path/to/outfile.txt'...}와 같이 선택합니다. 기본적으로 다음을 호출 할 수 있습니다.

convert_pdf(path)

파일 시스템에서 원본 pdf와 같은 텍스트 파일이 생성됩니다.

def convert_pdf(path, outtype='txt', opts={}):
    import sys
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter, process_pdf
    from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter, TagExtractor
    from pdfminer.layout import LAParams
    from pdfminer.pdfparser import PDFDocument, PDFParser
    from pdfminer.pdfdevice import PDFDevice
    from pdfminer.cmapdb import CMapDB

    outfile = path[:-3] + outtype
    outdir = '/'.join(path.split('/')[:-1])

    debug = 0
    # input option
    password = ''
    pagenos = set()
    maxpages = 0
    # output option
    codec = 'utf-8'
    pageno = 1
    scale = 1
    showpageno = True
    laparams = LAParams()
    for (k, v) in opts:
        if k == '-d': debug += 1
        elif k == '-p': pagenos.update( int(x)-1 for x in v.split(',') )
        elif k == '-m': maxpages = int(v)
        elif k == '-P': password = v
        elif k == '-o': outfile = v
        elif k == '-n': laparams = None
        elif k == '-A': laparams.all_texts = True
        elif k == '-D': laparams.writing_mode = v
        elif k == '-M': laparams.char_margin = float(v)
        elif k == '-L': laparams.line_margin = float(v)
        elif k == '-W': laparams.word_margin = float(v)
        elif k == '-O': outdir = v
        elif k == '-t': outtype = v
        elif k == '-c': codec = v
        elif k == '-s': scale = float(v)
    #
    CMapDB.debug = debug
    PDFResourceManager.debug = debug
    PDFDocument.debug = debug
    PDFParser.debug = debug
    PDFPageInterpreter.debug = debug
    PDFDevice.debug = debug
    #
    rsrcmgr = PDFResourceManager()
    if not outtype:
        outtype = 'txt'
        if outfile:
            if outfile.endswith('.htm') or outfile.endswith('.html'):
                outtype = 'html'
            elif outfile.endswith('.xml'):
                outtype = 'xml'
            elif outfile.endswith('.tag'):
                outtype = 'tag'
    if outfile:
        outfp = file(outfile, 'w')
    else:
        outfp = sys.stdout
    if outtype == 'txt':
        device = TextConverter(rsrcmgr, outfp, codec=codec, laparams=laparams)
    elif outtype == 'xml':
        device = XMLConverter(rsrcmgr, outfp, codec=codec, laparams=laparams, outdir=outdir)
    elif outtype == 'html':
        device = HTMLConverter(rsrcmgr, outfp, codec=codec, scale=scale, laparams=laparams, outdir=outdir)
    elif outtype == 'tag':
        device = TagExtractor(rsrcmgr, outfp, codec=codec)
    else:
        return usage()

    fp = file(path, 'rb')
    process_pdf(rsrcmgr, device, fp, pagenos, maxpages=maxpages, password=password)
    fp.close()
    device.close()

    outfp.close()
    return

1

PDFminer는 내가 시도한 pdf 파일의 모든 페이지에서 한 줄 [7/1 페이지 ...]을 줄 수도있었습니다.

내가 지금까지 가장 좋은 대답은 pdftoipe 또는 Xpdf를 기반으로하는 C ++ 코드입니다.

pdftoipe의 출력 결과에 대한 내 질문 을 참조하십시오 .



1

나는 인수 pdftohtml와 함께 사용 -xml하고을 사용 하여 결과를 읽습니다 .pdf subprocess.Popen()의 모든 텍스트 조각 의 x 좌표, y 좌표, 너비, 높이 및 글꼴 을 제공합니다. 나는 같은 오류 메시지가 나오기 때문에 아마도 '확실한'것도 아마도 사용하는 것이라고 생각합니다.

컬럼 데이터를 처리해야하는 경우 pdf 파일에 적합한 알고리즘을 발명해야하므로 약간 더 복잡해집니다. 문제는 PDF 파일을 만드는 프로그램이 텍스트를 논리적 형식으로 반드시 배치 할 필요는 없다는 것입니다. 간단한 정렬 알고리즘을 시도해 볼 수 있으며 때때로 작동하지만 생각한 순서대로 배치되지 않은 텍스트 인 '고글 거림'과 '떨림'이 거의 없을 수 있습니다. 따라서 창의력을 발휘해야합니다.

내가 작업하고 있던 pdf 파일 중 하나를 파악하는 데 약 5 시간이 걸렸습니다. 그러나 지금은 잘 작동합니다. 행운을 빕니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.