Python实现word或pdf文件转png长图

2023-10-19 01:50
文章标签 python 实现 pdf png word 长图

本文主要是介绍Python实现word或pdf文件转png长图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Python实现word/pdf文件转png长图

  • 背景
  • 思路
  • 不足
  • 实现
    • 1. word转pdf
    • 2. pdf转图片
    • 3. 图片空白行删除
  • 效果

背景

最近写项目周报要求转为长图片输出,本着“自己动手,丰衣足食”(抠门)的原则,就不购买xx会员了,自己动手做一个word转换图片的小工具~~

思路

  1. 先将Word文档转为pdf文件。
  2. 读取pdf文件,逐页转为图片,保存为多个临时文件。
  3. 读取临时图片文件,拼接输出一张图片文件。
  4. 对长图中过多的空白行进行删除。

不足

  1. word文件转pdf目前用的是win32com库,只能在windows系统使用。
  2. 空白行的判断效率较低。

实现

1. word转pdf

# -*- coding:utf-8 -*-
"""
将word文档转换为pdf文件
"""
from datetime import datetime
from pathlib import Path
import win32com.client# 将Word文档转换为PDF文件
def convert_to_pdf(input_file_path, output_file_path):# 目标文件若已存在,则先删除Path(output_file_path).unlink(True)word = client.DispatchEx('Word.Application')try:doc = word.Documents.Open(input_file_path)doc.SaveAs2(output_file_path, FileFormat=17)doc.Close()except Exception as e:print("转pdf失败:%s" % e)finally:word.Quit()def word_2_pdf(word_name, new_pdf_name):word_path = Path(word_name).parentconvert_to_pdf(word_name, new_pdf_name)return new_pdf_nameif __name__ == "__main__":word_name = "d:/test_word.docx"word_2_pdf(word_name)

2. pdf转图片

# -*- coding:utf-8 -*-from datetime import datetime
from pathlib import Path
# 安装fitz 就是安装 PyMuPDF 才能使用
import fitz
# import os
# 安装 opencv, opencv的像素含义顺序是 BGR (不是常用的RGB)
# pip3 install opencv-python -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
import cv2
import numpy as np
from shutil import copyfiledef pdf_2_png(pdf_name,png_name=None):print(pdf_name)pdf_path = Path(pdf_name).parentdoc = fitz.open(pdf_name)img_stack = Nonetemp = 0# 每页pdf生产一个临时图片for pg in range(doc.page_count):page = doc[pg]temp += 1rotate = int(0)# 每个尺寸的缩放系数为2,这将为我们生成分辨率提高四倍的图像。zoom_x = 2.0zoom_y = 2.0trans = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)pixmap = page.get_pixmap(matrix=trans, alpha=False)# 生成临时png文件路径pic_name = str(pdf_path.joinpath('_temp_{}.png'.format(temp)).absolute())pixmap.save(pic_name)# pm_img = cv2.imread(pic_name) # 此方式不支持中文目录,改用下方方法pm_img = cv2.imdecode(np.fromfile(pic_name, dtype=np.uint8), cv2.IMREAD_COLOR + cv2.IMREAD_IGNORE_ORIENTATION)pm_img = cv2.resize(pm_img, (1191, 1684))# 删除临时图片文件Path(pic_name).unlink(True)# 拼长图if img_stack is None:img_stack = np.vstack((pm_img,))else:img_stack = np.vstack((img_stack, pm_img))# 删除长图中的空白区域thin_img = shrink_img(img_stack, 100, 20)output_file = png_name if png_name is not None else str(pdf_path.joinpath(Path(pdf_name).stem + ".png").absolute())# cv2.imwrite(str(tmp_img_name.absolute()), thin_img) # 不支持中文目录# 采用下述方法保存到带中文的目录cv2.imencode('.png', thin_img)[1].tofile(output_file)def shrink_file(img_file,target_file):pm_img = cv2.imread(img_file)im = shrink_img(pm_img, 120, 20)cv2.imwrite(target_file, im)if __name__ == "__main__":pf = "d:/test_word.pdf"pdf_2_png(pf)

3. 图片空白行删除

def is_blank(line):"""判断本行是否空白行"""for pixel in line:if not all(n == 255 for n in pixel):return Falsereturn Truedef get_blank_block(img, begin_row, end_row, need_height):"""获取高度大于等于输入值的整块空白区域"""if (img is None) or (begin_row < 0) or (end_row < begin_row) or (need_height <= 0):return False, 0, 0if (end_row - begin_row) < need_height:return False, 0, 0start_row = -1found = Falsefound_height = 0for row in range(begin_row, end_row):line = img[row, :]if not is_blank(line):# 非空白,则判断高度是否符合if found_height >= need_height:breakstart_row = -1found_height = 0continue# 是空白行if start_row < 0:start_row = rowfound_height += 1if found_height >= need_height:found = Truereturn found, start_row, found_heightdef shrink_img(img, blank_height=50, reserve_height=20):"""将图片中过长的空白背景截取删除:对于图片中整行都是白色,且超过一定高度的,仅保留指定高度区域,其余删除。"""# 读取原始图片宽高height, width = img.shape[:2]found = Trueimg_stack = Nonebegin_row = 0while found:found, begin_blank_row, found_height = get_blank_block(img, begin_row, height, blank_height)if found:# 找到空白区域,将搜索起始行到空白起始行之间的图像加入stack,跳过空白区域,继续搜索img2 = img[begin_row: begin_blank_row + reserve_height, :]begin_row = begin_blank_row + found_heightelse:# 没找到空白区域,将搜索起始行到结束行的图像加入stackimg2 = img[begin_row:height, :]if img_stack is None:img_stack = np.vstack((img2,))else:img_stack = np.vstack((img_stack, img2))if img_stack is None:img_stack = imgreturn img_stackif __name__ == "__main__":img_info = cv2.imread("d:/test.png")thin_img = shrink_img(img_info, 60, 20)cv2.imshow('result', thin_img)cv2.waitKey(0)cv2.destroyAllWindows()

效果

  1. word原始文件,多页。
    在这里插入图片描述

  2. 拼接后的长图(分页之间存在空白)
    在这里插入图片描述

这篇关于Python实现word或pdf文件转png长图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/236510

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount