-
2020-11-28 03:03:09
工作中,有时候碰到需要将一个比较大的word按照指定的页数分割成若干个小的word文档,下面提供分割的方法供参考:
一、按照单页拆分
1、在Word里面打开那个需要分割的文档(假设它的文件名叫做“test.doc”);
2、键入ALT+F11打开VBA编辑器,选择菜单“插入-模块”,或者键入ALT+F8打开宏命令窗口,或者点文档内上面的“工具”→“宏”→“宏”→找到这个宏→“运行”即可;
3、粘贴下面的代码:
Option Explicit
Sub SplitPagesAsDocuments()
Dim oSrcDoc As Document, oNewDoc As Document
Dim strSrcName As String, strNewName As String
Dim oRange As Range
Dim nIndex As Integer
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set oSrcDoc = ActiveDocument
Set oRange = oSrcDoc.Content
oRange.Collapse wdCollapseStart
oRange.Select
For nIndex = 1 To ActiveDocument.Content.Information(wdNumberOfPagesInDocument)
oSrcDoc.Bookmarks("\page").Range.Copy
oSrcDoc.Windows(1).Activate
Application.Browser.Target = wdBrowsePage
Application.Browser.Next
strSrcName = oSrcDoc.FullName
strNewName = fso.BuildPath(fso.GetParentFolderName(strSrcName), _
fso.GetBaseName(strSrcName) & "_" & nIndex & "." & fso.GetExtensionName(strSrcName))
Set oNewDoc = Documents.Add
Selection.Paste
oNewDoc.SaveAs strNewName
oNewDoc.Close False
Next
Set oNewDoc = Nothing
Set oRange = Nothing
Set oSrcDoc = Nothing
Set fso = Nothing
MsgBox "结束!"
End Sub
4、键入F5运行,看到“完成!”结束。
5、检查当前文档所在路径下是否生成若干名为“原始文档_n.doc”(n代表其对应原始文档中的第几页)的文档,检查它们的内容是否就对应于原始文档每个页面的内容。
二、按指定页动态拆分
上述方法是按单页拆分的,如果想按照指定页数拆分,可使用下面的代码,其它步骤和上述按单页拆分方案相同。
代码如下:
Option Explicit
Sub DynamicSplitPagesAsDocuments()
Dim oSrcDoc As Document, oNewDoc As Document
Dim strSrcName As String, strNewName As String
Dim oRange As Range
Dim nIndex As Integer, nSubIndex As Integer, nTotalPages As Integer, nBound As Integer
Dim fso As Object
Const nSteps = 3 //这里可以指定需要拆分的页数,如这里表示按照每3页拆分成一个小文档
Set fso = CreateObject("Scripting.FileSystemObject")
Set oSrcDoc = ActiveDocument
Set oRange = oSrcDoc.Content
nTotalPages = ActiveDocument.Content.Information(wdNumberOfPagesInDocument)
oRange.Collapse wdCollapseStart
oRange.Select
For nIndex = 1 To nTotalPages Step nSteps
Set oNewDoc = Documents.Add
If nIndex + nSteps > nTotalPages Then
nBound = nTotalPages
Else
nBound = nIndex + nSteps - 1
End If
For nSubIndex = nIndex To nBound
oSrcDoc.Activate
oSrcDoc.Bookmarks("\page").Range.Copy
oSrcDoc.Windows(1).Activate
Application.Browser.Target = wdBrowsePage
Application.Browser.Next
oNewDoc.Activate
oNewDoc.Windows(1).Selection.Paste
Next nSubIndex
strSrcName = oSrcDoc.FullName
strNewName = fso.BuildPath(fso.GetParentFolderName(strSrcName), _
fso.GetBaseName(strSrcName) & "_" & (nIndex \ nSteps) & "." & fso.GetExtensionName(strSrcName))
oNewDoc.SaveAs strNewName
oNewDoc.Close False
Next nIndex
Set oNewDoc = Nothing
Set oRange = Nothing
Set oSrcDoc = Nothing
Set fso = Nothing
MsgBox "结束!"
End Sub
注意:
如文档中有分节符分解后的文档会出现空白页,如要分解后不出现空白页,需要把文档中的分节符全部删除。
分节符若全部替换,要注意替换后文档可能会出现排版混乱,这则需要自己手动排版了。
分节符是指为表示节的结尾插入的标记。分节符包含节的格式设置元素,如页边距、页面的方向、页眉和页脚,以及页码的顺序。分节符用一条横贯屏幕的虚双线表示。
删除分节符的方法:
试着按住shift键,然后点击鼠标左键,然后将显示出来的分节符删掉即可。
分节符和分页符的区别:
分页符只是分页,前后还是同一节;
分节符是分节,可以同一页中不同节,也可以分节的同时下一页。
两者用法的最大区别在于页眉页脚与页面设置,比如:
1、文档编排中,某几页需要横排,或者需要不同的纸张、页边距等,那么将这几页单独设为一节,与前后内容不同节;
2、文档编排中,首页、目录等的页眉页脚、页码与正文部分需要不同,那么将首页、目录等作为单独的节;
3、如果前后内容的页面编排方式与页眉页脚都一样,只是需要新的一页开始新的一章,那么一般用分页符即可,当然用分节符(下一页)也行。
更多相关内容 -
批量对word文档进行操作
2022-02-11 15:42:46前面几章我们以经介绍了怎么批量对excel和ppt操作今天我们说说对word文档的批量操作 应用 python-docx允许您创建新文档以及对现有文档进行更改。实际上,它只允许您对现有文档进行更改;只是如果您从一个没有任何...导读
前面几章我们以经介绍了怎么批量对
excel
和ppt
操作今天我们说说对word文档
的批量操作应用
python-docx允许您创建新文档以及对现有文档进行更改。实际上,它只允许您对现有文档进行更改;只是如果您从一个没有任何内容的文档开始,一开始可能会觉得您是从头开始创建一个文档。
这个特性是一个强大的特性。文档的外观很大程度上取决于删除所有内容时留下的部分。样式、页眉和页脚等内容与主要内容分开包含,允许您在起始文档中进行大量自定义,然后出现在您生成的文档中。
让我们逐步完成创建文档的步骤,一次创建一个示例,从您可以对文档执行的两项主要操作开始,将其打开并保存。
我这里做一个简单的演示
还是先定义合并单元格函数,以便后续多次调用。由于处理Word中表格的代码与处理Excel不同,所以函数也要做微调。主要变化就是合并的函数表达,对于word中的表格,表达式是table.cell(row1,col1).merge(table.cell(row2,col2)),意思是将第row1行col1列到row2行col2列之间的表格合并(row2,col2要分别大于等于row1和col1)。需要注意的是cell(0,0)表示第一行第一列的单元格,以此类推。如下函数是在例28的基础上修改的。
#定义合并单元格的函数 def Merge_cells(table,target_list,start_row,col): ''' table: 是需要操作的表格 target_list: 是目标列表,即含有重复数据的列表 start_row: 是开始行,即表格中开始比对数据的行(需要将标题除开) col: 是需要处理数据的列 ''' start = 0 #开始行计数 end = 0 #结束行计数 reference = target_list[0] #设定基准,以列表中的第一个字符串开始 for i in range(len(target_list)): #遍历列表 if target_list[i] != reference: #开始比对,如果内容不同执行如下 reference = target_list[i] #基准变成列表中下一个字符串 end = i - 1 table.cell(start+start_row,col).merge(table.cell(end+start_row,col)) start = end + 1 if i == len(target_list) - 1: #遍历到最后一行,按如下操作 end = i table.cell(start+start_row,col).merge(table.cell(end+start_row,col))
然后需要读取word中相应表格里的数据,并提取出来,以便作为是否合并的判断基础。使用Document打开word文档,先查看一下其中表格的个数,以便我们锁定要处理的表格。由于word里面可能有隐藏表格,或者一个表格中有一段去掉了边框,让人看起来像是两个表格,直接在word中去数表格个数有时会不靠谱。通过len(doc.tables)看到,这个文档里面有2个表格。打开word文档,我们可以看到要处理的表格是第一个,即doc.tables[0]。如果情况较为复杂,我们可以打印表格中第一行单元格的内容进一步确认是否是我们需要处理的表格。确认好表格的序号后,就可以开始读取内容了。
from docx import Document doc = Document("收货记录.docx") print("这个工作表有 {} 个表格。\n".format(len(doc.tables))) #查看表格中的个数,以便锁定我们要处理的表格 print("第一个表格的第一行的单元格中的内容如下:") for i in doc.tables[0].rows[0].cells: #读取第一个表格的第一行的单元格中的内容 print(i.text) 第一个表格的第一行的单元格中的内容如下: 序号 供应商名称 货物编码 货物型号 货物说明 数量 日期
表格:
doc.tables[0].rows[0].cells[0].text '序号'
接着:
#读取word文档中的第一个表格的第二和第三列除标题和尾部总数行的数据 doc = Document("收货记录.docx") table = doc.tables[0] #已确定是第一个表格,其索引是0 supplier = [] #存储供应商名称 pn = [] #存储物料编码 max_row = len(table.rows) #获取第最大一行 print("表格共有{}行".format(max_row)) #读取第二行到29行,第2,3列中的数据 for i in range(1,max_row-1): supplier_name = table.rows[i].cells[1].text #cells[1]指表格第二列 supplier.append(supplier_name) for i in range(1,max_row-1): material_pn = table.rows[i].cells[2].text #cells[2]指表格第三列 pn.append(material_pn) print("获取到{}个供应商名称,{}个物料编码。".format(len(supplier),len(pn))) 表格共有30行 获取到28个供应商名称,28个物料编码。
Merge_cells(table,supplier,1,1) #开始合并行为2,索引为1;供应商名称是在2列,索引为1 Merge_cells(table,pn,1,2) #开始合并行为2,索引为1;物料编码是在3列,索引为2 doc.save("检查.docx")
到这一步,合并单元格算是完成了,但结果如下图所示,原单元格中的内容全部集中在一起,造成了重复内容。我们需要重写这些单元格以覆盖掉重复的内容,即可得到我们想要的结果。
结果:
细节介绍
关于
python-docx
库
链接:传送门
这里有关于操作的详细介绍
特别介绍
📣小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶
📣python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章,还有关于python自动化办公的库介绍可以让你快乐学python练手项目专栏
📣另外想学JavaWeb进厂的同学可以看看这个专栏:传送们
📣这是个冲刺大厂面试专栏还有算法比赛练习我们一起加油 上岸之路
点击直接资料领取
这里有python,Java学习资料还有有有趣好玩的编程项目,更有难寻的各种资源。反正看看也不亏。
-
word 文档里的文字为什么只显示一半呢?
2021-01-14 16:14:11打开后,zd可以看到文档中只显示了一半的回文本。2、选择要设置的文本,右键单击鼠标,然后单击要输入的段落。3、输入后,将页面切换到缩进和间距答。4、然后找到下面的行距,单击行距下拉按钮选择单行间距或最小值...因为设置了固定行距,导致部分文字无法显示,解决办法如下:1、首先打开要设置的文档。打开后,zd可以看到文档中只显示了一半的回文本。2、选择要设置的文本,右键单击鼠标,然后单击要输入的段落。3、输入后,将页面切换到缩进和间距答。4、然后找到下面的行距,单击行距下拉按钮选择单行间距或最小值。5、选择后,单击确定,以便您可以看到显示的所有字符www.mh456.com防采集。
因为设置百了固定行距,导致部分文字无法显示,设置方法如下:
Word文档里编辑文字的时候,一修改后面的字就自动删除,是因为Word进入了改写模式,解决方法: 1、电脑打开Word文档。2、打开Word文档编辑好文字,但是出现一个黑色框框把文字框住,这就是进入了
1、首先打度开需要设置的文档,打开了之后可以看到文档里面的文字只显示了一半。
WORD是目录里出现正文的文字,是因为正文使用了标题样式字体,将相关正文文本字体样式设置“正知文”,然后跟新目录即可消除。方法步骤如下: 1、打开需要操作的WORD文档,选中相关文本,在开始
2、选中问需要设置的文字,右键单击鼠标点击段落进入。
word文档中选中多个不在一起的文字,可借助Ctrl键实现选中。方法步骤如下: 1、打开需要操作的WORD文档,使用鼠标先选中任意相关文字。2、按住Ctrl键不放,在通过鼠标依次点击拖动即可继续选中不
3、进入了之后,将页面切换到答缩进和间距。
可能你的行距太小了,在“格式”菜单下打开“段落”,里面的行距调整一下就可以了
4、然后在下面找到行距,并点击行距的下拉按钮专,选择单倍行距或者是最小值。
1、电脑打开Word文档,然后选中倾斜的文字。2、选中文字后,点击文字选项中的倾斜图标。3、点击倾斜图标后,文字就不倾斜了。4、如果是复制过来的文字,点击鼠标右键,然后选择只粘贴文本。5、选择只粘贴
5、选择了属之后点击确定,这样就可以看到文字全部显示出来了,
word表格中文字显示不全的解决方法
word文档里的文字只显示一半zd的原因是:文字段落的行距设成了“固定值”,而固定值数值较小。在字体较大的情况下,为了保持行距的固定值,只能将文字显示一部分,如图:
版 解决方法如下:
方法一:
1、先选中文字,点击菜单中“格式”下的“段落”;
2、在“段落”对话框中点击“缩进和间距”,将行距下的“固定值”调整为“最小值”,或者“单倍行距”等其它行距。
说明:“固定值”的意思是永远保持设定的行距不变,“最小值”在字体较大而行距较小时会自动调整,将文字全部显示权出来。
方法二:将字体缩小,直到能完全显示。
说明:不建议使用这种方法。
以WPS 2019版为例
1、打开文档
2、选中表格,右键点击“自动调整”,进行设置即可~
把行距改大就可以了。具体:选中段落——右键——段落——缩进和间距——行距本回答被提问者采纳
内容来自www.mh456.com请勿采集。
-
如何将word文档转换为图片
2020-12-04 23:01:12前段时间换工作,在BOSS直聘上看到一个有意思的功能,上传docx格式的简历,能够以图片的形式在线预览,并且图片还添加了水印,笔者对此...image,通过两步可以最终实现该转换。一、环境准备首先进行环境准备工作,把...前段时间换工作,在BOSS直聘上看到一个有意思的功能,上传docx格式的简历,能够以图片的形式在线预览,并且图片还添加了水印,笔者对此比较感兴趣,就摸索着实现方法。网上逛了一圈,对于docx直接转图片这种转换没有什么有效的信息,不过结合获取的信息,笔者倒是想了一个曲线救国的法子,docx->pdf, pdf->image,通过两步可以最终实现该转换。
一、环境准备
首先进行环境准备工作,把需要用到的工具都安装配置好:
1、安装pandoc
Pandoc是由John MacFarlane开发的标记语言转换工具,可实现不同标记语言间的格式转换,堪称该领域中的“瑞士军刀”。该工具使用Haskell语言编写,以命令行形式实现与用户的交互,可支持多种操作系统。简而言之,pandoc就是一款转换工具,可以把格式A的文档转换为格式B的文档,就本文的目标来讲,主要用它实现了docx->pdf的转换。
根据系统类别选择对应的安装包,安装完成后将其安装目录添加到系统路径中,windows版本的安装完成后会自动添加,不用额外设置。
2、安装miktex
MikTex是一款基于Tex的排版引擎。TeX 在不同的硬件和操作系统上有不同的实现版本。这就像C语言,在不同的操作系统中有不同的编译系统,例如Linux 下的gcc,Windows 下的Visual C++ 等。有时,一种操作系统里也会有好几种的TeX系统。目前常见的Unix/Linux 下的TeX系统是Texlive,Windows 下则有MiKTeX和fpTeX。CTeX指的是CTeX中文套装的简称,是把MiKTeX和一些常用的相关工具,如GSview,WinEdt 等包装在一起制作的一个简易安装程序,并对其中的中文支持部分进行了配置,使得安装后马上就可以使用中文。
该排版工具是docx->pdf转换时不可获取的,否则无法实现转换。
下载地址:https://miktex.org/ 根据系统类别选择合适的版本,安装完成后将安装目录添加到系统路径。
3、安装poppler
代码实现中引用了一个开源库pdf2image,而这个库又引用了poppler,所以需要安装该环境。Poppler是一个基于xpdf-3.0的用于操作pdf的库,其中poppler-utils是建立在Poppler的库API上的工具集合,用于管理PDF和提取内容,主要工具如下:
pdfdetach – 从PDF中提取嵌入式文档;
pdffonts – 列出PDF中使用的字体;
pdfimages – 从PDF中以原始分辨率提取所有嵌入式图像;
pdfinfo – 列出PDF的所有信息;
pdfseparate – 从PDF中提取单个页面;
pdftocairo – 使用cairo将单页从PDF转换为矢量或位图格式;
pdftohtml – 将PDF转换为HTML格式的保留格式;
pdftoppm – 将PDF页面转换为位图;
pdftops – 将PDF转换为可打印的PS格式;
pdftotext – 从PDF中提取所有文本;
pdfunite – 合并几个PDF。
pdf2image使用了pdftoppm和pdfinfo这两个工具,用来将pdf转换为图片和获取pdf的文档页数,代码稍后会列出。
下载地址:https://github.com/Belval/pdf2image 根据系统类别选择对应的版本,安装完成后将安装目录下的bin目录添加到系统路径。
4、字体下载
用来生成水印时使用,笔者下载的是SimSun宋体,下载地址:https://www.fontke.com/font/10132367/download/,也可以下载其他字体,看个人选择。
完成上边四步环境就配置好了,笔者的电脑是Windows10,当然以上工具同样支持linux和mac环境,每个工具的官档都标注了支持的系统版本。环境配置好后接下来就是coding环节了,通过程序来实现转换过程的自动化调用,笔者会列出代码的目录结构,并依次说明其用途。
二、代码实现
关于实现这部分,笔者使用的开发语言是python36,以下为目录结构:
1、font目录
该目录存放的是下载好的字体文件,供代码中引用。
2、pdf目录
该目录存放转换之后的pdf文件。
3、target目录
该目录存放最终转换后的图片,图片为以时间戳命名的png图片,格式可以指定。
4、config.py
配置文件,存放了目录、图片大小、水印等配置,代码如下:
Python
import os
# 根目录
BASE_DIR = os.path.dirname(__file__)
# pdf默认输出路径
DEFAULT_OUTPUT_DIR = os.path.join(BASE_DIR, 'pdf')
# 最终生成的图片存放在此目录
TARGET_DIR = os.path.join(BASE_DIR, 'target')
# 水印字体
FONT_FILE = os.path.join(BASE_DIR, "font/simsun.ttf")
# 单张图片的宽高,PIL支持图片的最大宽度1700
IMAGE_WIDTH = 1700
IMAGE_HEIGHT = 2200
# 水印位置-left和top
WATERMARK_LEFT = 0
WATERMARK_TOP = 1800
# 水印图片背景色-白色透明,最后一位表示透明度0~255,0为透明
BACKGROUND_COLOR = (255, 255, 255, 0)
#水印字体颜色-红色 60透明度
FONT_COLOR = (255, 0, 0, 60)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
importos
# 根目录
BASE_DIR=os.path.dirname(__file__)
# pdf默认输出路径
DEFAULT_OUTPUT_DIR=os.path.join(BASE_DIR,'pdf')
# 最终生成的图片存放在此目录
TARGET_DIR=os.path.join(BASE_DIR,'target')
# 水印字体
FONT_FILE=os.path.join(BASE_DIR,"font/simsun.ttf")
# 单张图片的宽高,PIL支持图片的最大宽度1700
IMAGE_WIDTH=1700
IMAGE_HEIGHT=2200
# 水印位置-left和top
WATERMARK_LEFT=0
WATERMARK_TOP=1800
# 水印图片背景色-白色透明,最后一位表示透明度0~255,0为透明
BACKGROUND_COLOR=(255,255,255,0)
#水印字体颜色-红色 60透明度
FONT_COLOR=(255,0,0,60)
5、doc2pdf.py
该模块封装了pandoc命令行工具的调用,实现了docx文档到pdf的转换过程
Python
import os
import uuid
from subprocess import Popen, PIPE
def _load_doc(doc):
doc = str(doc)
if not os.path.exists(doc):
raise FileNotFoundError("file {} not found".format(doc))
_, doc_name = os.path.split(doc)
if not doc_name.endswith('.docx'):
raise TypeError("Only support word doc with suffix '.docx'")
return doc
def _build_command(doc_path, output_dir, pdf_name=None, pdf_engine=None):
args = ['pandoc', '--pdf-engine=xelatex']
# args = ['pandoc', '--pdf-engine=lualatex']
if pdf_engine is not None:
# MikTex包含了两种pandoc支持的Tex
if pdf_engine not in ("xelatex", "lualatex"):
raise ValueError("not supported pdf-engine: {}".format(pdf_engine))
else:
args[1] = '--pdf-engine={}'.format(pdf_engine)
if pdf_name is None:
pdf_name = str(uuid.uuid4()) + '.pdf'
if not os.path.isdir(output_dir):
raise NotADirectoryError("{} is not a existed directory".format(output_dir))
pdf_path = os.path.join(output_dir, pdf_name)
args.append('-o')
args.append(pdf_path)
args.append(doc_path)
# 设置字体避免中文乱码无法输出问题,SimSun是宋体, MicrosoftYaHei是微软雅黑
args.append('-V')
args.append('mainfont="MicrosoftYaHei"')
# args.append('-V')
# args.append('margin-left=0in')
return args, pdf_path
def doc2pdf(source, pdf_path):
doc_path = _load_doc(source)
cmd, output_pdf = _build_command(doc_path, pdf_path)
# run cmd
print("doc to pdf, converting...")
Popen(cmd, stderr=PIPE, stdout=PIPE).communicate()
print("job done!")
return output_pdf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
importos
importuuid
fromsubprocessimportPopen,PIPE
def_load_doc(doc):
doc=str(doc)
ifnotos.path.exists(doc):
raiseFileNotFoundError("file {} not found".format(doc))
_,doc_name=os.path.split(doc)
ifnotdoc_name.endswith('.docx'):
raiseTypeError("Only support word doc with suffix '.docx'")
returndoc
def_build_command(doc_path,output_dir,pdf_name=None,pdf_engine=None):
args=['pandoc','--pdf-engine=xelatex']
# args = ['pandoc', '--pdf-engine=lualatex']
ifpdf_engineisnotNone:
# MikTex包含了两种pandoc支持的Tex
ifpdf_enginenotin("xelatex","lualatex"):
raiseValueError("not supported pdf-engine: {}".format(pdf_engine))
else:
args[1]='--pdf-engine={}'.format(pdf_engine)
ifpdf_nameisNone:
pdf_name=str(uuid.uuid4())+'.pdf'
ifnotos.path.isdir(output_dir):
raiseNotADirectoryError("{} is not a existed directory".format(output_dir))
pdf_path=os.path.join(output_dir,pdf_name)
args.append('-o')
args.append(pdf_path)
args.append(doc_path)
# 设置字体避免中文乱码无法输出问题,SimSun是宋体, MicrosoftYaHei是微软雅黑
args.append('-V')
args.append('mainfont="MicrosoftYaHei"')
# args.append('-V')
# args.append('margin-left=0in')
returnargs,pdf_path
defdoc2pdf(source,pdf_path):
doc_path=_load_doc(source)
cmd,output_pdf=_build_command(doc_path,pdf_path)
# run cmd
print("doc to pdf, converting...")
Popen(cmd,stderr=PIPE,stdout=PIPE).communicate()
print("job done!")
returnoutput_pdf
6、pdf2image.py
一个开源的python库,只包含了一个文件,笔者直接复制过来使用的。主要封装了poppler的命令行调用,实现pdf到图片的转换。
Python
"""
pdf2image is a light wrapper for the poppler-utils tools that can convert your
PDFs into Pillow images.
"""
import os
import re
import tempfile
import uuid
from io import BytesIO
from subprocess import Popen, PIPE
from PIL import Image
def convert_from_path(pdf_path, dpi=200, output_folder=None, first_page=None, last_page=None, fmt='ppm', thread_count=1, userpw=None):
"""
Description: Convert PDF to Image will throw whenever one of the condition is reached
Parameters:
pdf_path -> Path to the PDF that you want to convert
dpi -> Image quality in DPI (default 200)
output_folder -> Write the resulting images to a folder (instead of directly in memory)
first_page -> First page to process
last_page -> Last page to process before stopping
fmt -> Output image format
thread_count -> How many threads we are allowed to spawn for processing
userpw -> PDF's password
"""
page_count = __page_count(pdf_path, userpw)
if thread_count < 1:
thread_count = 1
if first_page is None:
first_page = 1
if last_page is None or last_page > page_count:
last_page = page_count
# Recalculate page count based on first and last page
page_count = last_page - first_page + 1
if thread_count > page_count:
thread_count = page_count
reminder = page_count % thread_count
current_page = first_page
processes = []
for _ in range(thread_count):
# A unique identifier for our files if the directory is not empty
uid = str(uuid.uuid4())
# Get the number of pages the thread will be processing
thread_page_count = page_count // thread_count + int(reminder > 0)
# Build the command accordingly
args, parse_buffer_func = __build_command(['pdftoppm', '-r', str(dpi), pdf_path], output_folder, current_page, current_page + thread_page_count - 1, fmt, uid, userpw)
# Update page values
current_page = current_page + thread_page_count
reminder -= int(reminder > 0)
# Spawn the process and save its uuid
processes.append((uid, Popen(args, stdout=PIPE, stderr=PIPE)))
images = []
for uid, proc in processes:
data, _ = proc.communicate()
if output_folder is not None:
images += __load_from_output_folder(output_folder, uid)
else:
images += parse_buffer_func(data)
return images
def convert_from_bytes(pdf_file, dpi=200, output_folder=None, first_page=None, last_page=None, fmt='ppm', thread_count=1, userpw=None):
"""
Description: Convert PDF to Image will throw whenever one of the condition is reached
Parameters:
pdf_file -> Bytes representing the PDF file
dpi -> Image quality in DPI
output_folder -> Write the resulting images to a folder (instead of directly in memory)
first_page -> First page to process
last_page -> Last page to process before stopping
fmt -> Output image format
thread_count -> How many threads we are allowed to spawn for processing
userpw -> PDF's password
"""
with tempfile.NamedTemporaryFile('wb') as f:
f.write(pdf_file)
f.flush()
return convert_from_path(f.name, dpi=dpi, output_folder=output_folder, first_page=first_page, last_page=last_page, fmt=fmt, thread_count=thread_count, userpw=userpw)
def pdf_page_count(pdf, password=None):
return __page_count(pdf, password)
def __build_command(args, output_folder, first_page, last_page, fmt, uid, userpw):
if first_page is not None:
args.extend(['-f', str(first_page)])
if last_page is not None:
args.extend(['-l', str(last_page)])
parsed_format, parse_buffer_func = __parse_format(fmt)
if parsed_format != 'ppm':
args.append('-' + parsed_format)
if output_folder is not None:
args.append(os.path.join(output_folder, uid))
if userpw is not None:
args.extend(['-upw', userpw])
return args, parse_buffer_func
def __parse_format(fmt):
if fmt[0] == '.':
fmt = fmt[1:]
if fmt == 'jpeg' or fmt == 'jpg':
return 'jpeg', __parse_buffer_to_jpeg
if fmt == 'png':
return 'png', __parse_buffer_to_png
# Unable to parse the format so we'll use the default
return 'ppm', __parse_buffer_to_ppm
def __parse_buffer_to_ppm(data):
images = []
index = 0
while index < len(data):
code, size, rgb = tuple(data[index:index + 40].split(b'\n')[0:3])
size_x, size_y = tuple(size.split(b' '))
file_size = len(code) + len(size) + len(rgb) + 3 + int(size_x) * int(size_y) * 3
images.append(Image.open(BytesIO(data[index:index + file_size])))
index += file_size
return images
def __parse_buffer_to_jpeg(data):
return [
Image.open(BytesIO(image_data + b'\xff\xd9'))
for image_data in data.split(b'\xff\xd9')[:-1] # Last element is obviously empty
]
def __parse_buffer_to_png(data):
images = []
index = 0
while index < len(data):
file_size = data[index:].index(b'IEND') + 8 # 4 bytes for IEND + 4 bytes for CRC
images.append(Image.open(BytesIO(data[index:index+file_size])))
index += file_size
return images
def __page_count(pdf_path, userpw=None):
try:
if userpw is not None:
proc = Popen(["pdfinfo", pdf_path, '-upw', userpw], stdout=PIPE, stderr=PIPE)
else:
proc = Popen(["pdfinfo", pdf_path], stdout=PIPE, stderr=PIPE)
out, err = proc.communicate()
except:
raise Exception('Unable to get page count. Is poppler installed and in PATH?')
try:
# This will throw if we are unable to get page count
return int(re.search(r'Pages:\s+(\d+)', out.decode("utf8", "ignore")).group(1))
except:
raise Exception('Unable to get page count. %s' % err.decode("utf8", "ignore"))
def __load_from_output_folder(output_folder, uid):
return [Image.open(os.path.join(output_folder, f)) for f in sorted(os.listdir(output_folder)) if uid in f]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
"""
pdf2image is a light wrapper for the poppler-utils tools that can convert your
PDFs into Pillow images.
"""
importos
importre
importtempfile
importuuid
fromioimportBytesIO
fromsubprocessimportPopen,PIPE
fromPILimportImage
defconvert_from_path(pdf_path,dpi=200,output_folder=None,first_page=None,last_page=None,fmt='ppm',thread_count=1,userpw=None):
"""
Description: Convert PDF to Image will throw whenever one of the condition is reached
Parameters:
pdf_path -> Path to the PDF that you want to convert
dpi -> Image quality in DPI (default 200)
output_folder -> Write the resulting images to a folder (instead of directly in memory)
first_page -> First page to process
last_page -> Last page to process before stopping
fmt -> Output image format
thread_count -> How many threads we are allowed to spawn for processing
userpw -> PDF's password
"""
page_count=__page_count(pdf_path,userpw)
ifthread_count<1:
thread_count=1
iffirst_pageisNone:
first_page=1
iflast_pageisNoneorlast_page>page_count:
last_page=page_count
# Recalculate page count based on first and last page
page_count=last_page-first_page+1
ifthread_count>page_count:
thread_count=page_count
reminder=page_count%thread_count
current_page=first_page
processes=[]
for_inrange(thread_count):
# A unique identifier for our files if the directory is not empty
uid=str(uuid.uuid4())
# Get the number of pages the thread will be processing
thread_page_count=page_count//thread_count+int(reminder>0)
# Build the command accordingly
args,parse_buffer_func=__build_command(['pdftoppm','-r',str(dpi),pdf_path],output_folder,current_page,current_page+thread_page_count-1,fmt,uid,userpw)
# Update page values
current_page=current_page+thread_page_count
reminder-=int(reminder>0)
# Spawn the process and save its uuid
processes.append((uid,Popen(args,stdout=PIPE,stderr=PIPE)))
images=[]
foruid,procinprocesses:
data,_=proc.communicate()
ifoutput_folderisnotNone:
images+=__load_from_output_folder(output_folder,uid)
else:
images+=parse_buffer_func(data)
returnimages
defconvert_from_bytes(pdf_file,dpi=200,output_folder=None,first_page=None,last_page=None,fmt='ppm',thread_count=1,userpw=None):
"""
Description: Convert PDF to Image will throw whenever one of the condition is reached
Parameters:
pdf_file -> Bytes representing the PDF file
dpi -> Image quality in DPI
output_folder -> Write the resulting images to a folder (instead of directly in memory)
first_page -> First page to process
last_page -> Last page to process before stopping
fmt -> Output image format
thread_count -> How many threads we are allowed to spawn for processing
userpw -> PDF's password
"""
withtempfile.NamedTemporaryFile('wb')asf:
f.write(pdf_file)
f.flush()
returnconvert_from_path(f.name,dpi=dpi,output_folder=output_folder,first_page=first_page,last_page=last_page,fmt=fmt,thread_count=thread_count,userpw=userpw)
defpdf_page_count(pdf,password=None):
return__page_count(pdf,password)
def__build_command(args,output_folder,first_page,last_page,fmt,uid,userpw):
iffirst_pageisnotNone:
args.extend(['-f',str(first_page)])
iflast_pageisnotNone:
args.extend(['-l',str(last_page)])
parsed_format,parse_buffer_func=__parse_format(fmt)
ifparsed_format!='ppm':
args.append('-'+parsed_format)
ifoutput_folderisnotNone:
args.append(os.path.join(output_folder,uid))
ifuserpwisnotNone:
args.extend(['-upw',userpw])
returnargs,parse_buffer_func
def__parse_format(fmt):
iffmt[0]=='.':
fmt=fmt[1:]
iffmt=='jpeg'orfmt=='jpg':
return'jpeg',__parse_buffer_to_jpeg
iffmt=='png':
return'png',__parse_buffer_to_png
# Unable to parse the format so we'll use the default
return'ppm',__parse_buffer_to_ppm
def__parse_buffer_to_ppm(data):
images=[]
index=0
whileindex
code,size,rgb=tuple(data[index:index+40].split(b'\n')[0:3])
size_x,size_y=tuple(size.split(b' '))
file_size=len(code)+len(size)+len(rgb)+3+int(size_x)*int(size_y)*3
images.append(Image.open(BytesIO(data[index:index+file_size])))
index+=file_size
returnimages
def__parse_buffer_to_jpeg(data):
return[
Image.open(BytesIO(image_data+b'\xff\xd9'))
forimage_dataindata.split(b'\xff\xd9')[:-1]# Last element is obviously empty
]
def__parse_buffer_to_png(data):
images=[]
index=0
whileindex
file_size=data[index:].index(b'IEND')+8# 4 bytes for IEND + 4 bytes for CRC
images.append(Image.open(BytesIO(data[index:index+file_size])))
index+=file_size
returnimages
def__page_count(pdf_path,userpw=None):
try:
ifuserpwisnotNone:
proc=Popen(["pdfinfo",pdf_path,'-upw',userpw],stdout=PIPE,stderr=PIPE)
else:
proc=Popen(["pdfinfo",pdf_path],stdout=PIPE,stderr=PIPE)
out,err=proc.communicate()
except:
raiseException('Unable to get page count. Is poppler installed and in PATH?')
try:
# This will throw if we are unable to get page count
returnint(re.search(r'Pages:\s+(\d+)',out.decode("utf8","ignore")).group(1))
except:
raiseException('Unable to get page count. %s'%err.decode("utf8","ignore"))
def__load_from_output_folder(output_folder,uid):
return[Image.open(os.path.join(output_folder,f))forfinsorted(os.listdir(output_folder))ifuidinf]
7、main.py
入口主程序,传入doc文档,得到png图片^_^
Python
import os
import time
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw
from config import *
from pdf2image import convert_from_path, pdf_page_count
from doc2pdf import doc2pdf
def doc2image(doc, fmt='png', output_dir=None, watermark=None, fpage=None, lpage=None):
if output_dir is None:
output_dir = TARGET_DIR
target_name = os.path.join(output_dir, "{}.{}".format(int(time.time()), fmt))
temp_pdf = doc2pdf(doc, pdf_path=DEFAULT_OUTPUT_DIR)
if fpage is None:
fpage = 1
if lpage is not None:
page_count = lpage - fpage + 1
else:
page_count = pdf_page_count(temp_pdf)
print("pdf to image, converting...")
to_image = _convert_pdf_to_image(temp_pdf, page_count, fmt, fpage, lpage)
if watermark is not None:
watermark_image = _make_watermark_image(to_image.size, watermark, page_count)
# 合并内容图片和水印图片
out = Image.alpha_composite(to_image, watermark_image)
# out.show()
# 转换为RGB模式才可保存为图片
out.convert("RGB").save(target_name)
else:
to_image.save(target_name)
print("job done!")
def _convert_pdf_to_image(pdf, page_count, fmt, f, l, save=False):
'''
params:
pdf: 待转换的pdf文件路径
page_count: 要转换的页数
fmt: 转换的图片格式
f: 要转换的开始页数
l: 结束页数
save: 是否保留pdf文件,默认不保留
'''
# 根据页数转换为相应数量的图片
image_list = convert_from_path(pdf, fmt=fmt, first_page=f, last_page=l)
target_name = os.path.join(TARGET_DIR, "{}.{}".format(int(time.time()), fmt))
to_image = Image.new('RGBA', (IMAGE_WIDTH, page_count * IMAGE_HEIGHT))
for i, image in enumerate(image_list):
# 计算高度,拼合单张图片到一整张图片上
loc = (0, i * IMAGE_HEIGHT)
to_image.paste(image, loc)
if not save:
try:
os.remove(pdf)
except Exception as e:
print("fail to remove pdf, please check and remove it manually")
return to_image
def _make_watermark_image(image_size, watermark, count=1):
'''
生成水印图片
params:
image_size: 水印图片大小,与底板图片大小一致
watermark: 水印文本
count: 水印数量, 与内容页数保持一致
'''
fnt = ImageFont.truetype(font=FONT_FILE, size=80)
watermark_image = Image.new('RGBA', image_size, color=BACKGROUND_COLOR)
draw = ImageDraw.Draw(watermark_image)
for i in range(1, count+1):
draw.multiline_text((WATERMARK_LEFT, WATERMARK_TOP * i), watermark, font=fnt, fill=FONT_COLOR)
return watermark_image
if __name__ == '__main__':
txt = "玩点coding https://vdcoding.com"
doc = "resume.docx"
doc2image(doc, watermark=txt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
importos
importtime
fromPILimportImage
fromPILimportImageFont
fromPILimportImageDraw
fromconfigimport*
frompdf2imageimportconvert_from_path,pdf_page_count
fromdoc2pdfimportdoc2pdf
defdoc2image(doc,fmt='png',output_dir=None,watermark=None,fpage=None,lpage=None):
ifoutput_dirisNone:
output_dir=TARGET_DIR
target_name=os.path.join(output_dir,"{}.{}".format(int(time.time()),fmt))
temp_pdf=doc2pdf(doc,pdf_path=DEFAULT_OUTPUT_DIR)
iffpageisNone:
fpage=1
iflpageisnotNone:
page_count=lpage-fpage+1
else:
page_count=pdf_page_count(temp_pdf)
print("pdf to image, converting...")
to_image=_convert_pdf_to_image(temp_pdf,page_count,fmt,fpage,lpage)
ifwatermarkisnotNone:
watermark_image=_make_watermark_image(to_image.size,watermark,page_count)
# 合并内容图片和水印图片
out=Image.alpha_composite(to_image,watermark_image)
# out.show()
# 转换为RGB模式才可保存为图片
out.convert("RGB").save(target_name)
else:
to_image.save(target_name)
print("job done!")
def_convert_pdf_to_image(pdf,page_count,fmt,f,l,save=False):
'''
params:
pdf: 待转换的pdf文件路径
page_count: 要转换的页数
fmt: 转换的图片格式
f: 要转换的开始页数
l: 结束页数
save: 是否保留pdf文件,默认不保留
'''
# 根据页数转换为相应数量的图片
image_list=convert_from_path(pdf,fmt=fmt,first_page=f,last_page=l)
target_name=os.path.join(TARGET_DIR,"{}.{}".format(int(time.time()),fmt))
to_image=Image.new('RGBA',(IMAGE_WIDTH,page_count*IMAGE_HEIGHT))
fori,imageinenumerate(image_list):
# 计算高度,拼合单张图片到一整张图片上
loc=(0,i*IMAGE_HEIGHT)
to_image.paste(image,loc)
ifnotsave:
try:
os.remove(pdf)
exceptExceptionase:
print("fail to remove pdf, please check and remove it manually")
returnto_image
def_make_watermark_image(image_size,watermark,count=1):
'''
生成水印图片
params:
image_size: 水印图片大小,与底板图片大小一致
watermark: 水印文本
count: 水印数量, 与内容页数保持一致
'''
fnt=ImageFont.truetype(font=FONT_FILE,size=80)
watermark_image=Image.new('RGBA',image_size,color=BACKGROUND_COLOR)
draw=ImageDraw.Draw(watermark_image)
foriinrange(1,count+1):
draw.multiline_text((WATERMARK_LEFT,WATERMARK_TOP*i),watermark,font=fnt,fill=FONT_COLOR)
returnwatermark_image
if__name__=='__main__':
txt="玩点coding https://vdcoding.com"
doc="resume.docx"
doc2image(doc,watermark=txt)
三、待完善的地方
笔者从网上下载了份docx格式的简历模板,通过上边的程序转换后得到的图片如下:
从图中可以看到个人信息部分的样式跑偏了,这部分是在docx->pdf过程中的排版引擎决定的,所以想要获得完美的图片,先要好好研究下排版引擎的使用,排版引擎可以加载多种扩展包,用来支持不同的排版格式。笔者只是兴趣使然,在短时间内实现了docx到图片的转换,没有深入研究排版引擎部分。关于这种转换笔者能力有限,只能以这种繁琐的方式实现,不过笔者倒是很好奇BOSS直聘是如何实现的,如果有机会真心希望交流一下。
-
word文档保存提示内存不足怎么办
2021-07-25 00:46:50《word文档保存提示内存不足怎么办》由会员分享,可在线阅读,更多相关《word文档保存提示内存不足怎么办(5页珍藏版)》请在人人文库网上搜索。1、word文档保存提示内存不足怎么办可能有些网友会遇到word文档保存提示... -
word文档中表格顶头怎么调整_简单好用的Word技巧(全)
2020-11-13 23:01:34只需要选中文字,在标尺处点击想要对齐到的位置:然后使用Tab键就能完成内容的对齐:一键处理标题、分页在内容超多的文档中,我们总会需要统一标题的字体、大小等等,你会怎么操作?一定也是逐个的选中,再进行调整... -
c# 实现打开word和excel文档 显示在gridview中 最大值 最小值 平均值
2012-11-18 21:54:28这是一个能够打开word文档和excel文档的程序,并且能够将excel中的内容显示到dategridview中,并且能够分析表格中的数据 -
一、使用Python对word文档进行操作
2021-02-18 14:14:39说白了,python就相当于windows操作系统,QQ就是跑在windows操作系统上的软件,QQ最大的作用是可以去聊天,说话。 在这里python-docx就相当于这里的qq 它主要的功能是对docx文件进行操作,管理等.(个人理解,非专业!... -
Python写入word文档
2019-09-25 00:48:53file=docx.Document()#创建内存中的word文档对象 file.add_paragraph("窗前明月光")#写入若干段落 file.add_paragraph("疑是地上霜") file.add_paragraph("举头望明月") file.add_paragraph("低头思故乡") file.save... -
word文档中表格顶头怎么调整_word使用技巧之-Word文字处理技巧,学会不求人!...
2020-10-27 00:49:09假期最后一天,明天就要上班了,今天给大家分享20个Word实用技巧,希望你们能够喜欢。01、一键选择同样的内容编辑Word时,如果需要将相同样式的内容全选复制出去该怎么办呢?你是按住Ctrl键一个个的拖动鼠标选中吗?... -
Word2007宝典
2018-11-29 11:49:25Word2007在工具的细化方面做得很好,一个最大特点就是提供了很多可以满足不同风格的模板,熟悉并善于使用这些模板必将会使您的文档更加专业、精美。另外Word2007一个突出的亮点就是增加了“SmartArt”工具,它使用户... -
API接口文档中将Swagger文档转Word 文档
2019-05-07 09:15:00这个时候,SA systeam admin 就会开始直接让开发改代码了,比如增加一个入参,入参名进行一些变化,比如比天性进行变化,比如字符串类型修改最大长度,etc. 你会说,不行啊,要走变更流程啊,先更新接口说明文档啊 ... -
WordCAT 一款功能强大、免费共享的Word文档计算机辅助翻译软件
2021-02-08 15:23:56该插件充分利用Office Word编辑排版功能和谷歌、微软提供的机器翻译服务, 实现多种语言之间的机器翻译和人工翻译,可有效提高文字翻译效率, 是外语文档阅读和文字翻译工作者的得力助手。 官网 ... -
用Word打印特大字
2021-07-01 20:34:57而有时因为各种工作的需要,如做大标语、大横幅剪字、装饰或制作广告等,往往需要打印出比较大的字来。但可惜的是,一般情况下,一些常见的字处理软件只能够处理有限字号的字,并不能够满足我们打印大字地的要求。... -
word文档表格中间出现空白怎么解决
2021-06-25 05:27:30话题:word文档表格中间出现空白怎么解决?回答:word和execl使用技巧在Word中我们可以把着重号请到工具栏上。打开“工具—自定义”命令选项,打开“自定义”对话框。在“命令”卡下的“类别”栏里选中“所有命令”... -
教你怎么使用Python对word文档进行操作
2019-09-29 20:34:29说白了,python就相当于windows操作系统,QQ就是跑在windows操作系统上的软件,QQ最大的作用是可以去聊天,说话。 在这里python-docx就相当于这里的qq 它主要的功能是对docx文件进行操作,管理等.(个... -
【QT】word文档操作实例——根据word模板生成word报表
2020-07-26 12:47:27一、word模板准备 模板的准备至关重要,而其中更重要的是模板中书签的设置命名,因为接下来的程序代码中,程序就是根据书签的名字,来定位word文档中的位置,从而进行数据的插入修改 当设计好表格,并且设计好书签... -
QT 如何将 word文档嵌入窗体
2016-01-22 02:59:54#include "mainwindow.h" #include #include #include #include #include ... word.setControl(QString::fromUtf8("{000209FF-0000-0000-C000-...要的效果就是 word文档嵌入窗体。 请提供可行的代码或者链接 -
js 导出word 文档 doc docx
2019-11-11 14:32:27在做项目时,要将富文本编辑器,或是html内容 导出为word。 先引入文件保存js ...docx体积更小,而且word2007也可以打开 1.引用插件html-docx.js <script src="html-docx.js"></script>... -
使用python将word文档转换为PDF文档
2020-11-25 20:32:00欢迎关注”生信修炼手册”!对于windows系统的编程开发,微软一开始提供了基于VB语言的接口,后来又推出了.NET框架。对于word等offices套件的自动化操作,由于原生支持的特性... -
如何把office word文档存为网页格式?(图解)
2021-06-11 02:53:56使用word2003提供的“另存为”或“另存为Web页”命令可以把文档保存为网页格式,word将删除不支持的格式设置并应用Web浏览器支持的设置。...Word文档另存为Web页的步骤为:1.执行“文件”菜单的“另存为…”(或... -
Python 实现批量生成 Word 文档:市民水电费缴费通知单
2020-07-14 10:49:28介绍一个用 Python docx和xlrd模块,对已有的Word模板与需求,对模板文件进行修改,然后批量生成多个Word文档的实例。 -
Word文件恢复 V2.0 绿色版(修复各种坏损的Word文档)
2011-12-16 18:45:55宏宇Word文件修复向导,是专门针对受损的 Word文件进行修复的软件,可以修复因各种原因坏损的Word文档,绿色国产,针对Word中文版本内码进行了专门优化设计,修复结果采用TXT与 DOC方式进行输出。可以修复Word软件... -
Python-docx 读写 Word 文档:插入图片、表格,设置表格样式,章节,页眉页脚等
2020-07-01 20:29:35主要介绍 word 文档中插入图片、设置图片大小;插入表格、设置表格样式、字体样式;章节设置:页面大小、边距等;设置页眉页脚等方法。 -
计算机WORD选择题.doc
2022-06-13 21:59:38一、单选题 1、在Word 2003主窗口呈最大化显示时,该窗口的右上角可以同时显示的按钮是_____按钮。 A:最小化、还原、最大化 B:还原、最大化和关闭 C:最小化、还原和关闭 D:还原和最大化 答案:C 2、如果想在Word... -
【牛客】新建 Microsoft Office Word 文档题解
2020-05-20 15:06:59CSL发现,当他新建一个word文档时,会得到一个名为"新建 Microsoft Office Word 文档.doc"的文件,再新建一个,则名为"新建 Microsoft Office Word 文档(2).doc",再新建,便是"新建 Microsoft Office Word 文档(3).... -
Python-docx 读写 Word 文档:读取正文、表格文本信息、段落格式、字体格式等
2021-01-30 03:30:45Python-docx 模块读写 Word 文档基础(三):读取文档文本信息、表格信息、段落格式、字体格式等前言:1、获取文档章节信息:2、获取段落文字信息:3、获取文字格式信息:4、获取文档中表格信息:结尾:【Python与... -
Python-docx 模块读写 Word 文档基础(一):创建文档、段落格式、字体格式设置方法
2020-06-29 22:33:29Python-docx 模块读写 Word 文档基础(一):创建文档、段落格式、字体格式设置方法前言:1、创建 Word 文档及基础用法:2、段落格式设置:3、字体格式设置:结尾:【Python与Word文档】专栏 前言: 从这篇博客开始...