golang 使用python脚本将pdf文件转为png图片

此方法会将pdf的每一页转成一张图片
1、python代码

import fitz  # pip install PyMuPDF
import sys
import io
import os
from PIL import Imagedef convert_pdf_to_image(pdf_path, image_folder_path):doc = fitz.open(pdf_path)pdf_name = os.path.splitext(os.path.basename(pdf_path))[0]# 确保图片保存的文件夹存在if not os.path.exists(image_folder_path):os.makedirs(image_folder_path)# 遍历每一页for page_num, page in enumerate(doc, start=1):pix = page.get_pixmap()# 将页面转换为图片img_bytes = io.BytesIO(pix.tobytes("png"))page_image = Image.open(img_bytes)# 保存图片image_file_name = f"{pdf_name}_{page_num}.png"image_file_path = os.path.join(image_folder_path, image_file_name)page_image.save(image_file_path)if __name__ == "__main__":if len(sys.argv) < 3:print("Usage: python pdf_to_image.py [PDF path] [Image output path]")sys.exit(1)pdf_path = sys.argv[1]image_path = sys.argv[2]convert_pdf_to_image(pdf_path, image_path)print("Conversion completed")

2、golang代码

package pdfToImgimport ("errors""os""path/filepath""sort""strconv""strings"
)/**pdfPath:pdf路径imgPath:图片保存路径(这里应该传文件夹路径)fontPath:python脚本路径return:返回的是图片名称数组(pdf文件名_页数),已根据页数排序,可根据需要自行调整*/
func PdfToImg(pdfPath, imgPath, pythonPath string) ([]string, error) {// 1、使用脚本转换pdfoutput, err :=executePythonScript(pdfPath, imgPath, pythonPath)if err != nil {return nil, err}output = strings.ReplaceAll(output, "\r\n", "")if output != "Conversion completed" {return nil, errors.New("脚本执行失败")}// 2、读取文件return readAndSortImageNames(imgPath)
}// 读取文件并跟进页数进行排序
func readAndSortImageNames(dir string) ([]string, error) {var imageNames []stringerr := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if !info.IsDir() {switch filepath.Ext(path) {case ".png", ".jpg", ".jpeg", ".gif", ".bmp":imageNames = append(imageNames, info.Name())}}return nil})if err != nil {return nil, err}// 根据数字排序sort.Slice(imageNames, func(i, j int) bool {return extractNumber(imageNames[i]) < extractNumber(imageNames[j])})return imageNames, nil
}// extractNumber 从文件名中提取数字
func extractNumber(filename string) int {parts := strings.Split(filename, "_")if len(parts) > 1 {numberStr := strings.TrimSuffix(parts[len(parts)-1], filepath.Ext(filename))number, err := strconv.Atoi(numberStr)if err == nil {return number}}return -1
}

注意:linux和windows执行脚本命令不一样,请根据需求调整

// 执行 Python 脚本(linux)
func executePythonScript(pdfPath, imgPath, pythonPath string) (string, error) {cmd := exec.Command("python3", pythonPath, pdfPath, imgPath)var out bytes.Buffercmd.Stdout = &outerr := cmd.Run()if err != nil {return "", err}return out.String(), nil
}// 执行 Python 脚本(windows)
func executePythonScript(pdfPath, imgPath, pythonPath string) (string, error) {cmd := exec.Command("python", pythonPath, pdfPath, imgPath)var out bytes.Buffercmd.Stdout = &outerr := cmd.Run()if err != nil {return "", err}return out.String(), nil
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/159742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

echarts 几千条分钟级别在小时级别图标上展示

需求背景解决效果ISQQW代码地址strategyChart.vue 需求背景 需要实现 秒级数据几千条在图表上显示&#xff0c;(以下是 设计图表上是按小时界别显示数据&#xff0c;后端接口为分钟级别数据) 解决效果 ISQQW代码地址 链接 strategyChart.vue <!--/** * author: liuk *…

编译安装redis及配置多实例

yum安装是这种十分简单的方法我们就不在提及了&#xff0c;今天我们来做一下redis的编译安装 Redis源码包官方下载链接&#xff1a;http://download.redis.io/releases/ 一、编译安装&#xff1a; 安装依赖包 dnf -y install make gcc jemalloc-devel systemd-devel如果是…

数据结构中树、森林 与 二叉树的转换

1 树转换为 二叉树 将树转换成二叉树的步骤是&#xff1a; 加线。在所有的兄弟结点之间加一条线。去线。对于树中的每个结点&#xff0c;只保留它与第一个孩子结点的连线&#xff0c;删除该结点其他孩子结点之间的连线。调整。以树的根结点为轴心&#xff0c;将整个树顺时针旋…

SMBGhost_RCE漏洞(CVE-2020-0796永恒之黑)

https://blog.csdn.net/qq_45372008/article/details/106980409 https://zhuanlan.zhihu.com/p/374949632 SMB 3.1.1协议处理某些请求的方式中存在远程执行代码漏洞&#xff0c;可能被攻击者利用远程执行任意代码。该漏洞的后果十分接近永恒之蓝系列&#xff0c;都利用Windows …

银行业务测试

1、商业银行四大类&#xff1a; 业务类系统、渠道类面试、MIS类系统、其他基础平台系统 2、银行系统开发流程&#xff08;UAT是行方&#xff09; 3、银行系统测试流程 4、对于不同的服务方式也不同&#xff0c;如:柜台、手机银行、网上银行&#xff0c;电话外呼&#xff0c;…

二叉树递归遍历-01

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 二叉树遍历算法什么是二叉树遍历递归遍历1.前序遍历 进入节点时2.中序遍历 遍历完左子树回到节点。此操作需要等到所有左树节点做完后才会做3.后序遍历 遍历完左右子树回到节点。左右子树的所有节点都做完操作后…

89. 格雷编码

89. 格雷编码 Java代码&#xff1a;2DFS class Solution {List<Integer> res new ArrayList<>();public List<Integer> grayCode(int n) {dfs(n, new StringBuffer(), new int[]{0, 1});return res;}public void dfs(int n, StringBuffer sb, int[] nums){i…

吴恩达《机器学习》9-7-9-8:综合起来、自主驾驶

在神经网络的使用过程中&#xff0c;需要经历一系列步骤&#xff0c;从网络结构的选择到训练过程的实施。以下是使用神经网络时的主要步骤的小结&#xff1a; 一、网络结构的选择 输入层&#xff1a; 第一步是选择网络结构&#xff0c;即确定神经网络的层数以及每层的单元数。…

548 - Tree (UVA)

题目链接如下&#xff1a; Online Judge 开始的代码如下&#xff1a; #include <iostream> #include <string> #include <sstream> #include <vector> #include <map> const int INF 99999999; // #define debugstd::vector<int> inor…

CURL踩坑记录

因为项目使用的windows server&#xff0c;且没有安装Postman&#xff0c;所以对于在本地的Postman上执行的请求&#xff0c;要拷贝到服务器执行&#xff0c;只能先转化成为curl命令&#xff0c;操作也很简单&#xff0c;如下&#xff1a; 注意&#xff0c;Postman默认对url包围…

【钉钉】通过链接方式跳转到应用机器人聊天窗口

使用这个方式&#xff1a; dingtalk://dingtalkclient/action/jumprobot?dingtalkid可以通过机器人回调拿到chatbotUserId这个字段&#xff0c;这个就是dingtalkid。 示例&#xff1a;&#xff08;chatbotUserId是不规则字符串&#xff0c;链接拼上这个参数最好 urlencode一…

大图书馆 #9 《流计算系统图解》书评

上周&#xff0c;我收到清华大学出版社编辑寄来的新书《流计算系统图解》。趁着周末的功夫&#xff0c;我快速浏览了本书的主要内容。一句话评价&#xff1a;值得一读&#xff0c;尤其是对开始开发流计算任务或系统一到两年&#xff0c;初步实现过一些功能或作业&#xff0c;但…

二蛋赠书九期:《机器学习图解》

前言 大家好&#xff01;我是二蛋&#xff0c;一个热爱技术、乐于分享的工程师。在过去的几年里&#xff0c;我一直通过各种渠道与大家分享技术知识和经验。我深知&#xff0c;每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此&#xff0c;我非常感激大家一直…

基于C#实现AC自动机算法

我要检查一篇文章中是否有某些敏感词&#xff0c;这其实就是多模式匹配的问题。当然你也可以用 KMP 算法求出&#xff0c;那么它的时间复杂度为 O(c*(mn))&#xff0c;c&#xff1a;为模式串的个数。m&#xff1a;为模式串的长度,n:为正文的长度&#xff0c;那么这个复杂度就不…

Autocad2020切换经典界面

Autocad2020切换经典界面 1.更改1.1设置另存为 1.更改 1.1设置另存为

迅为RK3568开发板学习之Linux驱动篇第十三期输入子系统

驱动视频全新升级&#xff0c;并持续更新~更全&#xff0c;思路更科学&#xff0c;入门更简单。 迅为基于iTOP-RK3568开发板进行讲解&#xff0c;本次更新内容为第十三期&#xff0c;主要讲解输入子系统&#xff0c;共计24 讲。 关注B站&#xff1a;北京迅为电子&#xff0c;在…

多线程的重要资料-信号量

(1)https://www.cnblogs.com/ike_li/p/8984186.html (2)C#关于AutoResetEvent的使用介绍 | 康瑞部落 (3)AutoResetEvent用法(一)_autoresetevent 的用法-CSDN博客 (4)c++ - Is there an easy way to implement AutoResetEvent in C++0x? - Stack Overflow (5)

PAT甲级 1069 字符串处理

1069 The Black Hole of Numbers 分数 20 For any 4-digit integer except the ones with all the digits being the same, if we sort the digits in non-increasing order first, and then in non-decreasing order, a new number can be obtained by taking the second nu…

赛轮集团SAILUN方程式赛车轮胎震撼登场,开启新篇章

11月初&#xff0c;在厦门国际赛车场&#xff0c;SAILUN方程式赛车轮胎展现出令人瞩目的实力&#xff0c;成功完成了首次震撼亮相。这一引人注目的表现为未来的赛车轮胎技术发展打开了崭新的一页。 在这次首次亮相的测试中&#xff0c;职业车手巧妙操控着SAILUN方程式赛车轮胎&…

解决Vision Transformer在任意尺寸图像上微调的问题:使用timm库

解决Vision Transformer在任意尺寸图像上微调的问题&#xff1a;使用timm库 文章目录 一、ViT的微调问题的本质二、Positional Embedding如何处理1&#xff0c;绝对位置编码2&#xff0c;相对位置编码3&#xff0c;对位置编码进行插值 三、Patch Embedding Layer如何处理四、使…