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日破砕日油圧破砕流体製品コンポーネント情報開示 ']
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)
インポートするPDFに実際に改行が含まれていることを確認してください。含まれていない場合、p_text.splitlines()
が文字列を分割する場所がありません!特定の文字については、p_text.split("the linebreak character")
を使用できます。
編集:あなたのPDFに基づいて、これを行ごとに分割する方法があるかどうかはわかりません。線形ではなく静的にフォーマットされているように見えるからです。 (テキストは、行ごとではなく、PDF内の位置ごとに配置されます)。
これが私が思いついた関数で、@ 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)
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))
(なぜこれが反対票を投じられたのかわからない場合、このソリューションの実装方法がわからない場合は、最初にコメントセクションで質問してみてください。これがあなたの質問を完全に実行し、有効なソリューションであることを確認しました。)