查看原文
其他

批量实现WORD转PDF

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:张馨月

文字编辑:钱梦璇

技术总编:张   邯

写在前面:



大家在学习办公的过程中经常需要将WORD文档转为PDF文件,面对单个文件我们可以通过手动操作来实现,但当我们要处理大量文件时,这些单调重复的工作着实费时费力。今天,小编就来分享一下如何批量完成WORD转PDF,实现自动化办公的第一步。如果你也想要解放双手,不妨继续往下看吧~


单个文件的处理 


《新的一年,效率满满~(上)》《新的一年,效率满满~(下)》中,我们使用了win32com来处理Word和Excel文档,这里我们继续使用这个强大的第三方库。同样地,先导入win32com并进行初始化设置:

import win32comfrom win32com.client import Dispatchapp = Dispatch('Word.Application') app.Visible = 1 # 后台运行,不显示app.DisplayAlerts = 0 # 不警告

对于单个文件,我们用下面几行代码就可以搞定:

word = Dispatch('Word.Application') #打开WordwdFormatPDF = 17doc = word.Documents.Open(r"D:\win\work1.docx") #打开文档doc.SaveAs(r"D:\win\work1", FileFormat=wdFormatPDF) #文件转换doc.SaveAs(r"D:\win\work1".replace(".docx", ".pdf"), FileFormat=wdFormatPDF) #文件转换

结果如下:


 批量处理文件 


更一般的情况下,我们想要将一个目录下的多个文件进行转换,因此我们的思路也分为两步:1.定义一个函数,将WORD文档转为PDF;2.遍历目录,进行批量处理。在Python中的实现过程如下:

from win32com.client import Dispatchfrom os import walk#定义一个函数,将Word转为PDFwdFormatPDF = 17def doc2pdf(input_file): word = Dispatch('Word.Application') doc = word.Documents.Open(input_file) if file.endswith(".doc"): doc.SaveAs(input_file.replace(".doc", ".pdf"), FileFormat=wdFormatPDF) if file.endswith(".docx"): doc.SaveAs(input_file.replace(".docx", ".pdf"), FileFormat=wdFormatPDF) doc.Close() #关闭文档 word.Quit() #关闭Word print(file) #打印文档名称以显示程序进度#遍历指定路径下的所有文件,如果格式为doc或docx,转化为PDFif __name__ == "__main__": doc_files = [] directory = r"C:\Users\asus\Desktop\exp" for root, dirs, filenames in walk(directory): for file in filenames: if file.endswith(".doc") or file.endswith(".docx"): doc2pdf(str(root + "\\" + file))


 批量生成奖状并转化格式


《新的一年,效率满满~(上)》中,我们介绍了Word对win32com的基本操作,今天我们就结合之前分享的内容,感受一下自动化办公的高效之处~

1.生成简易版奖状:

app = Dispatch('Word.Application') app.Visible = 1 # 后台运行,不显示app.DisplayAlerts = 0 # 不警告word = Dispatch('Word.Application') #打开Word#新建文档doc = app.Documents.Add()cm_to_points = 28.35#设置纸张格式doc.PageSetup.TopMargin = 3.3*cm_to_points # 上边距3.3厘米doc.PageSetup.BottomMargin = 3.3*cm_to_points # 下边距3.3厘米doc.PageSetup.LeftMargin = 2.8*cm_to_points # 左边距2.8厘米doc.PageSetup.RightMargin = 2.6*cm_to_points # 右边距2.8厘米doc.PageSetup.Orientation=1 #页面水平放置#创建函数,输入标题def para(text=''): p = doc.Paragraphs.Add() p.Range.Font.Name = '隶书' p.Range.Font.Size = 48 p.Range.ParagraphFormat.Alignment = 1 # 012分别代表居左/中/右 p.Range.ParagraphFormat.LineSpacing = 12 # 行间距 p.Range.InsertBefore(text) # 插入内容para(text='奖状')#创建函数,输入正文def para(text=''): p = doc.Paragraphs.Add() p.Range.Font.Name = '宋体' p.Range.Font.Size = 12 p.Range.ParagraphFormat.Alignment = 0 # 012分别代表居左/中/右 p.Range.ParagraphFormat.LineSpacing = 12 # 行间距 p.Range.InsertBefore(text) # 插入内容 p.CharacterUnitLeftIndent=3#设置段落缩进,左侧的值 p.CharacterUnitRightIndent=6#设置段落缩进,右侧的值para(text='王某某获得三等奖')
doc.SaveAs(r"C:\Users\asus\Desktop\exp\model.doc", 16) # 存储文件doc.Close() app.Quit()

执行上述代码,我们就能得到一个如图所示的文档:


2.替换人名并保存为Word:

list=["张可可","李盼盼","王欢欢","高莎莎"] #将所有人名放入一个列表app = Dispatch('Word.Application') app.Visible = 1 app.DisplayAlerts = 0
for i in range(0,4): new=list[i] #定义一个变量存储姓名 doc=app.Documents.Open(r"C:\Users\asus\Desktop\exp\model.doc") #打开第一步中生成的Word文档 app.Selection.Find.ClearFormatting() app.Selection.Find.Replacement.ClearFormatting() app.Selection.Find.Execute('王某某', False, False, False, False, False, True, 1, True,new, 2) #将“王某某”替换为新的姓名 doc_name = "./%s.doc" % list[i] #定义文件名称为姓名 doc.SaveAs(r"C:\Users\asus\Desktop\exp"+doc_name) # 存储doc.Close()app.Quit()

这样,我们就生成了四个新的Word文档,并且每个文档的内容都实现了替换:

 

3.将上述生成的WORD文档转为PDF:

我们对路径进行设置,执行(二)中的代码即可:

from win32com.client import Dispatchfrom os import walk#定义一个函数,将Word转为PDFwdFormatPDF = 17def doc2pdf(input_file): word = Dispatch('Word.Application') doc = word.Documents.Open(input_file) if file.endswith(".doc"): doc.SaveAs(input_file.replace(".doc", ".pdf"), FileFormat=wdFormatPDF) if file.endswith(".docx"): doc.SaveAs(input_file.replace(".docx", ".pdf"), FileFormat=wdFormatPDF) doc.Close() #关闭文档 word.Quit() #关闭Word print(file) #打印文档名称以显示程序进度#遍历指定路径下的所有文件,如果格式为doc或docx,转化为PDFif __name__ == "__main__": doc_files = [] directory = r"C:\Users\asus\Desktop\exp" for root, dirs, filenames in walk(directory): for file in filenames: if file.endswith(".doc") or file.endswith(".docx"): doc2pdf(str(root + "\\" + file))

打开文件位置,就可以看到所有PDF文档都轻松生成啦:

 

今天的分享就到这里,今后大家再遇到大量Word文档需要处理时,一定要试试win32com~







对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

Stata有问必答环节

我听到了企业的哀鸣
“物以类聚”、“近朱者赤”——机器学习初探之KNN
SFI:Stata与Python的数据交互手册(二)

从流调数据中寻找感染真相

熟悉又陌生的reshape

NBA球员薪资分析——基于随机森林算法(二)

NBA球员薪资分析——基于随机森林算法(一)

高亮输出之唐诗作者

湖北省各市疫情数据爬取

古代诗人总去的这些地方你一定要知道!

DataFrame数组常用方法(二)

ftools命令——畅游大数据时代的加速器

卫健委的“糊涂账”

Pandas中数据的排序与切片

DataFrame数组常用方法

巧用局部宏扩展函数dir

过了14天潜伏期真的没事了?

关于我们



微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存