PDF另存为图片的一个方法
说明
有时需要把PDF的每一页另存为图片。用Devexpress可以很方便的完成这个功能。

窗体上放置一个PdfViewer。
然后循环每一页 for (int i = 1; i <= pdfViewer1.PageCount; i++)
调用 chg_pdf_to_bmp函数获得图片并保存
chg_pdf_to_bmp中调用了PdfViewer的CreateBitmap函数
全部代码
private string pdf_fn = "";
private void button1_Click(object sender, EventArgs e)
{
pdf_fn = textBox1.Text.Trim();
if (! System.IO.File.Exists(pdf_fn))
return;
button1.Enabled = false;
string dir = System.IO.Path.GetDirectoryName(pdf_fn) + @"\" + System.IO.Path.GetFileNameWithoutExtension(pdf_fn) + ".files";
if (!System.IO.Directory.Exists(dir))
System.IO.Directory.CreateDirectory(dir);
pdfViewer1.LoadDocument(pdf_fn);
progressBar1.Value = 0;
progressBar1.Maximum = pdfViewer1.PageCount;
Application.DoEvents();
for (int i = 1; i <= pdfViewer1.PageCount; i++)
{
Bitmap bmp = chg_pdf_to_bmp(pdfViewer1,i);
bmp.Save(dir+@"\"+i.ToString()+".jpg", ImageFormat.Jpeg );
bmp.Dispose();
progressBar1.Value = progressBar1.Value +1;
Application.DoEvents();
}
MessageBox.Show("保存在"+ dir+"下");
button1.Enabled = true;
}
private string pdf_fn = "";private void button1_Click(object sender, EventArgs e){pdf_fn = textBox1.Text.Trim();if (! System.IO.File.Exists(pdf_fn))return;button1.Enabled = false;string dir = System.IO.Path.GetDirectoryName(pdf_fn) + @"\" + System.IO.Path.GetFileNameWithoutExtension(pdf_fn) + ".files";if (!System.IO.Directory.Exists(dir))System.IO.Directory.CreateDirectory(dir);pdfViewer1.LoadDocument(pdf_fn);progressBar1.Value = 0;progressBar1.Maximum = pdfViewer1.PageCount;Application.DoEvents();for (int i = 1; i <= pdfViewer1.PageCount; i++){Bitmap bmp = chg_pdf_to_bmp(pdfViewer1,i);bmp.Save(dir+@"\"+i.ToString()+".jpg", ImageFormat.Jpeg ); bmp.Dispose();progressBar1.Value = progressBar1.Value +1;Application.DoEvents();}MessageBox.Show("保存在"+ dir+"下");button1.Enabled = true;}
public Bitmap chg_pdf_to_bmp(DevExpress.XtraPdfViewer.PdfViewer VW_PDF, int i_page_no, int max_w = 210 * 4 * 3)
{
DevExpress.Pdf.PdfDocument _pdf_document = null;
VW_PDF.CurrentPageNumber = i_page_no;
VW_PDF.Refresh();
System.Reflection.PropertyInfo fiDocument = VW_PDF.GetType().GetProperty("Document", BindingFlags.Instance | BindingFlags.NonPublic);
_pdf_document = fiDocument.GetValue(VW_PDF, null) as DevExpress.Pdf.PdfDocument;
PdfPage pdfpage = _pdf_document.Pages[i_page_no - 1];
SizeF page_sf = VW_PDF.GetPageSize(i_page_no);
int pw = (int)(page_sf.Width / pdfpage.UserUnit * 500);
int ph = (int)(page_sf.Height / pdfpage.UserUnit * 500);
int bmp_w = pw; //pw * 3 / 2;
int bmp_h = ph; //ph * 3 / 2;
if (bmp_w > max_w)
bmp_w = max_w;
Bitmap bmp = VW_PDF.CreateBitmap(i_page_no, bmp_w);
return bmp;
}
public Bitmap chg_pdf_to_bmp(DevExpress.XtraPdfViewer.PdfViewer VW_PDF, int i_page_no, int max_w = 210 * 4 * 3){DevExpress.Pdf.PdfDocument _pdf_document = null;VW_PDF.CurrentPageNumber = i_page_no;VW_PDF.Refresh();System.Reflection.PropertyInfo fiDocument = VW_PDF.GetType().GetProperty("Document", BindingFlags.Instance | BindingFlags.NonPublic);_pdf_document = fiDocument.GetValue(VW_PDF, null) as DevExpress.Pdf.PdfDocument;PdfPage pdfpage = _pdf_document.Pages[i_page_no - 1];SizeF page_sf = VW_PDF.GetPageSize(i_page_no);int pw = (int)(page_sf.Width / pdfpage.UserUnit * 500);int ph = (int)(page_sf.Height / pdfpage.UserUnit * 500);int bmp_w = pw; //pw * 3 / 2;int bmp_h = ph; //ph * 3 / 2; if (bmp_w > max_w)bmp_w = max_w;Bitmap bmp = VW_PDF.CreateBitmap(i_page_no, bmp_w);return bmp;}
相关文章:
PDF另存为图片的一个方法
说明 有时需要把PDF的每一页另存为图片。用Devexpress可以很方便的完成这个功能。 窗体上放置一个PdfViewer。 然后循环每一页 for (int i 1; i < pdfViewer1.PageCount; i) 调用 chg_pdf_to_bmp函数获得图片并保存 chg_pdf_to_bmp中调用了PdfViewer的CreateBitmap函数…...
HTML之JavaScript运算符
HTML之JavaScript运算符 1.算术运算符 - * / %除以0,结果为Infinity取余数,如果除数为0,结果为NaN NAN:Not A Number2.复合赋值运算符 - * / %/ 除以0,结果为Infinity% 如果除数为0,结果为NaN NaN:No…...
借助 ListWise 提升推荐系统精排效能:技术、案例与优化策略
目录 一、引言二、ListWise 方法概述三、ListWise 用于精排的优势四、ListWise 样本具体的构建过程4.1 确定样本的上下文4.2 收集候选物品及相关特征4.3 确定物品的真实排序标签4.4 构建样本列表4.5 划分训练集、验证集和测试集 五、ListWise 方法案例分析六、ListWise 方法在精…...
C++中什么时候用. 什么时候用->
学了一年C今天出了一个大岔子,因为太久没有做链表类型题目了,并且STL用惯了今天遇到一题,写的时候发现完全不对劲,搞慌了,首先我们看题目 2. 两数相加 再看我第一次的解答,先不论结果对不对 错的行为有很多…...
从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势
作者:谢吉宝(唐三) 编者按: 云原生 API 网关系列教程即将推出,欢迎文末查看教程内容。本文整理自阿里云智能集团资深技术专家,云原生产品线中间件负责人谢吉宝(唐三) 在云栖大会的精…...
【Python深入浅出】Python3正则表达式:开启高效字符串处理大门
目录 一、正则表达式基础入门1.1 什么是正则表达式1.2 正则表达式的语法规则1.3 特殊字符与转义 二、Python 中的 re 模块2.1 re 模块概述2.2 常用函数与方法2.2.1 re.match()2.2.2 re.search()2.2.3 re.findall()2.2.4 re.sub() 2.3 修饰符(Flags)的使用…...
Vue.js Vue CLI 安装与使用
Vue.js Vue CLI 安装与使用 今天我们来聊聊 Vue CLI 的安装与使用。对于开发 Vue 应用来说,Vue CLI 是一个非常强大的工具,它能帮助你快速创建项目脚手架、配置开发环境、自动化构建流程,从而大大提高开发效率。下面我就和大家一步一步地讲解…...
科技的尽头:在有限与永恒的夹缝中寻找文明的真谛
当人类用燧石点燃第一簇文明之火时,科技发展的齿轮便已开始转动。这个从原始工具到量子计算机的进化历程,既是人类突破生物局限的史诗,也是文明不断自我解构与重构的哲学叙事。站在人工智能与基因编辑并行的时代节点,"科技尽…...
【牛客】动态规划专题一:斐波那契数列
文章目录 DP1 斐波那契数列法1:递归法2:动态规划法3:优化空间复杂度 2.分割连接字符串3. 给定一个字符串s和一组单词dict,在s中添加空格将s变成一个句子 DP1 斐波那契数列 法1:递归 // 递归 #include <iostream>…...
java8、9新特性
JAVA8 Lambda 表达式 (parameters) -> expression 或 (parameters) ->{ statements; } 提供了一种更为简洁的语法,尤其适用于函数式接口。相比于传统的匿名内部类,Lambda 表达式使得代码更为紧凑,减少了样板代码的编写。 它允许将函…...
作业:zuoye
1.闹钟(错的) #include "widget.h" #include "ui_widget.h" #include <QMessageBox>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 初始化定时器objTimer new QTimer(th…...
redis底层数据结构——链表
文章目录 定义内部实现总结 定义 链表提供了高效的节点重排能力,以及顺序性的节点访间方式,并且可以通过增删节点来灵活地调整链表的长度。 作为一种常用数据结构,链表内置在很多高级的编程语言里面,因为Redis使用的C语言并没有…...
问题解决 4S 法
在深入研读《像高手一样解决问题》的第二章后,犹如打开了一扇通往高效问题解决领域的新大门,其中所阐述的问题解决 4S 法,更是给人以拨云见日之感。 一、陈述(State):明确问题本质 这是问题解决的起始点&…...
SQL-leetcode—1407. 排名靠前的旅行者
1407. 排名靠前的旅行者 表:Users ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | ---------------------- id 是该表中具有唯一值的列。 name 是用户名字。 表:Rides -------------------…...
机器学习(李宏毅)——Transformer
一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!! 读这篇文章必须先了解self-attention,可参阅我上一篇。 二、大纲 Transformer问世原理剖析模型训…...
React进阶之React状态管理CRA
React状态管理&CRA 状态管理理论讲解案例 context 上下文结合状态来维护todoListindex.jsApp.jsTaskList.jsTasksContext.jsAddTask.js Escape 脱围机制refforwardRef(不建议使用) CRA 状态管理 理论讲解 如何针对 effect -> 对action的触发 -&…...
攻克AWS认证机器学习工程师(AWS Certified Machine Learning Engineer) - 助理级别认证:我的成功路线图
引言 当我决定考取AWS认证机器学习工程师 - 助理(AWS Certified Machine Learning Engineer — Associate)级别证书时,我就预料到这将是一段充满挑战但回报颇丰的旅程。跟你说吧,它在这两方面都没让我失望。这项考试面向的是不仅理解机器学习原理,还对AWS生态系统有扎实基…...
前端开发环境
vscde nrm 切换源管理 nvm 切换node版本工具 nodemon node运行js文件热更新 pxcook 易用的自动标注工具, 生成前端代码, 设计研发协作利器,比PS轻量 TypeScript 安装tsc 它的作用就是将ts文件编译为js文件 npm i typescript -g 输入tsc -v能够看到东西,就说明好了 …...
Web自动化测试—测试用例流程设计
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、测试用例通用结构回顾 1.1、现有测试用例存在的问题 可维护性差可读性差稳定性差 1.2、用例结构设计 测试用例的编排测试用例的项目结构 1.3、自动化测试…...
HTML全局属性与Meta元信息详解:优化网页的灵魂
目录 前言 一、HTML中的全局属性 常用的全局属性 二、Meta元信息标签:网页背后的重要配置 常用的Meta标签 三、Meta元信息的进阶使用 总结 前言 在HTML开发中,有一些属性和标签是全局性的,能够影响网页的多个方面,比如页面的…...
淘宝虚拟商品选品实操:从儿童学习资料到游戏攻略的蓝海挖掘术
淘宝虚拟商品选品高阶指南:从儿童教育到游戏产业的精细化运营策略 在淘宝虚拟商品领域,真正能够持续盈利的卖家往往不是那些追逐热门品类的跟风者,而是懂得在细分市场中寻找差异化机会的"蓝海猎手"。儿童学习资料和游戏攻略这两个看…...
Qt跨平台即时通讯实战:从界面设计到TCP通信的完整实现
1. Qt跨平台即时通讯开发概述 用Qt框架开发即时通讯软件最大的优势就是"一次编写,到处运行"。我去年接手过一个项目,需要在Windows和Linux双平台上部署聊天工具,当时尝试过多种技术方案,最终Qt以绝对优势胜出。想象一下…...
Nunchaku FLUX.1-dev GPU算力优化:TensorRT加速推理实测对比
Nunchaku FLUX.1-dev GPU算力优化:TensorRT加速推理实测对比 如果你正在使用Nunchaku FLUX.1-dev模型生成图片,可能会发现一个问题:生成速度不够快,特别是当你想批量出图或者尝试不同参数时,等待时间有点长。 今天我…...
OpenClaw人人养虾:配置Anthropic (Claude)
Anthropic 是 Claude 系列模型的开发者。Claude 以出色的指令遵循能力、深度推理和长文本处理著称。OpenClaw 支持通过 API Key 或 Claude Code CLI OAuth 接入。 认证方式 方式一:API Key(推荐) 前往 Anthropic Console 创建 API Key在 O…...
Agent上线后有专人运营支持吗?深度解析AI Agent的全生命周期运维保障体系
随着AI Agent(智能体)在企业业务场景中的深度渗透,从简单的流程自动化到复杂的跨境贸易、研发辅助,企业对“数字员工”的期待已不再局限于单次的开发交付,而是转向了长期的稳定运行与持续进化。对于许多决策者而言&…...
告别桌面混乱:NoFences让文件管理效率提升80%的空间收纳方案
告别桌面混乱:NoFences让文件管理效率提升80%的空间收纳方案 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 每天在杂乱的桌面图标中寻找文件,就像在堆…...
Spring Boot 实现网络限速:让流量“收放自如”
Spring Boot 实现网络限速:让流量“收放自如” 一、为啥要网络限速? 在当今这个数字化时代,网络服务就像我们生活中的水电一样不可或缺,而网络限速则是保障这些服务稳定、高效运行的关键一环。它能确保在各种复杂的网络环境下&…...
网盘直链下载助手终极指南:3步实现高速下载新时代
网盘直链下载助手终极指南:3步实现高速下载新时代 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...
2026年黄山钢筋网片供应厂家揭秘
在建筑行业蓬勃发展的今天,钢筋网片作为建筑施工中不可或缺的材料,其质量和供应厂家的选择至关重要。对于黄山地区的建筑项目来说,找到一家靠谱的钢筋网片供应厂家,是保障工程质量和进度的关键。今天,我们就来揭秘一家…...
3D Face HRN开源镜像:ModelScope官方cv_resnet50_face-reconstruction部署
3D Face HRN开源镜像:ModelScope官方cv_resnet50_face-reconstruction部署 1. 引言:从2D照片到3D人脸的魔法转换 你是否曾经想过,仅仅通过一张普通的2D人脸照片,就能生成精确的3D人脸模型?这在过去可能需要专业设备和…...
