日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python docx 合并文档 图片_不再为处理PDF烦恼,python处理操作PDF全攻略

發布時間:2023/12/10 python 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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全攻略的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。