0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

探討多個(gè)不同的Python包,并學(xué)習(xí)如何從PDF中提取某些圖片

電子工程師 ? 來(lái)源:lq ? 2018-12-04 10:50 ? 次閱讀

有很多時(shí)候你會(huì)想用Python從PDF中提取數(shù)據(jù),然后將其導(dǎo)出成其他格式。不幸的是,并沒(méi)有多少Python包可以很好的執(zhí)行這部分工作。在這篇貼子中,我們將探討多個(gè)不同的Python包,并學(xué)習(xí)如何從PDF中提取某些圖片。盡管在Python中沒(méi)有一個(gè)完整的解決方案,你還是應(yīng)該能夠運(yùn)用這里的技能開始上手。提取出想要的數(shù)據(jù)之后,我們還將研究如何將數(shù)據(jù)導(dǎo)出成其他格式。

讓我們從如何提取文本開始學(xué)起!

使用PDFMiner提取文本

最被大家所熟知的可能是一個(gè)叫做PDFMiner的包。PDFMiner包大約從Python2.4版本就存在了。它的主要目的是從PDF中提取文本。實(shí)際上,PDFMiner可以告訴你某文本在分頁(yè)上具體的位置和字體信息。對(duì)于Python2.4到2.7版本,你可以參考以下網(wǎng)站來(lái)了解PDFMiner的更多信息:

GitHub – https://github.com/euske/pdfminer

PyPI – https://pypi.python.org/pypi/pdfminer/

Webpage – https://euske.github.io/pdfminer/

PDFMiner是不兼容于Python3的。幸運(yùn)的是,PDFMiner家族的一個(gè)分支PDFMiner.six在Python3上完全能勝任同樣的功能。

你可以在以下網(wǎng)站上找到:

https://github.com/pdfminer/pdfminer.six

關(guān)于PDFMiner的安裝說(shuō)明已經(jīng)比較過(guò)時(shí)了。其實(shí)你可以用pip命令來(lái)安裝它:

python -m pip install pdfminer

如果你要在Python3上安裝PDFMiner(這也許就是你現(xiàn)在正在做的),你需要這樣安裝:

python -m pip install pdfminer.six

PDFMiner的相關(guān)文檔很少。你將很大可能地需要使用Google和Stack Overflow兩個(gè)查詢工具來(lái)弄清楚如何在這篇貼子的涵蓋內(nèi)容之外有效地使用PDFMiner。

提取所有文本

有時(shí)你會(huì)想要提取PDF文件中的所有文本。PDFMiner包提供了一些不同的方法使你能夠做到這一點(diǎn)。我們先來(lái)探討一些編程的方法。讓我們?cè)囍鴱囊粋€(gè)國(guó)稅局W9表單中讀取所有的文本。

你可以從這里得到表單副本:

https://www.irs.gov/pub/irs-pdf/fw9.pdf

保存完這個(gè)PDF文件之后,你可以參考以下代碼:

import iofrom pdfminer.converter import TextConverterfrom pdfminer.pdfinterp import PDFPageInterpreterfrom pdfminer.pdfinterp import PDFResourceManagerfrom pdfminer.pdfpage import PDFPagedef extract_text_from_pdf(pdf_path): resource_manager = PDFResourceManager() fake_file_handle = io.StringIO() converter = TextConverter(resource_manager, fake_file_handle) page_interpreter = PDFPageInterpreter(resource_manager, converter) with open(pdf_path, 'rb') as fh: for page in PDFPage.get_pages(fh, caching=True, check_extractable=True): page_interpreter.process_page(page) text = fake_file_handle.getvalue() # close open handles converter.close() fake_file_handle.close() if text: return textif __name__ == '__main__': print(extract_text_from_pdf('w9.pdf'))

當(dāng)你直接使用PDFMiner包時(shí),往往會(huì)有點(diǎn)繁瑣。這里,我們從PDFMiner的不同模塊中引入多個(gè)不同的類。由于這些類都沒(méi)有文檔說(shuō)明,也沒(méi)有實(shí)現(xiàn)其文檔字符串屬性,我將不會(huì)深入講解它們做了什么。如果你真的好奇的話,盡管可以深入地研究它們的源代碼。無(wú)論如何,我認(rèn)為我們可以大致照以上代碼行事。

我們做的第一件事就是創(chuàng)建一個(gè)資源管理器的實(shí)例。然后通過(guò)Python的輸入輸出(io)模塊創(chuàng)建一個(gè)似文件對(duì)象。如果你使用的是Python2,你應(yīng)該使用StringIO模塊。接下來(lái)的步驟是創(chuàng)建一個(gè)轉(zhuǎn)換器。在這個(gè)例子里,我們選擇使用TextConverter,如果你想要的話,你還可以使用HTMLConverter或XMLConverter。最后,我們創(chuàng)建一個(gè)PDF解釋器對(duì)象,攜帶著我們的資源管理器和轉(zhuǎn)換器對(duì)象,來(lái)提取文本。

最后一步是打開PDF文件并且循環(huán)遍歷每一頁(yè)。結(jié)尾部分,我們抓取所有的文本,關(guān)閉不同的信息處理器,同時(shí)打印文本到標(biāo)準(zhǔn)輸出(stdout)。

按頁(yè)提取文本

通常我們并不需要從一個(gè)多頁(yè)文檔中抓取所有的文本。你一般會(huì)想要處理文檔的某些部分。那么,讓我們改寫代碼以便它提取文本呈分頁(yè)的格式。這將允許我們?cè)跈z查文本時(shí),一次一頁(yè)地進(jìn)行:

# miner_text_generator.pyimport iofrom pdfminer.converter import TextConverterfrom pdfminer.pdfinterp import PDFPageInterpreterfrom pdfminer.pdfinterp import PDFResourceManagerfrom pdfminer.pdfpage import PDFPagedef extract_text_by_page(pdf_path): with open(pdf_path, 'rb') as fh: for page in PDFPage.get_pages(fh, caching=True, check_extractable=True): resource_manager = PDFResourceManager() fake_file_handle = io.StringIO() converter = TextConverter(resource_manager, fake_file_handle) page_interpreter = PDFPageInterpreter(resource_manager, converter) page_interpreter.process_page(page) text = fake_file_handle.getvalue() yield text # close open handles converter.close() fake_file_handle.close()def extract_text(pdf_path): for page in extract_text_by_page(pdf_path): print(page) print()if __name__ == '__main__': print(extract_text('w9.pdf'))

在這個(gè)例子中,我們創(chuàng)建了一個(gè)生成器函數(shù)按頁(yè)生成(yield)了文本。extract_text函數(shù)按頁(yè)打印出文本。此處我們可以加入一些分析邏輯來(lái)得到我們想要的分析結(jié)果?;蛘呶覀兛梢詢H是將文本(或HTML或XML)存入不同的文件中以便分析。

你可能注意到這些文本沒(méi)有按你期望的順序排列。因此你需要思考一些方法來(lái)分析出你感興趣的文本。

PDFMiner的好處就是你可以很方便地按文本、HTML或XML格式來(lái)“導(dǎo)出”PDF文件。

你也可以使用PDFMiner的命令行工具,pdf2txt.py和dumppdf.py,來(lái)為你執(zhí)行導(dǎo)出工作。如果你不想試圖自己弄明白PDFMiner。根據(jù)pdf2txt.py的源代碼,它可以被用來(lái)導(dǎo)出PDF成純文本、HTML、XML或“標(biāo)簽”格式。

通過(guò)pdf2txt.py導(dǎo)出文本

伴隨著PDFMiner一起的pdf2txt.py命令行工具會(huì)從一個(gè)PDF文件中提取文本并且默認(rèn)將其打印至標(biāo)準(zhǔn)輸出(stdout)。它不能識(shí)別文字圖片,就像PDFMiner不支持光學(xué)字符識(shí)別(OCR)一樣。讓我們嘗試用最簡(jiǎn)單的方法來(lái)使用它,那就是僅僅傳遞給它一個(gè)PDF文件的路徑。我們會(huì)使用w9.pdf文件。打開一個(gè)終端并且定位到你存放PDF文件的位置,或修改一下命令指向待處理文件:

pdf2txt.py w9.pdf

如果你執(zhí)行這條命令,它將打印出所有的文本到標(biāo)準(zhǔn)輸出(stdout)。你也可以使pdf2txt.py 將文本寫入文件成文本、HTML、XML或“帶標(biāo)簽PDF”格式。XML格式將給出關(guān)于PDF的大部分信息,因?yàn)樗嗣恳粋€(gè)字母在文件中的位置以及字體信息。不推薦使用HTML格式,因?yàn)閜df2txt生成的標(biāo)記往往會(huì)很丑。以下是教你如何生成不同格式輸出的方法:

pdf2txt.py -o w9.html w9.pdf pdf2txt.py -o w9.xml w9.pdf

第一條命令將創(chuàng)建一個(gè)HTML文件,而第二條將創(chuàng)建一個(gè)XML文件。

最終的結(jié)果看上去有點(diǎn)怪,但是它并不太糟糕。XML格式的輸出極其冗長(zhǎng),因此我不能將它完整地在這里重現(xiàn),以下是一小段示例:

Form W-9

使用Slate提取文本

Tim McNamara覺(jué)得PDFMiner使用起來(lái)太過(guò)愚蠢和費(fèi)力,因此他寫了一個(gè)圍繞它的包裝器叫做slate,以使它更簡(jiǎn)單地從PDF中提取文本。不幸的是,它和Python3不兼容。如果你想試用,你可能需要easy_install以便于安裝distribute包,如下:

easy_install distribute

我不能使用pip 正確安裝這個(gè)包。然而一旦安裝了它,你將能夠使用pip來(lái)安裝slate:

python -m pip install slate

注意最新的版本是0.5.2,而pip未必能拿到這個(gè)版本。如果拿不到,那么你可以從GitHub上直接獲取slate安裝:

python -m pip install git+https://github.com/timClicks/slate

現(xiàn)在我們已經(jīng)準(zhǔn)備好寫一些代碼來(lái)從PDF中提取文本了:

# slate_text_extraction.pyimport slatedef extract_text_from_pdf(pdf_path): with open(pdf_path) as fh: document = slate.PDF(fh, password='', just_text=1) for page in document: print(page)if __name__ == '__main__': extract_text_from_pdf('w9.pdf')

正如你能看到的,讓slate分析一個(gè)PDF文件,你只需要引進(jìn)slate然后創(chuàng)建一個(gè)它的PDF類的實(shí)例。PDF類其實(shí)是Python內(nèi)置類list的一個(gè)子類,所以它僅是返回了一列/可遍歷的文本頁(yè)。如果PDF文件設(shè)有密碼,你可以傳入一個(gè)密碼參數(shù)。不管怎樣,一旦文件被分析,我們只要打印出每一頁(yè)的文本即可。

我非常喜歡slate,它用起來(lái)更簡(jiǎn)單。不幸的是,這個(gè)包也幾乎沒(méi)有什么相關(guān)文檔。在瀏覽過(guò)它的源碼之后,它看起來(lái)只支持純文本提取。

導(dǎo)出你的數(shù)據(jù)

現(xiàn)在我們得到了一些文本,我們會(huì)花費(fèi)一些時(shí)間來(lái)學(xué)習(xí)如何導(dǎo)出數(shù)據(jù)成各種不同的格式。具體來(lái)說(shuō),我們將學(xué)習(xí)如何以如下方法導(dǎo)出文本:

XML

JSON

CSV

讓我們開始吧!

導(dǎo)出成XML

可擴(kuò)展標(biāo)記語(yǔ)言(XML)格式是最為人所熟知的輸入輸出格式之一。它被廣泛運(yùn)用于互聯(lián)網(wǎng)中的許多不同的事物。正如我們已經(jīng)在本貼中看到的,PDFMiner也支持XML作為它的輸出之一。

話雖這么說(shuō),讓我們創(chuàng)建我們自己的XML生成工具。如下是一個(gè)簡(jiǎn)單的例子:

# xml_exporter.pyimport osimport xml.etree.ElementTree as xmlfrom miner_text_generator import extract_text_by_pagefrom xml.dom import minidomdef export_as_xml(pdf_path, xml_path): filename = os.path.splitext(os.path.basename(pdf_path))[0] root = xml.Element('{filename}'.format(filename=filename)) pages = xml.Element('Pages') root.append(pages) counter = 1 for page in extract_text_by_page(pdf_path): text = xml.SubElement(pages, 'Page_{}'.format(counter)) text.text = page[0:100] counter += 1 tree = xml.ElementTree(root) xml_string = xml.tostring(root, 'utf-8') parsed_string = minidom.parseString(xml_string) pretty_string = parsed_string.toprettyxml(indent=' ') with open(xml_path, 'w') as fh: fh.write(pretty_string) #tree.write(xml_path)if __name__ == '__main__': pdf_path = 'w9.pdf' xml_path = 'w9.xml' export_as_xml(pdf_path, xml_path)

這段代碼將使用Python內(nèi)置的XML庫(kù),minidom和ElementTree。我們也引入PDFMiner生成器代碼以用于每次抓取一頁(yè)文本。在這個(gè)例子中,我們用PDF的文件名創(chuàng)建了我們頂層的元素。然后在它的下層增加了一個(gè)頁(yè)(Pages)元素。下一步是for循環(huán),在此循環(huán)中我們從PDF中提取每一頁(yè)然后保存想要的信息。此處你可以加入一個(gè)特定的分析程序,其中你可以將頁(yè)分成句子或者單詞,從而分析出更有趣的信息。比如,你可能只想得到有某個(gè)特定名字或日期/時(shí)間戳的句子。你可以運(yùn)用Python的正則表達(dá)式來(lái)找出這類東西,或者僅是檢查子字符串在句子中的存在。

對(duì)于這個(gè)例子,我們僅僅是提取了每一頁(yè)的前100個(gè)字符并將其存入一個(gè)XML的子元素(SubElement)中。接下來(lái)的一段代碼可以簡(jiǎn)化成僅是寫出XML文件。然而,ElementTree不會(huì)做任何事來(lái)使得XML易讀。它最后看上去有點(diǎn)像壓縮的JavaScript似的一塊巨型文本。所以我們?cè)趯懭胛募笆褂胢inidom通過(guò)空格來(lái)“美化”XML,而不是將整塊文本寫入磁盤。最終看上去像這樣:

Form W-9(Rev. November 2017)Department of the Treasury Internal Revenue Service Request for Taxp Form W-9 (Rev. 11-2017)Page 2 By signing the filled-out form, you: 1. Certify that the TIN you are g Form W-9 (Rev. 11-2017)Page 3 Criminal penalty for falsifying information. Willfully falsifying cert Form W-9 (Rev. 11-2017)Page 4 The following chart shows types of payments that may be exempt from ba Form W-9 (Rev. 11-2017)Page 5 1. Interest, dividend, and barter exchange accounts opened before 1984 Form W-9 (Rev. 11-2017)Page 6 The IRS does not initiate contacts with taxpayers via emails. Also, th

上面是漂亮干凈的XML,同時(shí)它也是易讀的。錦上添花的是,你可以運(yùn)用你在PyPDF2章節(jié)中所學(xué)到的知識(shí)從PDF中提取元數(shù)據(jù)(metadata),然后將其也加入到XML中。

導(dǎo)出成JSON

JavaScript對(duì)象注釋, 或者JSON, 是一種易讀易寫的輕量級(jí)的數(shù)據(jù)交換格式。Python包含一個(gè)json模塊于它的標(biāo)準(zhǔn)庫(kù)中,從而允許你用編程方式來(lái)讀寫JSON。讓我們運(yùn)用從前一章節(jié)學(xué)到的內(nèi)容來(lái)創(chuàng)建一個(gè)導(dǎo)出器腳本來(lái)輸出JSON而不是XML:

# json_exporter.pyimport jsonimport osfrom miner_text_generator import extract_text_by_pagedef export_as_json(pdf_path, json_path): filename = os.path.splitext(os.path.basename(pdf_path))[0] data = {'Filename': filename} data['Pages'] = [] counter = 1 for page in extract_text_by_page(pdf_path): text = page[0:100] page = {'Page_{}'.format(counter): text} data['Pages'].append(page) counter += 1 with open(json_path, 'w') as fh: json.dump(data, fh)if __name__ == '__main__': pdf_path = 'w9.pdf' json_path = 'w9.json' export_as_json(pdf_path, json_path)

這里,我們引入所需要的不同的庫(kù),包括PDFMiner模塊。然后創(chuàng)建一個(gè)函數(shù),以PDF文件的輸入路徑和JSON文件的輸出路徑為參數(shù)。在Python中JSON基本上就是一個(gè)字典,所以我們創(chuàng)建一對(duì)簡(jiǎn)單的頂層的鍵:Filename和Pages。Pages鍵對(duì)應(yīng)一個(gè)空的表單。接著,我們循環(huán)遍歷PDF的每一頁(yè)并且提取每一頁(yè)的前100個(gè)字符。然后創(chuàng)建一個(gè)字典變量以頁(yè)號(hào)作為鍵100個(gè)字符作為值并將其添加到頂層的頁(yè)表單中。最后,我們利用json模塊的dump命令生成文件。

文件的內(nèi)容最終看上去像這樣:

{'Filename': 'w9', 'Pages': [{'Page_1': 'Form W-9(Rev. November 2017)Department of the Treasury Internal Revenue Service Request for Taxp'}, {'Page_2': 'Form W-9 (Rev. 11-2017)Page 2 By signing the filled-out form, you: 1. Certify that the TIN you are g'}, {'Page_3': 'Form W-9 (Rev. 11-2017)Page 3 Criminal penalty for falsifying information. Willfully falsifying cert'}, {'Page_4': 'Form W-9 (Rev. 11-2017)Page 4 The following chart shows types of payments that may be exempt from ba'}, {'Page_5': 'Form W-9 (Rev. 11-2017)Page 5 1. Interest, dividend, and barter exchange accounts opened before 1984'}, {'Page_6': 'Form W-9 (Rev. 11-2017)Page 6 The IRS does not initiate contacts with taxpayers via emails. Also, th'}]}

又一次,我們得到了易讀的輸出。你也可以通過(guò)PDF的元數(shù)據(jù)(metadata)來(lái)加強(qiáng)這個(gè)例子,如果你樂(lè)意的話。請(qǐng)注意輸出將會(huì)改變,它依賴于你想從每一頁(yè)或文檔中分析出什么樣的結(jié)果。

現(xiàn)在讓我們來(lái)快速看一下怎樣導(dǎo)出CSV文件。

導(dǎo)出成CSV

CSV是 **comma separated values** (逗號(hào)分隔值)的縮寫。它是一種漂亮的標(biāo)準(zhǔn)格式,并且已經(jīng)存在了很長(zhǎng)時(shí)間。CSV的優(yōu)點(diǎn)就是Microsoft Excel和LibreOffice都能夠自動(dòng)地以漂亮的電子表格的方式將它們打開。你也可以在一個(gè)文本編輯器中打開CSV文件,如果你樂(lè)意看到它的原始值的話。

Python有一個(gè)內(nèi)置的csv模塊,你可以用它來(lái)讀寫CSV文件。在這里我們將用它從我們由PDF中提取的文本來(lái)創(chuàng)建一個(gè)CSV。讓我們看一下代碼:

# csv_exporter.pyimport csvimport osfrom miner_text_generator import extract_text_by_pagedef export_as_csv(pdf_path, csv_path): filename = os.path.splitext(os.path.basename(pdf_path))[0] counter = 1 with open(csv_path, 'w') as csv_file: writer = csv.writer(csv_file) for page in extract_text_by_page(pdf_path): text = page[0:100] words = text.split() writer.writerow(words)if __name__ == '__main__': pdf_path = 'w9.pdf' csv_path = 'w9.csv' export_as_csv(pdf_path, csv_path)

這個(gè)例子中,我們引入了Python的csv庫(kù)。除此以外,引入的庫(kù)和前一個(gè)例子相同。在函數(shù)中,我們利用CSV文件路徑創(chuàng)建了一個(gè)CSV文件處理器。然后用文件處理器作為唯一的參數(shù)初始化了一個(gè)CSV寫入器對(duì)象。接著像之前一樣遍歷了PDF頁(yè)。這里唯一的不同就是我們將前100個(gè)字符分割成了單個(gè)的詞。這將允許我們擁有一些真實(shí)的數(shù)據(jù)來(lái)加入到CSV中。如果不這樣做,那么每一行將只會(huì)有一個(gè)元素在其中,那就不算一個(gè)真正的CSV文件了。最后,我們將一列單詞寫入CSV文件中。

這就是得到的結(jié)果:

Form,W-9(Rev.,November,2017)Department,of,the,Treasury,Internal,Revenue,Service,Request,for,TaxpForm,W-9,(Rev.,11-2017)Page,2,By,signing,the,filled-out,"form,",you:,1.,Certify,that,the,TIN,you,are,gForm,W-9,(Rev.,11-2017)Page,3,Criminal,penalty,for,falsifying,information.,Willfully,falsifying,certForm,W-9,(Rev.,11-2017)Page,4,The,following,chart,shows,types,of,payments,that,may,be,exempt,from,baForm,W-9,(Rev.,11-2017)Page,5,1.,"Interest,","dividend,",and,barter,exchange,accounts,opened,before,1984Form,W-9,(Rev.,11-2017)Page,6,The,IRS,does,not,initiate,contacts,with,taxpayers,via,emails.,"Also,",th

我認(rèn)為這個(gè)例子同JSON或XML的例子相比讀起來(lái)難了點(diǎn),但是它不算太難?,F(xiàn)在讓我們繼續(xù)來(lái)看一下怎樣才能將圖片從PDF中提取出來(lái)。

從PDF中提取圖片

不幸的是,并不存在Python包可以真正地做到從PDF中提取圖片。我找到的最接近的東西是有一個(gè)叫minecart的項(xiàng)目宣稱可以做到這一點(diǎn),但是它只在Python2.7上有效。我沒(méi)法使其運(yùn)行于我的PDF樣本。在Ned Batchelder的博客上有一篇文章談到了一點(diǎn)兒如何從PDF中提取JPG圖片。代碼如下:

# Extract jpg's from pdf's. Quick and dirty.import syspdf = file(sys.argv[1], "rb").read()startmark = "\xff\xd8"startfix = 0endmark = "\xff\xd9"endfix = 2i = 0njpg = 0while True: istream = pdf.find("stream", i) if istream < 0: ? ? ? ?break ? ?istart = pdf.find(startmark, istream, istream+20) ? ?if istart < 0: ? ? ? ?i = istream+20 ? ? ? ?continue ? ?iend = pdf.find("endstream", istart) ? ?if iend < 0: ? ? ? ?raise Exception("Didn't find end of stream!") ? ?iend = pdf.find(endmark, iend-20) ? ?if iend < 0: ? ? ? ?raise Exception("Didn't find end of JPG!") ? ?istart += startfix ? ?iend += endfix ? ?print("JPG %d from %d to %d" % (njpg, istart, iend)) ? ?jpg = pdf[istart:iend] ? ?jpgfile = file("jpg%d.jpg" % njpg, "wb") ? ?jpgfile.write(jpg) ? ?jpgfile.close() ? ?njpg += 1 ? ?i = iend

這同樣對(duì)我使用的PDF文件無(wú)效。有一些人在留言中宣稱代碼對(duì)他們的一些PDF文件有效,同時(shí)也有一些留言例舉了修改后的代碼。Stack Overflow網(wǎng)站上有關(guān)于這個(gè)的各種代碼,其中一些這樣或那樣地使用了PyPDF2。但沒(méi)有一個(gè)對(duì)我有效。

我的建議是使用一個(gè)類似于Poppler的工具來(lái)提取圖片。Poppler有一個(gè)工具叫做pdfimages,你可以同Python的subprocess模塊一起來(lái)使用。以下是你如何在沒(méi)有Python的情況下使用它:

pdfimages -all reportlab-sample.pdf images/prefix-jpg

請(qǐng)確保images文件夾(或你想新建的任何輸出文件夾)已經(jīng)被創(chuàng)建,因?yàn)閜dfimages不會(huì)為你創(chuàng)建它。

讓我們寫一個(gè)Python腳本來(lái)執(zhí)行同樣的命令,請(qǐng)確保輸出文件夾已經(jīng)存在:

# image_exporter.pyimport osimport subprocessdef image_exporter(pdf_path, output_dir): if not os.path.exists(output_dir): os.makedirs(output_dir) cmd = ['pdfimages', '-all', pdf_path, '{}/prefix'.format(output_dir)] subprocess.call(cmd) print('Images extracted:') print(os.listdir(output_dir))if __name__ == '__main__': pdf_path = 'reportlab-sample.pdf' image_exporter(pdf_path, output_dir='images')

在這個(gè)例子中,我們引入了subprocess和os模塊。如果輸出路徑不存在,我們會(huì)嘗試創(chuàng)建它。然后我們運(yùn)用subprocess的call函數(shù)來(lái)執(zhí)行pdfimages命令。使用call函數(shù)是因?yàn)樗鼘⒌鹊絧dfimages命令完全執(zhí)行完才返回。你可以代之以Popen,但是那將基本上在后臺(tái)運(yùn)行命令進(jìn)程。最后,我們打印出輸出路徑下的細(xì)節(jié),以確定所有的圖片都被提取進(jìn)了其中。

還有一些網(wǎng)絡(luò)上的其它文章引用了一個(gè)叫做Wand的庫(kù),你也許可以試一試。它是一個(gè)ImageMagick的包裝器。還有一個(gè)值得關(guān)注的是綁定了Poppler的Python叫做pypoppler,雖然我沒(méi)有能夠找到任何和這個(gè)包相關(guān)的提取圖片的例子。

總結(jié)

這篇文章網(wǎng)羅了很多信息。我們學(xué)習(xí)了一些可以用來(lái)從PDF中提取文本的包,如PDFMiner或Slate。我們還學(xué)習(xí)了如何運(yùn)用Python的內(nèi)置庫(kù)來(lái)導(dǎo)出文本到XML、JSON和CSV。最后,我們研究了一下從PDF中導(dǎo)出圖片這個(gè)棘手的問(wèn)題。盡管Python目前沒(méi)有任何出色的庫(kù)可以完成這個(gè)工作,你可以采用其它工具的變通方案,例如Poppler的pdfimage工具模塊。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • PDF
    PDF
    +關(guān)注

    關(guān)注

    1

    文章

    166

    瀏覽量

    33637
  • python
    +關(guān)注

    關(guān)注

    55

    文章

    4767

    瀏覽量

    84375
  • 資源管理器
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    7520

原文標(biāo)題:手把手教你如何用 Python 從 PDF 文件中導(dǎo)出數(shù)據(jù)

文章出處:【微信號(hào):DBDevs,微信公眾號(hào):數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【《時(shí)間序列與機(jī)器學(xué)習(xí)》閱讀體驗(yàn)】+ 時(shí)間序列的信息提取

    本人有些機(jī)器學(xué)習(xí)的基礎(chǔ),理解起來(lái)一點(diǎn)也不輕松,加油。 作者首先說(shuō)明了時(shí)間序列的信息提取是時(shí)間序列分析的一個(gè)重要環(huán)節(jié),目標(biāo)是給定的時(shí)間序列數(shù)據(jù)中提取出有用的信息和特征,以支持后續(xù)的分析
    發(fā)表于 08-14 18:00

    怎樣使用pythonNTC計(jì)算表中提取Hex值呢

    1、NTC計(jì)算表中提取Hex值最近用到NTC,使用 查表法計(jì)算熱敏電阻對(duì)應(yīng)的溫度值。查表法第一步是用NTC 計(jì)算表將廠家提供的阻值對(duì)應(yīng)表格填入響應(yīng)位置,最后生成對(duì)應(yīng)Hex 電壓值。
    發(fā)表于 04-24 18:12

    arm技術(shù)在PDF中提取圖形的方法

    PDF中提取圖形的方法.一. 用CorelDraw, 高版本比如10.0sp1出錯(cuò)最少.二. 用Acrobat5.0, 指完整版而非Reader
    發(fā)表于 06-18 09:52 ?1471次閱讀

    JAVA教程之壓縮中提取文件

    JAVA教程之壓縮中提取文件,很好的JAVA的資料,快來(lái)學(xué)習(xí)
    發(fā)表于 04-11 17:28 ?3次下載

    使用pdf解析可以用來(lái)讀取PDF文件中字符串文本,圖片數(shù)據(jù)

    pdf解析可以用來(lái)讀取PDF文件中字符串文本,圖片數(shù)據(jù)。Apache PDFbox是一個(gè)開源的、基于Java的、支持PDF文檔生成的工具庫(kù),它可以用于創(chuàng)建新的
    的頭像 發(fā)表于 02-03 15:59 ?1.3w次閱讀
    使用<b class='flag-5'>pdf</b>解析可以用來(lái)讀取<b class='flag-5'>PDF</b>文件中字符串文本,<b class='flag-5'>圖片</b>數(shù)據(jù)

    使用深度學(xué)習(xí),制作“圖片+文字”型的表情

    數(shù)據(jù)集是這個(gè)表情生成器的精髓。他們的數(shù)據(jù)集由大約40萬(wàn)張帶標(biāo)簽和圖說(shuō)的圖片組成。其中有2600個(gè)獨(dú)特的圖像-標(biāo)簽對(duì),是他們寫Python腳本Memegenerator.net中獲取
    的頭像 發(fā)表于 07-03 10:14 ?1w次閱讀

    如何HTML或XML文件中提取數(shù)據(jù)的Python爬蟲庫(kù)Beautiful Soup概述

    Beautiful Soup是一個(gè)可以HTML或XML文件中提取數(shù)據(jù)的Python庫(kù),簡(jiǎn)單來(lái)說(shuō),它能將HTML的標(biāo)簽文件解析成樹形結(jié)構(gòu),然后方便地獲取到指定標(biāo)簽的對(duì)應(yīng)屬性。
    的頭像 發(fā)表于 07-29 09:56 ?2.6w次閱讀

    如何使用Python編寫能夠原始文本提取信息的程序

    自然語(yǔ)言處理(Natural Language Processing,NLP)是人工智能的子領(lǐng)域之一,其重點(diǎn)是使計(jì)算機(jī)能夠理解和處理人類語(yǔ)言。在本文中,我們將知曉NLP是如何工作的,學(xué)習(xí)如何使用Python編寫能夠
    的頭像 發(fā)表于 08-13 10:02 ?1.1w次閱讀

    基于Python的scikit-learn實(shí)現(xiàn)機(jī)器學(xué)習(xí)

    基于Python的scikit-learn實(shí)現(xiàn)機(jī)器學(xué)習(xí)
    發(fā)表于 03-26 09:42 ?11次下載
    基于<b class='flag-5'>Python</b>的scikit-learn<b class='flag-5'>包</b>實(shí)現(xiàn)機(jī)器<b class='flag-5'>學(xué)習(xí)</b>

    如何使用OpenCV和Python圖像中提取感興趣區(qū)域

    今天我們將一起探究如何使用OpenCV和Python圖像中提取感興趣區(qū)域(ROI)。 在之間的文章中,我們完成了圖像邊緣提取,例如從臺(tái)球桌
    的頭像 發(fā)表于 02-07 14:42 ?1745次閱讀

    PythonPDF表格提取器-Camelot

    Python 第三方模塊 Camelot 能夠精準(zhǔn)識(shí)別PDF中的表格信息,并提取為pandas數(shù)據(jù)結(jié)構(gòu),而且還能導(dǎo)出為多種格式:JSON,Excel,HTML和Sqlite。
    的頭像 發(fā)表于 02-24 11:04 ?2118次閱讀
    <b class='flag-5'>Python</b>的<b class='flag-5'>PDF</b>表格<b class='flag-5'>提取</b>器-Camelot

    光體積圖中提取呼吸速率的信號(hào)處理技術(shù)的比較

    電子發(fā)燒友網(wǎng)站提供《光體積圖中提取呼吸速率的信號(hào)處理技術(shù)的比較.pdf》資料免費(fèi)下載
    發(fā)表于 06-12 09:20 ?0次下載

    Camelot:Python超強(qiáng)大的PDF表格提取

    如果你有PDF中批量提取表格的需求,那么這篇文章就是你的福音。 Python 第三方模塊 Camelot 能夠精準(zhǔn)識(shí)別PDF中的表格信息,
    的頭像 發(fā)表于 10-21 10:57 ?1418次閱讀
    Camelot:<b class='flag-5'>Python</b>超強(qiáng)大的<b class='flag-5'>PDF</b>表格<b class='flag-5'>提取</b>器

    Newspaper:用于提取和整理文章的python庫(kù)

    Newspaper 是一個(gè)很棒的python庫(kù),用于提取和整理文章。 它有以下的優(yōu)點(diǎn): 多線程文章下載框架 識(shí)別新聞網(wǎng)址 html提取文本
    的頭像 發(fā)表于 10-30 14:24 ?696次閱讀

    如何MySQL中提取數(shù)據(jù)增加換手率指標(biāo)進(jìn)行回測(cè)

    事實(shí)上,backtrader雖然沒(méi)有直接提供接口給我們做這樣的優(yōu)化,但是我們可以通過(guò)繼承DataBase基類重寫DataFeed實(shí)現(xiàn)目的。下面就給大家演示一下如何MySQL中提取數(shù)據(jù)增加換手率
    的頭像 發(fā)表于 11-02 10:38 ?735次閱讀
    如何<b class='flag-5'>從</b>MySQL<b class='flag-5'>中提取</b>數(shù)據(jù)<b class='flag-5'>并</b>增加換手率指標(biāo)進(jìn)行回測(cè)