learn-tech/专栏/Python自动化办公实战课/30怎么快速把任意文件格式转成PDF,并批量加水印?.md
2024-10-16 06:37:41 +08:00

209 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

因收到Google相关通知网站将会择期关闭。相关通知内容
30 怎么快速把任意文件格式转成PDF并批量加水印
你好,我是尹会生。
在办公场景中我们打交道最多的软件要数Office的办公套件了功能丰富且强大使用方便。不过你可能也会发现我们经常用于文字编辑的Word软件它使用的docx扩展名的文件无论是在不同操作系统平台、不同的设备上还是在内容安全性和格式的兼容性上都没有PDF文件强大。Excel和PowerPoint中的文件也是如此。
例如你需要把公司的合同范本发给其他公司审阅为了保证文本不会被随意篡改往往需要把Word或PowerPoint的文件转换为PDF文件再通过邮件发给其他公司。而且随着数字化转型的开始原本在计算机上正常显示的表格拿到手机上可能会缺少字体也可能因为屏幕宽度不同导致格式无法对齐还可能会出现无法显示文字等格式问题。
不过这些问题呢PDF统统可以解决。所以像是商业的条款、合同、产品介绍既要保证安全又要确保格式正确如果你不想限制用户必须要用多宽的显示器或者必须安装好特定的字体才能看到你的Word、Excel、PowerPoint里的内容的话那么使用PDF文件就是非常必要的了。
所以在今天这一讲中我将带你学习如何把Word、Excel、PowerPoint的默认文件格式批量转换为PDF文件并教你怎么给PDF文件增加水印既保证样式美观又确保文档的安全。
将常用办公文件转换为PDF格式
如果你以前遇到过类似转换为PDF文件的需求那么在你搜索Python的第三方库时就会发现将Word、Excel、PowerPoint 的默认文件保存格式转换为PDF的库非常多。由于我要将多种格式的文件转换为PDF那么为了我就需要使用一个能支持Office所有组件的库而这个库就是pywin32库。
pywin32库支持了绝大多数的Windows API因此它只能运行在操作系统是Windows上当你需要使用pywin32操作Office各个组件时可以利用pywin32库调用Offcie组件中的VBA实现Office组件的大部分功能。
接下来我将从pywin32库的安装开始来为你逐步讲解一下如何把Office组件中的Word、Excel、PowerPoint的默认文件保存格式转换为PDF文件。
虽然你要学习三种不同的软件格式转换为PDF文件但是它们三个文件格式转换的思路和被调用的函数是相同的你可以通过对照Word文件转换为PDF来去掌握其他两个软件的文件格式转换代码来学习自动格式转换这样学起来会更加轻松。
将Word文档转换为PDF
我先以Word为例来为你讲解一下pywin32库的安装、导入以及将Word文档进行转换的操作步骤。
由于pywin32是第三方库所以你要使用pip命令把它安装到你的Windows计算机中。这里需要注意pywin32的安装包和软件名称不同而且导入的库名称也和pywin32不同。所以我把pywin32库的安装和导入时使用的名称写在文档中供你进行参考
SHELL$ pip3 install pypiwin32
PYTHON> import win32com
我们用于格式转换的库叫做“win32com”它是pywin32软件的库名称。安装它时你要使用pypiwin32作为它的安装包名称来使用。这是第一次接触该库最容易混淆的地方我建议你在阅读后续内容前先对“pywin32、pypiwin32、win32com”这三个概念进行区分。
在你正确区分上面三个概念之后我们就可以开始导入win32com库并调用VBA脚本来把Word文档转换为PDF格式了。
为了让你更好地理解win32com库的执行过程我来为你举个例子。我在”C:\data”文件夹下有一个Word格式的a.doc文件现在要将它自动转换为a.pdf文件并继续存储在该目录中。如果你手动进行格式转换只是需要以下四个步骤
进入到C:\data文件夹
使用Office的Word组件打开 a.doc文件
使用“文件另存为”功能保存为PDF格式并指定保存目录
保存并关闭Word文件退出Word进程。
由于win32com库是调用Word的VBA脚本实现的格式转换功能因此转换格式的Python代码步骤也和手动操作Word几乎相同少数不同的地方是因为win32com支持的组件较多需要指定当前转换采用的VBA脚本为Word文件的脚本。我将Word转换PDF的代码写在下方供你参考。
from win32com import client
def word2pdf(filepath, wordname, pdfname):
worddir = filepath
# 指定Word类型
word = client.DispatchEx("Word.Application")
# 使用Word软件打开a.doc
file = word.Documents.Open(f"{worddir}\{wordname}", ReadOnly=1)
# 文件另存为当前目录下的pdf文件
file.ExportAsFixedFormat(f"{worddir}\{pdfname}", FileFormat=17 Item=7, CreateBookmarks=0)
# 关闭文件
file.Close()
# 结束word应用程序进程
word.Quit()
我来为你详细解释一下上面这段代码。这段代码中我定义了一个word2pdf()函数它被Python调用时会根据自己的参数将word文件的路径、word文件的名称和pdf名称传入参数中。
根据这些参数word2pdf()函数会调用DispatchEx()打开Word程序再使用Open()函数打开a.doc文件并使用ExportAsFixedFormat()函数将Word文件另存为PDF文件之后使用Close()和Quit()关闭a.doc文件并结束Word进程。
由于win32com是用过Word的VBA脚本实现对Word进程行为的控制的所以它的操作步骤和手动操作非常相似所以这段代码也非常容易理解。
那在这里我需要提醒你注意两个容易被忽视的问题第一个是由于win32com库在Windows系统上是直接调用Word进程实现格式转换的因此你必须为当前的Windows安装Word以及Office的办公组件。那另一个是由于win32com对Word操作的方式是基于Word的VBA脚本所以你想在转换时为ExportAsFixedFormat()函数增加新的参数需要参考Office官方网站的文档。
我也将Office官方网站关于Word的VBA脚本所在网页提供给你做参考https://docs.microsoft.com/zh-cn/office/vba/api/word.document.exportasfixedformat。当你增加新的功能时可以通过网页的内容来获得更多功能。
将Excel表格转换为PDF
在你掌握了如何使用win32com实现Word文档转换为PDF之后我再来带你实现Excel表格自动转换为PDF的功能你也可以对比着来学习掌握同时也注意观察把Excel和Word文件转换为PDF的主要差别。
Excel表格默认保存的文件格式是xls或xlsx将xls或xlsx格式转换为PDF的步骤和思路与Word文档转换为PDF相同所以我先把代码提供给你然后再为你讲解。代码如下
from win32com import client
def excel2pdf(filepath, excelname, pdfname):
exceldir = filepath
# 指定Excel类型
excel = client.DispatchEx("Excel.Application")
# 使用Excel软件打开a.xls
file = excel.Workbooks.Open(f"{exceldir}\{excelname}", False)
# 文件另存为当前目录下的pdf文件
file.ExportAsFixedFormat(0, f"{excel}dir}\{pdfname}")
# 关闭文件
file.Close()
# 结束excel应用程序进程
excel.Quit()
对比word2pdf()和excel2pdf()你会发现实现的基本逻辑是相同的但是在实现Excel转换上有两个主要函数的参数不同。
DispatchEx()函数的参数这里使用了“Excel.Application”字符串作为该函数的参数“Excel.Application”作为DispatchEx()参数的目的是让pywin32库启动Excel进程并让它读取“a.xls”文件。
ExportAsFixedFormat函数的第一个参数从pdf路径变为保存的类型你可以参考Office的Excel VBA官方文档从中学习函数的每个参数。
将PowerPoint幻灯片转换为PDF
在你学习了Word文档和Excel表格转换PDF文件的基础上我再来带你你对比学习一下如何将PowerPoint的默认保存文件ppt格式转换为PDF。参考word2pdf()和excel2pdf()两个函数我直接将PowerPoint的幻灯片转换PDF文件的代码提供给你你可以通过官方文档(https://docs.microsoft.com/zh-cn/office/vba/api/powerpoint.presentation.exportasfixedformat)来试着分析ppt2pdf()函数的参数和函数里的每行代码。
from win32com import client
def ppt2pdf(filepath, pptname, pdfname):
pptdir = filepath
# 指定PPT类型
ppt = client.DispatchEx("PowerPoint.Application")
# 使用ppt软件打开a.ppt
file = ppt.Presentations.Open(f"{pptdir}\{pptname}", False)
# 文件另存为当前目录下的pdf文件
file.ExportAsFixedFormat(f"{pptdir}\{pdfname}")
# 关闭文件
file.Close()
# 结束excel应用程序进程
excel.Quit()
显而易见PowerPoint幻灯片转换为PDF文件的代码逻辑和word2pdf()和excel2pdf()函数的逻辑完全相同只有两处有所不同一个是DispatchEx()的参数为“PowerPoint.Application”它的功能是让win32com库打开PowerPoint进程。另一个是ppt.Presentations.Open()打开的对象不同它打开的是每一页的PPT而Excel打开的是每个sheet对象。
以上就是如何将Office组件的Word、Excel与PowerPoint的默认保存文件格式转换为PDF格式。在转换之后我们经常为了保护知识产权或者增强文件的安全性需要给PDF文件增加水印。所以接下来我就带你学习如何通过增加水印提高PDF文件的安全性。
提高PDF文件的安全性
安全性包括很多方面比如为文档增加密码从而增强保密性也可以为文档增加水印提升它的不可伪造性。如果你对前面课程熟悉的话就能联想到我们在第27节课讲过可以利用我们自动压缩的方式来给文件增加密码所以我在今天这节课主要以如何给PDF文件增加水印。
为PDF增加水印
为PDF文件增加水印你可以通过pyPDF2库来实现。使用pyPDF2库的好处是你不需要在当前计算机上安装任何PDF编辑器就可以给PDF文件增加水印。
基于pyPDF2库来给PDF文件增加水印的原理是把只带有水印的PDF文件和需要增加水印的PDF文件合并即可。根据这一原理你大概就能想到增加水印的步骤了。主要有三步分别是准备水印文件、安装pyPDF2库以及合并两个PDF文件。
老规矩我们还是先从准备水印文件开始学习。带有水印的PDF文件可以使用Word软件来生成。具体操作方法是通过Word的“设计”-“水印”功能来定制你自己的水印文件接着再把它另存为PDF格式之后这个带有水印的文件你就可以反复使用了。
接下来是安装pyPDF2的第三方库。由于它的安装包和软件同名所以可以使用pip命令直接安装。安装后我需要通过该库实现PDF文件的读写。我使用了这个库用于读写PDF文件的“PdfFileReader, PdfFileWriter”两个包导入的代码如下
from PyPDF2 import PdfFileReader, PdfFileWriter
第三步也是最重要的一步合并两个PDF文件。合并文件需要使用pyPDF2库的mergePage()函数实现。在实际工作中我们通常需要给PDF文件的每一页都增加水印此时我们需要使用for循环来迭代每一页迭代之后再把合并好的PDF文件保存为新的文件即可。
我把合并两个PDF文件的代码写在下面然后再带你分析整个合并流程。
from PyPDF2 import PdfFileReader, PdfFileWriter
def watermark(pdfWithoutWatermark, watermarkfile, pdfWithWatermark):
# 准备合并后的文件对象
pdfWriter = PdfFileWriter()
# 打开水印文件
with open(watermarkfile, 'rb') as f:
watermarkpage = PdfFileReader(f, strict=False)
# 打开需要增加水印的文件
with open(pdfWithoutWatermark, 'rb') as f:
pdf_file = PdfFileReader(f, strict=False)
for i in range(pdf_file.getNumPages()):
# 从第一页开始处理
page = pdf_file.getPage(i)
# 合并水印和当前页
page.mergePage(watermarkpage.getPage(0))
# 将合并后的PDF文件写入新的文件
pdfWriter.addPage(page)
# 写入新的PDF文件
with open(pdfWithWatermark, "wb") as f:
pdfWriter.write(f)
在这段代码中我定义了函数watermark()用来实现为PDF文件增加水印的功能。它的实现思路是先读取水印PDF文件再把水印PDF文件与需要增加水印的文件的每一页进行合并。合并之后我通过使用PdfFileWriter()类产生了新的对象pdfWriter并将合并后产生的新PDF文件存储在pdfWriter对象中。最后在所有页处理完成后将合并后的PDF文件保存到“pdfWithWatermark”对象指向的文件中。
在这段代码中你需要注意的是我使用了“with方式”打开了文件在文件处理完成前如果关闭文件的化会出现“file close error”异常。因此你需要注意代码第9、13行的with缩进而写入新的文件可以在水印PDF文件和要增加水印的文件关闭后进行所以代码的第25行“with语句”缩进可以在它上面的两个with代码块以外进行编写。
为了让你更直接地感知到增加水印后的结果,我把增加水印后的结果贴在下方,供你参考。
以上就是我使用PyPDF2库为PDF增加水印的全部流程。不过除了增加水印外你还能使用pdfWriter对象来实现很多实用的功能比如为PDF文件设置密码、插入新的页面、旋转PDF页面等等。
此外由于pyPDF2库封装得非常好所以它的调用很简单你只需一个函数就能实现我刚才提到的这些功能了。我将pyPDF2库的官方文档链接https://pythonhosted.org/PyPDF2/贴在这里当你需要操作PDF文件实现其他功能时可以参考官方文档中PdfFileWriter()函数的参数,为不同的功能增加相应参数即可。
小结
最后我来为你总结一下今天的主要内容。在本讲中我为你讲解了如何通过pywin32库把Offce组件常用的doc、docx、xls、xlsx、ppt、pptx等文件转换为PDF文件格式的通用方法。这个通用的方法就是通过pywin32库的COM编程接口调用VBA脚本实现格式的转换。
你学会了pywin32库之后除了能把这些办公文件转换为PDF文件外还能对Office组件中的任意一个软件进行常见功能的调用因为**pywin32调用的VBA脚本和Office宏的脚本是完全相同的。
我在本讲中除了为你讲解了pywin32库外还讲解了pyPDF2库。pyPDF2库能够在你将文件转换为PDF之后还能对PDF的格式和内容进行微调让你的PDF文件批量处理能达到手动处理的文件精细程度。
最后你还可以把PDF文件和上一讲中的自动收发邮件以及我们学习过的Word自动处理相结合把PDF格式的合同作为邮件附件进行文件的自动生成和邮件的自动发送。
思考题
按照惯例我来为你留一道思考题。如果在一个文件夹中既有Word文件又有PowerPoint文件你该如何将文件夹中的这些类型的文件批量转换为PDF文件呢