4

そのため、いくつかの PDF から特定のテキストを取得しようとしています。PDFMiner で Python を使用していますが、2013 年 11 月に API が変更されたため、問題が発生しています。基本的に、PDF から必要なテキストの部分を取得するには、現在、ファイル全体をテキストに変換してから、文字列関数を使用して必要な部分を取得する必要があります。私がやりたいことは、PDF の各ページをループし、それぞれを 1 つずつテキストに変換することです。次に、必要な部分を見つけたら、その PDF の読み取りを停止します。

テキスト エディター atm にあるコードを投稿しますが、これは動作するバージョンではなく、効率的なソリューションの半分に近いバージョンです :P

#!/usr/bin/env python
# -*- coding: utf-8 -*- 

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.pdfdevice import PDFDevice
from pdfminer.converter import LTChar, TextConverter
from pdfminer.layout import LAParams
from subprocess import call
from cStringIO import StringIO
import re
import sys
import os

argNum = len(sys.argv)
pdfLoc = str(sys.argv[1]) #CLI arguments

def convert_pdf_to_txt(path): #converts pdf to raw text (not my function)
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = file(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)

    fp.close()
    device.close()
    str = retstr.getvalue()
    retstr.close()
    return str

if (pdfLoc[-4:] == ".pdf"):
    contents = ""
    try: # Get the outlines (contents) of the document
        fp = open(pdfLoc, 'rb') #open a pdf document for reading
        parser = PDFParser(fp)
        document = PDFDocument(parser)
        outlines = document.get_outlines()
        for (level,title,dest,a,se) in outlines:
            title = re.sub(r".*\s", "", title) #get raw titles, stripped of formatting
            contents += title + "\n"
    except: #if pdfMiner can't get contents then manually get contents from text conversion
        #contents = convert_pdf_to_txt(pdfLoc)
        #startToCpos = contents.find("TABLE OF CONTENTS")
        #endToCpos = contents.rfind(". . .")
        #contents = contents[startToCpos:endToCpos+8]

        fp = open(pdfLoc, 'rb') #open a pdf document for reading
        parser = PDFParser(fp)
        document = PDFDocument(parser)
        pages = PDFPage(document, 3, {'Resources':'thing', 'MediaBox':'Thing'}) #God knows what's going on here
        for pageNumber, page in enumerate(pages.get_pages(PDFDocument, fp)): #The hell is the first argument?
            if pageNumber == 42:
                print "Hello"

        #for line in s:
        #   print line
        #   if (re.search("(\.\s){2,}", line) and not re.search("NOTES|SCOPE", line)):
        #       line = re.sub("(\.\s){2,}", "", line)
        #       line = re.sub("(\s?)*[0-9]*\n", "\n", line)
        #       line = re.sub("^\s", "", line)
        #       print line,


        #contents = contents.lower()
        #contents = re.sub("“", "\"", contents)
        #contents = re.sub("”", "\"", contents)
        #contents = re.sub("fi", "f", contents)
        #contents = re.sub(r"(TABLE OF CONTENTS|LIST OF TABLES|SCOPE|REFERENCED DOCUMENTS|Identification|System (o|O)verview|Document (o|O)verview|Title|Page|Table|Tab)(\n)?|\.\s?|Section|[0-9]", "", contents)
        #contents = re.sub(r"This document contains proprietary information and may not be reproduced in any form whatsoever, nor may be used by or its contents divulged to third\nparties without written permission from the ownerAll rights reservedNumber:  STP SMEDate: -Jul-Issue: A  of CMC STPNHIndustriesCLASSIFICATION\nNATO UNCLASSIFIED                  AGUSTAEUROCOPTEREUROCOPTER DEUTSCHLAND                 FOKKER", "", contents)
        #contents = re.sub(r"(\r?\n){2,}", "", contents)
        #contents = contents.lstrip()
        #contents = contents.rstrip()
    #print contents
else:
    print "Not a valid PDF file"

これは古い方法です(または、少なくとも古い方法でそれを行った方法のアイデア、スレッドは私にとってあまり役に立ちませんでした)。しかし、今では PDFDocument.get_pages の代わりに PDFPage.get_pages を使用する必要があり、メソッドとその引数は完全に異なります。

現在、「Klass」変数が一体何なのかを理解しようとしていますが、これは PDFPage の get_pages メソッドに渡されます

誰かが API のこの部分に光を当てたり、実際の例を提供したりできれば、とても感謝しています。

4

2 に答える 2

1

PyPDF2を使用してみてください。使い方ははるかに簡単で、PDFMiner ほど不必要に機能が豊富ではありません (これはあなたの場合には良いことです)。これがあなたが望んでいたもので、実装は非常に簡単です。

from PyPDF2 import PdfFileReader

PDF = PdfFileReader(file(pdf_fp, 'rb'))

if PDF.isEncrypted:
    decrypt = PDF.decrypt('')
    if decrypt == 0:
        print "Password Protected PDF: " + pdf_fp
        raise Exception("Nope")
    elif decrypt == 1 or decrypt == 2:
        print "Successfully Decrypted PDF"

for page in PDF.pages:
    print page.extractText()
    '''page.extractText() is the unicode string of the contents of the page
    And I am assuming you know how to play with a string and use regex
    If you find what you want just break like so:
    if some_condition == True:
        break'''
于 2014-10-17T18:13:02.080 に答える
0

たぶん私は少し遅れており、あなたはすでにこれを解決していますが、今後の参考のために:

かなりの検索の後、私はこのリンクを思い出しました。そこから、次の部分を指します(太字の関連部分):

Python は、メソッドが属するインスタンスを自動的に渡すが、自動的に受け取らないようにする方法でメソッドを実行することにしました。メソッドの最初のパラメーターは、メソッドが呼び出されるインスタンスです。これにより、メソッドは関数とまったく同じになり、実際の名前を使用するのはあなた次第です(ただし、self は慣例であり、他の何かを使用すると人々は一般的に眉をひそめます)。 self はコードにとって特別なものではありません。別のオブジェクト。

于 2014-03-04T22:30:55.127 に答える