C#とPythonはPDFを読みます

サードパーティのライブラリを使用して、C#がpdfbox:

システムを使用しました。
System.Collections.Genericを使用しました。
System.Linqのを使用しました。
System.Textのを使用しました。
System.Threading.Tasksを使用しました。
System.IOを使用しました。
org.apache.pdfbox.pdmodelを使用しました。
org.apache.pdfbox.util使用;
名前空間ReadPDF
{
    クラスプログラム
    {
        静的な無効メイン(文字列[] args)
        {
            文字列パス= String.Formatの(Environment.CurrentDirectory + "/path/Export_001397_32251.pdf")。
            Console.WriteLineを(PDF2TXT(パス))。
            Console.ReadKey();
        }
        パブリック静的文字列PDF2TXT(文字列パス)
        {
            PDDocumentドキュメント= NULL;
            試す
            {
                 DOC = PDDocument.load(パス)。
                 PDFTextStripperストリッパー=新しいPDFTextStripper();
                 stripper.getText(DOC)を返します。
            }
            最後に
            {
                IF(!DOC = NULL)
                {
                    doc.close()。
                }
            }
        }
    }
}
参考住所:のhttp://www.squarepdf.net/how-to-convert-pdf-to-text-in-net-vb
 
pdflumberやPython pdfmineを使用します
 
 
pdfplumberインポート
再インポート

パス= 'パス/ test.pdfという'
PDF = pdfplumber.open(パス)

:でpdf.pagesページのための
印刷(page.extract_text())
page.extract_tablesでpdf_table用():
表= []
細胞= []
pdf_tableの行のための:
IFいない(行):
行全体が空の場合#は、レコードの終了とみなす
もしあれば(細胞):
table.append(細胞)
細胞= []
のelifすべて(行):
#行全体が空でない場合、次いで、一方の端部に新しい行については、この節、
もしあれば(細胞):
table.append(細胞)
細胞= []
table.append(行)
他:
もしLEN(セル)== 0:
細胞=行
他:
範囲(LEN(行))におけるiについて:
:行[i]がNoneでない場合は
細胞[I] =行[I [I]なし他の細胞の細胞である場合] [i]は+行[i]は
テーブル内の行のために:
プリント([re.sub(「\ S +」、「」、細胞)細胞は、細胞のためなし他なしででない場合行])

pdf.close()



輸入SYSの
輸入OS
binascii輸入b2a_hexから
###
### PDF-鉱夫の要件
###

pdfminer.pdfparserインポートPDFParserから
pdfminer.pdfdocument輸入PDFDocumentから、PDFNoOutlines
pdfminer.pdfpageインポートPDFPageから
pdfminer.pdfinterpインポートPDFResourceManagerから、PDFPageInterpreter
からpdfminer.converterインポートPDFPageAggregator
pdfminer.layoutインポートLAParamsから、LTTextBox、LTTextLine、LTFigure、LTImage、LTChar

デフwith_pdf(pdf_doc、FN、pdf_pwd、*引数):
"" "PDF文書を開き、関数を適用、結果を返します「」」
結果=なし
試み:
#はPDFファイルを開く
FP =オープン(pdf_doc 'RB ')
#は、ファイルオブジェクトに関連付けられたパーサオブジェクトを作成
パーサー= PDFParser(FP)
文書構造記憶PDFDocumentオブジェクト作成位
= PDFDocument(パーサ、pdf_pwd)DOC
#パーサーとドキュメントオブジェクト接続
parser.set_document(DOC)
供給初期設定のパスワード
doc.is_extractable場合:
#は関数を適用し、結果を返します
(* argsを、DOC)結果= FNを
#は、PDFファイルのクローズ
fp.close()
例外IOErrorを除い
#ファイルが存在しないか、同様の問題の
パス
リターンを結果
###
目次###表
###

DEF _parse_toc(DOC):
「」「オープンPDFDocumentオブジェクトには、コンテンツ(TOC)データのテーブルを取得
[これはwith_pdfに渡される高次関数です()]」 ""
TOC = []
試してください
(=のdoc.get_outlinesを概説)
(レベル、タイトル、DEST、SE)のための輪郭で:
toc.append((レベル、タイトル))
PDFNoOutlines以外は:
通過
返すTOC
DEF get_toc(pdf_doc 、pdf_pwdは= ''):
"" "" "このpdfファイルのために、もしあれば、コンテンツ(TOC)のテーブルを返す"
)を返すwith_pdf(pdf_doc、_parse_toc、pdf_pwdを
###
###画像を抽出
###
デフWRITE_FILE(フォルダ、ファイル名、FILEDATA、フラグ=「W」):
「」 "フォルダとファイル名の組み合わせにファイルデータ書き込み
(フラグ:書き込みバイナリ、使用するために、書き込み、テキストのための『W』と『wb』『』代わりに)APPENDための'W' ""」の
結果= Falseの
場合os.path.isdir(フォルダ):
試してみてください。
file_obj =オープン(os.path.join(フォルダ、ファイル名)、フラグ)
file_obj.write(FILEDATA)
file_obj .close()
結果=真
例外IOErrorを除く:
合格
リターン結果を
DEF(stream_first_4_bytes)をdetermine_image_type:
""」最初の4(または2)「バイト」」のマジックナンバーの比較に基づいて、画像ファイルの種類を知ります
FILE_TYPE =なし
bytes_as_hex = b2a_hex(stream_first_4_bytes)
bytes_as_hex.startswith場合( 'FFD8'):
FILE_TYPE = '.JPEG'
ELIFのbytes_as_hex == '89504e47':
FILE_TYPE = '' .pngの
elifのbytes_as_hex == 'は47494638':
FILE_TYPE = ' '.GIF
(424D '):bytes_as_hex.startswithのelif'
FILE_TYPE =' .bmpの」
戻るFILE_TYPE

DEF save_image(lt_image、PAGE_NUMBER、images_folder):
"" "このLTImageオブジェクトから画像データを保存しようとすると、ファイル名を返します、成功した""」であれば
、結果=なし
の場合lt_image.stream:
file_stream = lt_image.stream。get_rawdata()
file_stream場合:
file_ext = determine_image_type(file_stream [0:4])
場合file_ext:
FILE_NAME = '' .join([STR(PAGE_NUMBER)、 '_'、lt_image.name、file_ext])
場合WRITE_FILE(images_folder、FILE_NAME、file_stream、フラグ=」 WB '):
結果= FILE_NAMEの
リターン結果


###
###抽出本文
###

DEF to_bytestring(S、ENC =' UTF-8' ):
"" "、バイト文字列に付与されたUnicode文字列を変換し、標準的な符号化を使用して、
それはすでにバイト文字列""」でない限り
sの場合:
:でisinstance(S、STR)であれば
、リターンの
他:
戻りs.encode(ENC)

DEF update_page_text_hash(H、lt_obj、PCT = 0.2):
"" " "ハッシュ内の関連テキストのリストを生成するために、PCT%以内バウンディングボックスのX0、X1値を使用する""

X0 = lt_obj.bbox [0]
X1 = lt_obj.bbox [2]

key_found = Falseの
kについて、h.items()におけるV:
hash_x0 = K [0]
であれば、X0> =(hash_x0×(1.0-PCT))及び(hash_x0×(1.0 + PCT))> = X0:
hash_x1 = K [1]
であれば、X1> =(hash_x1×(1.0-PCT))及び(hash_x1×(1.0 + PCT))> = X1:
は、このLTの*オブジェクト内のテキストが同じに配置した
として#幅テキストの前シリーズ、それが一緒に属しているので、
key_found = Trueの
v.append(to_bytestring(lt_obj。GET_TEXT()))
H [k]は、Vが=
key_foundない場合:
#テキストは、幅に基づいて、新たなシリーズであり、
それはそれ自身のシリーズ(ハッシュのエントリー)を取得#ように
時間[(X0、X1)を] = [to_bytestring(lt_obj。 GET_TEXT())]
戻り時間

デフparse_lt_objs(lt_objs、PAGE_NUMBER、images_folder、テキスト= []):
"" "LT *オブジェクトのリストを反復し、それぞれに含まれるテキストまたは画像データキャプチャ" ""
TEXT_CONTENT =を[]

BBOX、V =そのバウンディングボックスの幅(物理列)内のテキスト文字列のリストのpage_text = {}#kは=(X0、X1)
:lt_objsでlt_objための
場合でisinstance(lt_obj、LTTextBox)またはでisinstance(lt_obj、LTTextLine)。
#テキスト、その論理的にその列幅に基づいて手配
page_text = update_page_text_hash(page_text、lt_obj)
ELIFでisinstance(lt_obj、LTImage):
イメージなので、指定したフォルダに保存して、テキスト内のその場所に注意
saved_file = save_image(lt_obj、PAGE_NUMBER、images_folder)を
saved_file場合:
#使用テキスト内の画像の位置をマークするためのHTMLスタイルの<img />タグ
text_content.append( '<IMG SRC = " '+ os.path.join(images_folder、saved_file)+'" />')
他:
プリント> > sys.stderrを持ち、 "ページ上の画像の保存中にエラー"、PAGE_NUMBER、lt_obj .__ repr__
のelifでisinstance(lt_obj、LTFigure):
#LTFigureオブジェクトが他のLT *オブジェクトのコンテナであるので、子供を介して再帰的
text_content.append(parse_lt_objs(lt_obj、PAGE_NUMBER、images_folder、TEXT_CONTENT))

におけるk、Vについて選別([(キー、値)(キー、値) page_text.items()])において、
#は、ソートキー(X0、バウンディングボックスのX1値)によってpage_textハッシュ
トップダウンを生成する#は、左から右への関連列の配列
text_content.append(「」 .join(V))

のリターン「\ n'.join(TEXT_CONTENT)


###
###処理ページ
###

デフ_parse_pages(DOC、images_folder):
""は、 "オープンPDFDocumentオブジェクトを使用すると、ページを取得し、それぞれを解析します1
【このwith_pdfに渡される高次関数である()] ""」
rsrcmgr = PDFResourceManager()
laparams = LAParams()
デバイス= PDFPageAggregator(rsrcmgr、laparams = laparams)
インタプリタ= PDFPageInterpreter(rsrcmgr、デバイス)

TEXT_CONTENT = [ ]
iに対する、列挙内のページ(PDFPage.create_pages(DOC)):
interpreter.process_page(ページ)
#このページのためLTPageオブジェクトを受け取る
レイアウト= device.get_result()
レイアウトLTTextBoxような子オブジェクトを含むことができるLTPageオブジェクトであります、LTFigure、LTImage等
text_content.append(parse_lt_objs(レイアウト、(I + 1)、images_folder))

戻りTEXT_CONTENT

デフget_pages(pdf_doc、pdf_pwd =「」、images_folder =「/ tmp」の):
「」「このpdfファイル内の各ページを処理し、各ページで見つかったテキストを表す文字列のリストを返す」「」
(with_pdfを返すpdf_doc 、_parse_pages、pdf_pwd、*タプル([images_folder]))

、A =オープン( 'パス/ A.TXT'、 'A')
get_pages( 'パス/ Export_001397_32251.pdf'でiに対する):
a.write(I)
印刷(I)
a.close()





 

 

おすすめ

転載: www.cnblogs.com/ganzhihui/p/11543920.html