python docx 合并文档 图片_不再为处理PDF烦恼,python处理操作PDF全攻略
本篇聊下Python對pdf的各種操作,包含pdf轉word,pdf轉圖片,pdf翻轉,加密,加水印等。
pdf轉換word文檔 保留格式
pdf轉換為word文檔,被大眾經常使用的是純Python庫pdfminer和python-docx搭配使用,不過pdfminer轉換成word,會丟失原來的pdf格式(圖片和樣式會丟失),只能是一個純文本的。
比如下面是一個pdf文檔,是一個目錄索引樣式。
使用pdfminer和python-docx轉換的話樣式會丟失,如下。
為了研究怎么保留樣式,我花了好些時間,最終測試驗證了一種能接受的方案:使用libreoffice
libreoffice是一個免費的辦公軟件,能打開和操作docx,ppt,pdf等,提供不同文檔格式之間的轉換,而且支持命令行。
支持命令行的話,我們就能通過python的os.system()等方法調用libreoffice軟件去做文檔轉換工作了。
首先要安裝libreoffice:
下載地址如下:
https://zh-cn.libreoffice.org/download/libreoffice-still/
windows,linux,max三種版本都有。
安裝成功后,在libreoffice/program 目錄下面有個soffice.exe命令,我們就是用python調用soffice來做pdf和word轉換。來測試一下pdf轉word功能。
import osos.system('D:Program Fileslibreofficeprogramsoffice --infilter=writer_pdf_import --convert-to docx D:codepdfss.pdf --outdir D:codepdf')上面的命令是把ss.pdf 轉換成docx格式,保存在D:codepdf 目錄里,文件名是跟pdf同名,只是文件會變成.docx 。
來打開轉換后的docx文檔看一下,樣式保留得還可以,要用office2007以上版本打開,office2003的打開樣式有問題。
libreoffice轉換的缺點是,不報錯,你不知道是否轉換成功。還有表格和多圖的轉換還有瑕疵。轉換耗時會隨著文檔頁數快速增加。
pdf轉word文檔 不保留格式
不保留格式,只需要文本的話,就直接使用 pdfminer和python-docx兩個庫搭配就好。pdfminer把pdf里的文字內容抽取出來,python-docx負責把抽取出來的寫進word文檔里。
from pdfminer.pdfinterp import PDFResourceManagerfrom pdfminer.converter import TextConverterfrom pdfminer.layout import LAParamsfrom pdfminer.pdfinterp import process_pdffrom io import StringIOffrom docx import Documentdef remove_characters(content): mpa = dict.fromkeys(range(32)) return content.translate(mpa) def convert_pdf_to_txt(path): with open(path,'rb') as f: rsrcmgr = PDFResourceManager() retstr = StringIO() laparams = LAParams() device = TextConverter(rsrcmgr, retstr, laparams=laparams) process_pdf(rsrcmgr, device, f) text = retstr.getvalue() device.close() retstr.close() return text def convert_txt_to_doc(text, doc_path): doc = Document() for line in text.split(''): paragraph = doc.add_paragraph() paragraph.add_run(remove_characters(line)) doc.save(doc_path)def convert(): text = convert_pdf_to_txt('d:/sphinx_doc_zhcn.pdf') convert_txt_to_doc(text, 'd:/test.docx')convert()寫進word文檔之前要把內容split分行,不然內容全都在一行,沒有段落。還有要刪掉一些亂七八糟的控制字符,不然保存word文檔的時候要報錯。
當然你需要使用pip install pdfminer 和 python-docx 這兩個庫。
pdf轉圖片
把pdf轉換成圖片的方案很多,比如wand庫、PythonMagick等都能實現,pdf轉圖片的方案選擇主要是考慮轉換性能和圖片質量上。轉換一個幾百K的pdf文檔分辨不出哪個好使,如果是批量轉換成百上千個pdf文檔,又或者是轉換一個幾十M大小的pdf文檔時就有優劣。
如果想程序簡單和轉換后的圖片質量還OK,可使用pdf2image + Poppler 方案。Poppler 是一個處理pdf文檔很有用的庫,支持windows/linux/mac 。pdf2image是一個wrapper,提供調用Poppler的python接口。
首先要下載Poppler
https://blog.alivate.com.au/poppler-windows/
windows用戶下載帶x86字樣的。
下載解壓后,要把poppler下的bin目錄絕對路勁加入到系統環境變量里,
比如我的是 D:Program Filespoppler-0.68.0bin ,要加入到系統環境變量Path變量里。不然pdf2image不知道去哪兒調用poppler。
然后安裝pdf2image
pip install pdf2image
最后調用運行
from pdf2image import convert_from_pathpages = convert_from_path('D:/test/18.pdf')for i, page in enumerate(pages): page.save('D:/test/18_{}.jpg'.format(str(i)), 'JPEG')不過這種方法要處理十幾M以上的pdf時,我親測慢如蝸牛,內存還可能不夠。處理大文件可以使用ghostscript,也是一個c程序,速度還過得去,我用它一次批處理數千個十幾M pdf文檔也花了好幾個小時。這里就不再贅述如何使用ghostscript了。
讀取pdf文檔元信息
比如獲取文檔作者,主題,創作時間,文檔頁數等等。
這里使用經典的PyPDF2庫來操作,下面的操作都PyPDF2完成,當然你需要先安裝,
pip install PyPDF2
from PyPDF2 import PdfFileReaderdef extract_information(pdf_path): with open(pdf_path, 'rb') as f: pdf = PdfFileReader(f) information = pdf.getDocumentInfo() number_of_pages = pdf.getNumPages() txt = f""" Information about {pdf_path}: Author: {information.author} Creator: {information.creator} Producer: {information.producer} Subject: {information.subject} Title: {information.title} Number of pages: {number_of_pages} """ print(txt) returnextract_information('D:/download/zj/2018.pdf')翻轉pdf
對pdf文檔向左向右翻轉90度,并保存為一個新的文檔。
from PyPDF2 import PdfFileReader, PdfFileWriterdef rotate_pages(pdf_path): # 新建一個空白pdf pdf_writer = PdfFileWriter() # 讀取要翻轉的pdf pdf_reader = PdfFileReader(path) # 把pdf第一頁向右翻轉90度并寫入新建的空白pdf里 page_1 = pdf_reader.getPage(0).rotateClockwise(90) pdf_writer.addPage(page_1) # 把pdf第二頁向左翻轉90度并寫入新建的空白pdf里 page_2 = pdf_reader.getPage(1).rotateCounterClockwise(90) pdf_writer.addPage(page_2) # 把pdf第三頁不翻轉正常寫入 pdf_writer.addPage(pdf_reader.getPage(2)) # 把新建的pdf文檔保存到本地 with open('D:/download/rotate_pages.pdf', 'wb') as fh: pdf_writer.write(fh) rotate_pages('D:/download/zj/18.pdf')從上面讀取pdf文檔元信息和翻轉pdf可以看出,操作PyPDF2來讀取和寫入pdf的方法分別是PdfFileReader和PdfFileWriter
合并pdf文檔
把多個pdf文檔合并成一個,操作方法也很簡單,仍然是先使用PdfFileReader方法讀取pdf每一個頁面,然后用PdfFileWriter寫入一個到新的pdf文檔中。
from PyPDF2 import PdfFileReader, PdfFileWriterdef merge_pdfs(paths, output): pdf_writer = PdfFileWriter() for path in paths: pdf_reader = PdfFileReader(path) for page in range(pdf_reader.getNumPages()): pdf_writer.addPage(pdf_reader.getPage(page)) with open(output, 'wb') as out: pdf_writer.write(out) paths = ['d:/test/1.pdf', 'd:/test/2.pdf']merge_pdfs(paths, output='d:/test/merged.pdf')拆分pdf分檔
把一個pdf文檔拆分成多個,操作思路都差不多,先用PdfFileReader讀取pdf文檔,再用PdfFileWriter把每一頁寫入新的。
下面的例子是把一個pdf文檔每一頁都拆分成一個pdf文檔,按文件頁數來命令新的文檔。
from PyPDF2 import PdfFileReader, PdfFileWriterdef split(path): pdf = PdfFileReader(path) for page in range(pdf.getNumPages()): pdf_writer = PdfFileWriter() pdf_writer.addPage(pdf.getPage(page)) output = f'{page}.pdf' with open(output, 'wb') as output_pdf: pdf_writer.write(output_pdf)split('d:/test/test.pdf')給pdf文檔添加水映
可以調用mergePage()方法給pdf文檔加水印,PyPDF2的操作方法是把一個水印pdf文檔(這個pdf文檔里只有水印,水印可以是文字或圖片),重疊到待加水印的pdf文檔中,其實就是把兩個pdf頁面重疊在一起。
如下程序是給每一個頁面都加上水印。
from PyPDF2 import PdfFileWriter, PdfFileReaderdef create_watermark(input_pdf, output, watermark): #讀取只有水印的那個文檔 watermark_obj = PdfFileReader(watermark) watermark_page = watermark_obj.getPage(0) # 讀取待加水印的文檔 pdf_reader = PdfFileReader(input_pdf) pdf_writer = PdfFileWriter() # 給每一個頁面都加上水印 for page in range(pdf_reader.getNumPages()): page = pdf_reader.getPage(page) page.mergePage(watermark_page) pdf_writer.addPage(page) # 保存為新的文檔 with open(output, 'wb') as out: pdf_writer.write(out)create_watermark(input_pdf='D:/code/pdf/sphinx.pdf', output='D:/code/pdf/watermarked_sphinx.pdf', watermark='D:/download/zj/watermark.pdf')給pdf文檔加密
給你一個pdf文檔加密也很簡單,調用encrypt()方法即可。
from PyPDF2 import PdfFileWriter, PdfFileReaderdef add_encryption(input_pdf, output_pdf, password): pdf_writer = PdfFileWriter() pdf_reader = PdfFileReader(input_pdf) for page in range(pdf_reader.getNumPages()): pdf_writer.addPage(pdf_reader.getPage(page)) # 加密 pdf_writer.encrypt(user_pwd=password, owner_pwd=None, use_128bit=True) with open(output_pdf, 'wb') as fh: pdf_writer.write(fh)add_encryption(input_pdf='no_password.pdf', output_pdf='password.pdf', password='yuanrenxue')加密之后,如何解密打開呢?
from PyPDF2 import PdfFileReaderpdfFile = open('password.pdf','rb')pdfReader = PdfFileReader(pdfFile) #為True表示是加密文檔 yuanrenxue 是密碼if pdfReader.isEncrypted: pdfReader.decrypt('yuanrenxue')上面可以看出,PyPDF2庫是不能對pdf文本內容進行寫操作,只能對pdf文檔進行讀取,頁面拷貝,加解密,新建pdf文檔操作。
總結
以上是生活随笔為你收集整理的python docx 合并文档 图片_不再为处理PDF烦恼,python处理操作PDF全攻略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java学习之(内部类)
- 下一篇: python 多进程 调用模块内函数_p