当前位置: 首页 > news >正文

PDF转图片工具实现

一、安装

sudo yum install poppler-utils
pdftoppm -v
pdftoppm -png -r 300 a.pdf /tmp/page

运行效果:

PDF转图片工具 - 在线PDF转PNG/JPG/TIFF转换器 | 免费在线工具

后台实现:

using System.Diagnostics;
using System.IO.Compression;namespace SaaS.OfficialWebSite.Web.Utils
{public class PdfTopPmService{private ILogger<PdfTopPmService> _logger;public PdfTopPmService(ILogger<PdfTopPmService> logger){_logger = logger;}public async Task<MemoryStream> ConvertToImagesAsync(MemoryStream pdfStream){// 临时保存PDF文件(仅用于转换过程)var tempPdfPath = Path.GetTempFileName();using (var fileStream = new FileStream(tempPdfPath, FileMode.Create)){pdfStream.Position = 0;await pdfStream.CopyToAsync(fileStream);fileStream.Flush();}// 使用pdftoppm转换PDF为图片var outputFiles = ConvertPdfToImages(tempPdfPath);// 创建ZIP文件(内存流)var zipStream = new MemoryStream();using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create, true)){foreach (var imagePath in outputFiles){var entry = archive.CreateEntry(Path.GetFileName(imagePath));using (var entryStream = entry.Open()){using (var imageStream = System.IO.File.OpenRead(imagePath)){await imageStream.CopyToAsync(entryStream);}}// 删除临时图片文件System.IO.File.Delete(imagePath);}}// 删除临时PDF文件System.IO.File.Delete(tempPdfPath);return zipStream;}private List<string> ConvertPdfToImages(string pdfPath){var outputFiles = new List<string>();var outputPattern = Path.Combine(Path.GetTempPath(), "page");// 使用pdftoppm命令行工具转换PDFvar process = new Process{StartInfo = new ProcessStartInfo{FileName = "pdftoppm",Arguments = $"-png -r 300 {pdfPath} {outputPattern}",UseShellExecute = false,RedirectStandardOutput = true,CreateNoWindow = true}};process.Start();process.WaitForExit();// 获取生成的图片文件var tempFiles = Directory.GetFiles(Path.GetTempPath(), "page-*.png");outputFiles.AddRange(tempFiles);return outputFiles;}}
}

http://www.dtcms.com/a/356967.html

相关文章:

  • 天气查询系统
  • 2025_WSL2_Ubuntu20.04_C++20_concept 环境配置
  • el-select多选下拉框出现了e611
  • MySQL 中ORDER BY排序规则
  • 物联网平台中的Swagger(二)安全认证与生产实践
  • Socket编程核心API与结构解析
  • 【C++】掌握类模板:多参数实战技巧
  • 构筑沉浸式3D世界:渲染、资源与体验的协同之道
  • 云计算学习笔记——逻辑卷管理、进程管理、用户提权RAID篇
  • N32G43x Flash 驱动移植与封装实践
  • DBeaver 的 PostgreSQL 驱动包默认存储位置
  • 序列化和反序列的学习
  • 移动社交时代电商流量获取新路径:基于社群与开源AI智能名片链动2+1模式S2B2C商城小程序的探索
  • 【基础-单选】关于Button组件,下面哪个样式是胶囊型按钮
  • 大模型之RAG, 检索增强生成
  • 【若依】RuoYi-Vue-springboot3分离版
  • RS485、RS232、RS422协议
  • 浔川代码编辑器v2.1.0公测版上线时间公告
  • 基于FPGA的DDR3读写实验学习
  • LeetCode算法日记 - Day 26: 归并排序、交易逆序对的总数
  • 河南葱香鸡蛋,嫩滑香浓超棒!
  • 企业微信如何设置长期有效的获客二维码?3步生成!
  • 机器人视觉检测
  • 决胜财报季,证券投研如何实现财报自动化分析录入?
  • 企微智能表格对接业务系统
  • 指纹手机技术:破解亚马逊多账号运营痛点的底层逻辑与实践
  • useEffect中直接使用 await报错
  • 直流电机驱动与TB6612
  • Shell 中 ()、(())、[]、{} 的用法详解
  • X-anylabeling3.2标注工具的安装与使用