web-dev-qa-db-ja.com

PythonおよびPypdf2を使用してPDFからテキストを抽出する

PythonおよびPYPDFパッケージを使用してPDFファイルからテキストを抽出したい。これは私の pdf ファイルであり、これは私のコードです:

import PyPDF2
opened_pdf = PyPDF2.PdfFileReader('test.pdf', 'rb')

p=opened_pdf.getPage(0)

p_text= p.extractText()
# extract data line by line
P_lines=p_text.splitlines()
print P_lines

私の問題は、P_linesがデータを1行ずつ抽出できず、1つの巨大な文字列になることです。テキストを1行ずつ抽出して分析したい。それを改善する方法について何か提案はありますか?ありがとう!これは、コードが返す文字列です。

[u'29 CFR 1910.1200(i)および付録Dの対象となる化学物質の成分情報は、サプライヤーから入手します。製品安全データシート(MSDS)**情報は濃度の最大可能性に基づいているため、合計が100%を超える可能性があります*総水量源には、淡水、生成水、および/または再生水が含まれる場合があります0.01271%72.00%7732-18-5Water0.00071%4.00%1310-73-2水酸化ナトリウム0.00424%24.00%533-74-4DazomatBiocidePumpcoPlexcide24L0。 00828%75.00%有機ホスホン酸塩0.00276%25.00%67-56-1メチルアルコールスケール阻害剤PumpcoPlexaid 6730.00807%30.00%7732-18-5水0.00188%7.00%ポリエトキシル化アルコール界面活性剤0.00753%28.00%9003-06-9アンモニウム塩0.00941 %35.00%64742-47-8Petroleum DistillateFriction ReducerPumpcoPlexslick 9210.05029%60.00%7732-18-5Water0.03353%40.00%7647-01-0Hydrogen ChlorideHydrochloric AcidPumpcoHCL9.84261%100.00%14808-60-7Crystaline SilicaProppantPumpcoSand90.01 -5WaterCommentsMaximumIngredientConcentrationin HF Fluid(%b y質量)**添加剤の最大成分濃度(質量%)**化学抽象サービス番号(CAS#)成分目的サプライヤー商品名油圧フラクチャリング流体組成:2,608,032総水量(gal)*:7,595真垂直深度(TVD):ガス生産タイプ:NAD27Long/Lat予測:32.558525緯度:-97.215242経度:OleGieserユニットD 6Hウェル名と番号:XTOEnergyOperator名:42-439-35084API番号:TarrantCounty:TexasState:2010年12月10日破砕日油圧破砕流体製品コンポーネント情報開示 ']

ファイルのスクリーンショット: enter image description here

5
Amir
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 = 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)

    text = retstr.getvalue()

    fp.close()
    device.close()
    retstr.close()
    return text
print(convert_pdf_to_txt('test.pdf').strip().split('\n\n'))

出力

水圧破砕流体製品コンポーネント情報の開示

破砕日州:郡:API番号:オペレーター名:井戸名と番号:経度:緯度:長/緯度投影:生産タイプ:真垂直深度(TVD):総水量(gal)*:

2010年12月10日テキサスタラント42-439-35084XTOエナジーオレギーザーユニットD6H -97.215242 32.558525NAD27ガス7,5952,608,032

水圧破砕流体の組成:

商標名

サプライヤー

目的

材料

ケミカルアブストラクトサービス番号

(CAS#)

最大成分

濃度

添加剤(質量)**

コメント

最大成分

濃度

hF流体中(質量)**

ウォーターサンドHCL

Pumpco Pumpco

Proppant塩酸

Plexslick 921

パンプコ

フリクションリデューサー

Plexaid 673

パンプコ

スケール抑制剤

プレキシド24L

パンプコ

殺生物剤

結晶性シリカ

塩化水素水

石油留分アンモニウム塩ポリエトキシル化アルコール界面活性剤水

メチルアルコール有機ホスホン酸塩

ダゾマット水酸化ナトリウム水

7732-18-5 14808-60-7

7647-01-0 7732-18-5

64742-47-8 9003-06-9

7732-18-5

67-56-1

533-74-4 1310-73-2 7732-18-5

100.00 100.00

90.01799 9.84261

40.00 60.00

35.00 28.00 7.00 30.00

25.00 75.00

24.00 4.00 72.00

0.03353 0.05029

0.00941 0.00753 0.00188 0.00807

0.00276 0.00828

0.00424 0.00071 0.01271

  • 総水量源には、淡水、生成水、および/または再生水が含まれる場合があります**情報は濃度の最大可能性に基づいているため、合計が100を超える場合があります

29 CFR 1910.1200(i)および付録Dの対象となる化学物質の成分情報は、サプライヤーから入手します。製品安全データシート(MSDS)

2
SmartManoj

インポートするPDFに実際に改行が含まれていることを確認してください。含まれていない場合、p_text.splitlines()が文字列を分割する場所がありません!特定の文字については、p_text.split("the linebreak character")を使用できます。

編集:あなたのPDFに基づいて、これを行ごとに分割する方法があるかどうかはわかりません。線形ではなく静的にフォーマットされているように見えるからです。 (テキストは、行ごとではなく、PDF内の位置ごとに配置されます)。

0
OldBunny2800

これが私が思いついた関数で、@ SmartManojの回答に完全に基づいていますが、withステートメントを使用して(私の意見では)よりクリーンに更新され、不要な変数(つまり、キーワード引数selfが説明する変数)が削除されています。 )だけでなく、ページのテキストを生成します。

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 pages_as_txt(path) -> Generator[str, None, None]:
    rsrcmgr = PDFResourceManager()
    with StringIO() as retstr, TextConverter(rsrcmgr, retstr, codec='utf-8', laparams=LAParams()) as device:
        interpreter = PDFPageInterpreter(rsrcmgr, device)

        with open(path, 'rb') as fp:
            for page in PDFPage.get_pages(fp, check_extractable=False):
                interpreter.process_page(page)
                yield retstr.getvalue()
                retstr.truncate(0)
                retstr.seek(0)
0
Matt M.

textractは、tesseractメソッドを使用して、python3で正常に機能します。コード例:

import textract
text = textract.process("pdfs/testpdf1.pdf", method='tesseract')
print(text)
with open('textract-results.txt', 'w+') as f:
    f.write(str(text))

(なぜこれが反対票を投じられたのかわからない場合、このソリューションの実装方法がわからない場合は、最初にコメントセクションで質問してみてください。これがあなたの質問を完全に実行し、有効なソリューションであることを確認しました。)

0
jamescampbell