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

本篇聊下Python对pdf的各种操作,包含pdf转word,pdf转图片,pdf翻转,加密,加水印等。

6374812471a01ec40a83951ebc423717.png

pdf转换word文档 保留格式

pdf转换为word文档,被大众经常使用的是纯Python库pdfminer和python-docx搭配使用,不过pdfminer转换成word,会丢失原来的pdf格式(图片和样式会丢失),只能是一个纯文本的。

比如下面是一个pdf文档,是一个目录索引样式。

ce78d7482650f2e6a1a7bf20634db59d.png

使用pdfminer和python-docx转换的话样式会丢失,如下。

7d7ac2db0d7dc7ffb067ad69deb03d4c.png

为了研究怎么保留样式,我花了好些时间,最终测试验证了一种能接受的方案:使用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的打开样式有问题。

0ed2dce8c1555ec39e7469f2b70fe3d9.png

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文档元信息

比如获取文档作者,主题,创作时间,文档页数等等。

c6292c49900d83c96a3e31103115a473.png

这里使用经典的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度,并保存为一个新的文档。

68d05e63283b45720b2dec6c42025cc5.png
d43179c4bd763bd63e282b99e955dec6.png
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文档操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

new blog

new blog转载于:https://www.cnblogs.com/uuzlove/p/9336405.html

windows server 2012 初安装体验

昨天晚上的windows server 2012 已时行 了发布了,为之在之前我已进行了下载测试安装,本来晚间想用来在虚拟机下进行安装VM-tool工具的,但是却因种种原因没有成功,为之补一下前面没有安装的过程截图。 进入下载页后,下载…

python 多进程 调用模块内函数_python子进程模块subprocess详解与应用实例 之一

分类: Python/Ruby 2014-09-09 10:59:42 subprocess--子进程管理器 一、subprocess 模块简介 subprocess最早是在2.4版本中引入的。 subprocess模块用来生成子进程,并可以通过管道连接它们的输入/输出/错误,以及获得它们的返回值。 它用来代替…

安卓APP_ 控件(1)—— TextView

摘自:安卓APP_ 控件(1)—— TextView 作者:丶PURSUING 发布时间: 2021-03-28 21:53:49 网址:https://blog.csdn.net/weixin_44742824/article/details/115283233 本文为学习笔记,是安卓APP学习的…

python udp 大文件_Python:通过UDP发送大对象

我是套接字编程的新手,最近为它挑选了Python。我有几个问题,我似乎无法找到明确的答案。Python:通过UDP发送大对象我正在研究通过UDP发送数据,并写了一个简单的python脚本来做到这一点。可以很好地发送小对象(准确地说是小腌制对象…

Flask入门系列(转载)

一、入门系列: Flask入门系列(一)–Hello World 项目开发中,经常要写一些小系统来辅助,比如监控系统,配置系统等等。用传统的Java写,太笨重了,连PHP都嫌麻烦。一直在寻找一个轻量级的后台框架,学…

iphone3G恢复到3.1.2遇到的问题

1.报错1015 2.进入DFU模式,刷到下载数据停止不动。 3.进入菠萝,进度条走到最后停止不动。 4.红雪走到waiting for reboot停止不动。 针对上述问题: 首先,要找到完全对应手机系统原版本的固件。然后,红雪进入DFU模式刷机…

用python做数据分析pdf_利用python进行数据分析pdf

利用python进行数据分析pdf微盘下载!《利用python进行数据分析》利用Python实现数据密集型应用由浅入深帮助读者解决数据分析问题~适合刚刚接触Python的分析人员以及刚刚接触科学计算的Python程序员。利用python进行数据分析简介: 还在苦苦寻觅用Python控…

安卓APP_ 控件(2)—— Button

摘自:安卓APP_ 控件(2)—— Button 作者:丶PURSUING 发布时间: 2021-03-29 14:20:54 网址:https://blog.csdn.net/weixin_44742824/article/details/115290501 开篇:安卓APP_ 控件(1…

python 列表自定义排序_自定义排序的Python列表

我有一个dicts列表: ldicts = [{name: 120-150}, {name: 90-120}, {name: 150-180}, {name: >= 180}, {name: <90}, {name: total}] 我想按值升序对其进行排序,以便输出如下: sortedldicts = [{name: total}, {name: <90}, {name: 90-120},{name: 120-150}, {name: …

HTML DOM知识点补充:

DOM Console 控制台对象提供了浏览器的debug的方法支持。 常用的&#xff1a;console.log()。 ⚠️coffeescript中&#xff0c;这个方法不加括号。 DOM Document 当一个HTML document加载到浏览器上&#xff0c;它就成为了一个document object。 它是root node 提供了大量docum…

python汇率编程_【菜鸟学Python】案例一:汇率换算

汇率换算V1.0 案例描述&#xff1a; 设计一个汇率换算器程序&#xff0c;其功能是将外币换算成人民币&#xff0c;或者相反 案例分析&#xff1a; 分析问题&#xff1a;分析问题的计算部分&#xff1b; 确定问题&#xff1a;将问题划分为输入、处理及输出部分&#xff1b; 设计…

2013年全球最佳工作

&#xfeff;&#xfeff;2013年即将到来&#xff0c;在新的一年中软件开发人士将继续保持良好的发展态势&#xff0c;通过信息技术及分析业务为企业带来竞争优势。系统分析师、网络/系统管理员、网络架构师以及数据库管理员也纷纷名列榜单前十五位。硅谷与华盛顿特区地铁体系则…

安卓APP_ 控件(3)—— EditText

摘自&#xff1a;安卓APP_ 控件&#xff08;3&#xff09;—— EditText 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-29 18:43:40 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/115305883 开篇&#xff1a;安卓APP_ 控件&#xff08…

python做游戏怎么实现窗口_python和py游戏窗口类

你在draw_sprite()中有事件循环&#xff0c;所以它一直运行到游戏结束&#xff0c;window.set_background永远不会执行。在您的代码构造不正确。在我试着更正它&#xff0c;稍后再发送代码。在编辑&#xff1a;如何组织代码的简单示例。在现在它在一个文件中。在Pygame中总是一…

python十种日期格式_Python中最常用的日期时间格式

在日常开发的时候&#xff0c;我们经常会遇到时间处理的问题&#xff0c;代码示例爬虫过来的时间处理&#xff0c;代码示例对库内的数据进行时间维度的统计等。虽然是个很简单的东西&#xff0c;但每次用的时候都难免要再查一查&#xff0c;其实这就是基础不夯实的表现。趁着今…

精通QTP-自动化测试技术领航

精通QTP-自动化测试技术领航

如何使得账户密码永不过期

如何使得账户密码永不过期 原文:如何使得账户密码永不过期可以通过以下vbs脚本做的使得账户密码永不过期 dim users获取所有用户set users getobject("winmgmts:{impersonationlevelimpersonate}").instancesof("win32_useraccount")for each user in use…

python随机数比大小_1到范围内的随机数系统最大大小总是1模2^10

我试图通过使用频率测试、运行测试和卡平方检验来找到Python(2.7.10)中可用的prng的统计特性。在为了进行频率测试&#xff0c;我需要将生成的随机数转换为其二进制表示形式&#xff0c;然后计算1和{}的分布。我在python控制台上试验随机数的二进制表示&#xff0c;并观察到这种…

全国计算机等级考试题库二级C操作题100套(第11套)

第11套&#xff1a; 给定程序中&#xff0c;函数fun的功能是将带头结点的单向链表逆置。即若原链表中从头至尾结点数据域依次为:2、4、6、8、10,逆置后&#xff0c;从头至尾结点数据域依次为: 10、8、6、4、2。 请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正…