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,一经查实,立即删除!

相关文章

windows server 2012 初安装体验

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

安卓APP_ 控件(1)—— TextView

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

用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…

安卓APP_ 控件(3)—— EditText

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

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

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

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

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

怎么下载并安装python_怎么下载官网python并安装

怎么下载官网python并安装?百度搜索Python官网。看到上图显示官网的没,点击进入。把鼠标移到downloads上,然后看到下拉选项,点击Windows。然后看到如下界面。这么多的安装包,该选那个呢。下图画圈的是版本号&#xff0…

匿名函数python_基于python内置函数与匿名函数详解

内置函数 Built-in Functions abs() dict() help() min() setattr() all() dir() hex() next() slice() any() divmod() id() object() sorted() ascii() enumerate() input() oct() staticmethod() bin() eval() int() open() str() bool() exec() isinstance() pow() super()…

ASP.NET AJAX(服务器回调)

如果只用纯粹的 js ,你必须弥补 ASP.NET 服务器端抽象和有限的 HTML DOM 之间的鸿沟,这不简单,没有 VS 的智能提示和调试工具,编写无错的代码和诊断错误都非常困难。由于各种突发事件及实现的差异,编写能够在所有现代浏…

git版本回退命令_Git学习版本回退和管理文件的修改及删除操作

版本回退前面我们成功的提交了一次mygit.txt,下面咱对它进行修改,内容如下:Hello GitGit is so easy.然后用git status来跟踪该文件的状态:可以看到hellogit.txt已经被修改过了,到底这次修改的内容与上次的内容有什么不…

node 版本升级_Node-RED: 自动化事件触发工具的安装与介绍

Node-RED 介绍Node-RED 是一种基于流程的编程工具由 IBM 的新兴技术服务团队原创开发Node-RED 是一种事件触发工具,和 StackStorm 类似, 可以归类为上层的自动化工具,可以用来触发与之相对应的下层自动化工具,比如 ansible,来更加…

python处理mysql数据结构_python环境下使用mysql数据及数据结构和二叉树算法(图)...

python环境下使用mysql数据及数据结构和二叉树算法(图):1 python环境下使用mysql2使用的是 pymysql库3 开始-->创建connection-->获取cursor-->操作-->关闭cursor->关闭connection->结束45 代码框架6 import pymysql.cursors7 ###连接数据库8 con…

大数据工作流_大数据和人工智能时代下的数字化工作流

点击上方“Bentley软件”可以订阅哦本文作者Bentley 软件公司高级技术经理赵顺耐大数据、人工智能以及与之相伴相生的物联网已经成为现代社会的运行方式,信息技术的急速发展,和数据量爆炸式增长,改变了整个社会传统的运行方式。人类与信息技术…

多租户系统技术实现mysql_SaaS “可配置”和“多租户”架构的几种技术实现方式...

1、数据存储方式的选择多租户(Multi-Tenant ),即多个租户共用一个实例,租户的数据既有隔离又有共享,说到底是要解决数据存储的问题。常用的数据存储方式有三种。方案一:独立数据库一个Tenant,一个Database“的数据存储…

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

更多干货推荐可以去牛客网看看,他们现在的IT题库内容很丰富,属于国内做的很好的了,而且是课程刷题面经求职讨论区分享,一站式求职学习网站,最最最重要的里面的资源全部免费!!!点击进…

iOS如何判断当前网络的运营商

2019独角兽企业重金招聘Python工程师标准>>> 在IOS上存在retain屏,经常需要在一些时刻用到高清图,有些时候也要到普通图。 在网络条件很爽的情况下,这当然不在话下。如果咱是iphone用户,又正好用的是移动卡。 如果还用…

Py函数直接传入root是啥意思_Python内部函数——用处何在?

这是一篇译文,原文地址:https://realpython.com/inner-functions-what-are-they-good-for/1. 封装内部函数可以免受函数之外的情况的影响,也就是说,对于全局命名空间而言,它们是隐藏的。下面是一个简单的例子&#xff…

Linux 和 Windows 平台不同的 UCS-2 编码

2019独角兽企业重金招聘Python工程师标准>>> 以下是有关两个平台 UCS-2 编码的潜规则: 1, UCS-2 不等于 UTF-16。 UTF-16 每个字节使用 ASCII 字符范围编码,而 UCS-2 对每个字节的编码可以超出 ASCII 字符范围。UCS-2 和 UTF-16 对每个字符至…

vld检测不输出_输出轴热处理形变超差,找找原因

这里有最实用的技术,点击↑↑关注作者:阚亚威单位:镇江液压股份有限公司来源:《金属加工(热加工)》杂志我公司摆线液压马达输出轴材料主要为20CrMnTi,热处理工艺为渗碳直接淬火低温回火,工艺如图1所示。近期…