办公需求:
每月需要将班级周计划docx的第一页上传到班级网页中,由于周计划内有大量表格,因此我一般是用微信的ALT+A功能对周计划页面进行截图,将固定内容的图片上传网页。其中有两个问题:
1、无法批量截图:每月四份周计划,需要逐一打开文本,截图,保存,输入名称
2、难以统一选框范围:ALT+A截图时,需要手动控制选框范围。无法保证每份周计划的截取的大小相同。
编程需求:
Word(docx)批量转成JPG图片
代码实现:
一、转载代码
通过大量搜索代码,我找到了一个将docx通过PDF转成png图片的代码。测试可用。
此代码可以将“桌面上的word2pdf2png‘文件夹里的所有docx文件’依次转成PDF和png。效果如下:
1、素材和文件名(位置在桌面\word2pdf2png文件夹)
2、生成效果(位置在桌面\word2pdf2png文件夹)
文件夹内包含内容:
1、原文件docx
2、生成的PDF
3、生成的png(多张,比如第一周docx内有4页,所以生成4张png)
三、转载代码
''' 作者:毛毛 性质:转载 原网址 https://zhuanlan.zhihu.com/p/367985422 安装python,确保以下模块已经安装:win32com,fitz,re 在桌面新建文件夹,命名为:word2pdf2png 将需要转换的word(只能docx格式,可以多个)放入文件夹word2pdf2png 复制以下代码并运行。 本代码只生成png 文件夹内只有一级,子文件不生成 ''' #coding=utf-8 from win32com.client import Dispatch import os import re import fitz wdFormatPDF = 17 #转换的类型 zoom_x=5 #尺寸大小,越大图片越清晰 zoom_y=5 #尺寸大小,越大图片越清晰,长宽保持一致 rotation_angle=0#旋转的角度,0为不旋转 def doc2pdf2png(input_file): for root, dirs, files in os.walk(input_file): for file in files: if re.search('\.(docx|doc)$', file): filename = os.path.abspath(root + "\\" + file) print('filename', filename) word = Dispatch('Word.Application') doc = word.Documents.Open(filename) doc.SaveAs(filename.replace(".docx", ".pdf"), FileFormat=wdFormatPDF) doc.Close() word.Quit() for root, dirs, files in os.walk(input_file): for file in files: if re.search('\.pdf$', file): filename = os.path.abspath(root + "\\" + file) print('filename', filename) # 打开PDF文件 pdf = fitz.open(filename) # 逐页读取PDF for pg in range(0, pdf.pageCount): page = pdf[pg] # 设置缩放和旋转系数 trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle) pm = page.getPixmap(matrix=trans, alpha=False) # 开始写图像 pm.writePNG(filename.replace('.pdf', '') + str(pg+1) + ".png") pdf.close()
二、修改后的代码——删除PDF和Word,只留下png的第1页
援引的代码解决了批量docx转png的问题,但是不符合我的需求:
我希望文件夹里只留下每份Word中第一页的png图片,以便上传。
为此我搜索CSDN中的相关信息,添加了一个删除指令,并在马先生指导下,运用f'{}和正则的方法,减少了删除代码段的长度。具体效果和代码如下:
(一)素材及位置
1、素材和文件名(位置在桌面\word2pdf2png文件夹)
(二)生成效果(位置在桌面\word2pdf2png文件夹)
文件夹内包含内容:
1、保留每个word生成的第1张png,尾数是1
(三)转载代码 添加后的代码段
'''
作者:毛毛
性质:转载
原网址https://zhuanlan.zhihu.com/p/367985422afd
修改:阿夏
性质:添加部分段落
安装python,确保以下模块已经安装:win32com,fitz,re
在桌面新建文件夹,命名为:word2pdf2png
将需要转换的word(只能docx格式,可以多个)放入文件夹word2pdf2png
复制以下代码并运行。
本代码只生成png 文件夹内只有一级,子文件不生成
'''
#coding=utf-8
from win32com.client import Dispatch
import os
import re
import fitz
wdFormatPDF = 17 #转换的类型
zoom_x=5 #尺寸大小,越大图片越清晰
zoom_y=5 #尺寸大小,越大图片越清晰,长宽保持一致
rotation_angle=0#旋转的角度,0为不旋转
def doc2pdf2png(input_file):
for root, dirs, files in os.walk(input_file):
for file in files:
if re.search('\.(docx|doc)$', file):
filename = os.path.abspath(root + "\\" + file)
print('filename', filename)
word = Dispatch('Word.Application')
doc = word.Documents.Open(filename)
doc.SaveAs(filename.replace(".docx", ".pdf"), FileFormat=wdFormatPDF)
doc.Close()
word.Quit()
for root, dirs, files in os.walk(input_file):
for file in files:
if re.search('\.pdf$', file):
filename = os.path.abspath(root + "\\" + file)
print('filename', filename)
# 打开PDF文件
pdf = fitz.open(filename)
# 逐页读取PDF
for pg in range(0, pdf.pageCount):
page = pdf[pg]
# 设置缩放和旋转系数
trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle)
pm = page.getPixmap(matrix=trans, alpha=False)
# 开始写图像
pm.writePNG(filename.replace('.pdf', '') + str(pg+1) + ".png")
pdf.close()
mydesktop=os.path.join(os.path.expanduser('~'), "Desktop")
print(mydesktop)
doc2pdf2png(mydesktop+r'\word2pdf2png')
# 桌面新建一个文件word2pdf2png 先出PDF 再出图片
# import shutil
# shutil.rmtree('C:/Users/Administrator/Desktop/\word2pdf2png')# 只有PDF文件,删除外包文件夹及里面的PDF
# 如果目录包含其他不是pdf文件的其他文件,请改用以下命令
# 删除生成文件PDF 和 生成文件docx
for parent, dirnames, filenames in os.walk('C:/Users/Administrator/Desktop/\word2pdf2png'):
for fn in filenames:
if fn.lower().endswith('.pdf'):
os.remove(os.path.join(parent, fn))
if fn.lower().endswith('.docx'):# 删除原始文件docx 正则[pdf|docx]套不上,只能分成两条了
os.remove(os.path.join(parent, fn))
# 删除png中,尾号是2-8的png(Word只要第一页,后面生成的第二页图片不要
for parent, dirnames, filenames in os.walk('C:/Users/Administrator/Desktop/\word2pdf2png'):
for fn in filenames:
for k in range(2,9): # png文件名的尾数是2,3,4,5,6,7,8 不确定共有几页,可以把9这个数字写大一点)
if fn.lower().endswith(f'{k}.png'): # 删除尾号为2,3,4,5,6,7,8的png图片 f{k}='{}'.formart(k)
os.remove(os.path.join(parent, fn))
(四)实用过程
上传时可以看到周次名称,只有图片的情况下,减少选错的干扰。
上传的图片尺寸太大了,再补个程序缩小png图片的尺寸。
png图片大小在这里调整:
等于1时的网页效果
end
神奇的代码可以减轻办公效率哦!!!
其他参考