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

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&#xff0c;结果为Infinity取余数&#xff0c;如果除数为0&#xff0c;结果为NaN NAN:Not A Number2.复合赋值运算符 - * / %/ 除以0&#xff0c;结果为Infinity% 如果除数为0&#xff0c;结果为NaN NaN:No…...

借助 ListWise 提升推荐系统精排效能:技术、案例与优化策略

目录 一、引言二、ListWise 方法概述三、ListWise 用于精排的优势四、ListWise 样本具体的构建过程4.1 确定样本的上下文4.2 收集候选物品及相关特征4.3 确定物品的真实排序标签4.4 构建样本列表4.5 划分训练集、验证集和测试集 五、ListWise 方法案例分析六、ListWise 方法在精…...

C++中什么时候用. 什么时候用->

学了一年C今天出了一个大岔子&#xff0c;因为太久没有做链表类型题目了&#xff0c;并且STL用惯了今天遇到一题&#xff0c;写的时候发现完全不对劲&#xff0c;搞慌了&#xff0c;首先我们看题目 2. 两数相加 再看我第一次的解答&#xff0c;先不论结果对不对 错的行为有很多…...

从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势

作者&#xff1a;谢吉宝&#xff08;唐三&#xff09; 编者按&#xff1a; 云原生 API 网关系列教程即将推出&#xff0c;欢迎文末查看教程内容。本文整理自阿里云智能集团资深技术专家&#xff0c;云原生产品线中间件负责人谢吉宝&#xff08;唐三&#xff09; 在云栖大会的精…...

【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 修饰符&#xff08;Flags&#xff09;的使用…...

Vue.js Vue CLI 安装与使用

Vue.js Vue CLI 安装与使用 今天我们来聊聊 Vue CLI 的安装与使用。对于开发 Vue 应用来说&#xff0c;Vue CLI 是一个非常强大的工具&#xff0c;它能帮助你快速创建项目脚手架、配置开发环境、自动化构建流程&#xff0c;从而大大提高开发效率。下面我就和大家一步一步地讲解…...

科技的尽头:在有限与永恒的夹缝中寻找文明的真谛

当人类用燧石点燃第一簇文明之火时&#xff0c;科技发展的齿轮便已开始转动。这个从原始工具到量子计算机的进化历程&#xff0c;既是人类突破生物局限的史诗&#xff0c;也是文明不断自我解构与重构的哲学叙事。站在人工智能与基因编辑并行的时代节点&#xff0c;"科技尽…...

【牛客】动态规划专题一:斐波那契数列

文章目录 DP1 斐波那契数列法1&#xff1a;递归法2&#xff1a;动态规划法3&#xff1a;优化空间复杂度 2.分割连接字符串3. 给定一个字符串s和一组单词dict&#xff0c;在s中添加空格将s变成一个句子 DP1 斐波那契数列 法1&#xff1a;递归 // 递归 #include <iostream>…...

java8、9新特性

JAVA8 Lambda 表达式 (parameters) -> expression 或 (parameters) ->{ statements; } 提供了一种更为简洁的语法&#xff0c;尤其适用于函数式接口。相比于传统的匿名内部类&#xff0c;Lambda 表达式使得代码更为紧凑&#xff0c;减少了样板代码的编写。 它允许将函…...

作业:zuoye

1.闹钟&#xff08;错的&#xff09; #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底层数据结构——链表

文章目录 定义内部实现总结 定义 链表提供了高效的节点重排能力&#xff0c;以及顺序性的节点访间方式&#xff0c;并且可以通过增删节点来灵活地调整链表的长度。 作为一种常用数据结构&#xff0c;链表内置在很多高级的编程语言里面&#xff0c;因为Redis使用的C语言并没有…...

问题解决 4S 法

在深入研读《像高手一样解决问题》的第二章后&#xff0c;犹如打开了一扇通往高效问题解决领域的新大门&#xff0c;其中所阐述的问题解决 4S 法&#xff0c;更是给人以拨云见日之感。 一、陈述&#xff08;State&#xff09;&#xff1a;明确问题本质 这是问题解决的起始点&…...

SQL-leetcode—1407. 排名靠前的旅行者

1407. 排名靠前的旅行者 表&#xff1a;Users ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | ---------------------- id 是该表中具有唯一值的列。 name 是用户名字。 表&#xff1a;Rides -------------------…...

机器学习(李宏毅)——Transformer

一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记&#xff0c;感谢台湾大学李宏毅教授的课程&#xff0c;respect&#xff01;&#xff01;&#xff01; 读这篇文章必须先了解self-attention&#xff0c;可参阅我上一篇。 二、大纲 Transformer问世原理剖析模型训…...

React进阶之React状态管理CRA

React状态管理&CRA 状态管理理论讲解案例 context 上下文结合状态来维护todoListindex.jsApp.jsTaskList.jsTasksContext.jsAddTask.js Escape 脱围机制refforwardRef&#xff08;不建议使用&#xff09; 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能够看到东西&#xff0c;就说明好了 …...

Web自动化测试—测试用例流程设计

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、测试用例通用结构回顾 1.1、现有测试用例存在的问题 可维护性差可读性差稳定性差 1.2、用例结构设计 测试用例的编排测试用例的项目结构 1.3、自动化测试…...

HTML全局属性与Meta元信息详解:优化网页的灵魂

目录 前言 一、HTML中的全局属性 常用的全局属性 二、Meta元信息标签&#xff1a;网页背后的重要配置 常用的Meta标签 三、Meta元信息的进阶使用 总结 前言 在HTML开发中&#xff0c;有一些属性和标签是全局性的&#xff0c;能够影响网页的多个方面&#xff0c;比如页面的…...

淘宝虚拟商品选品实操:从儿童学习资料到游戏攻略的蓝海挖掘术

淘宝虚拟商品选品高阶指南&#xff1a;从儿童教育到游戏产业的精细化运营策略 在淘宝虚拟商品领域&#xff0c;真正能够持续盈利的卖家往往不是那些追逐热门品类的跟风者&#xff0c;而是懂得在细分市场中寻找差异化机会的"蓝海猎手"。儿童学习资料和游戏攻略这两个看…...

Qt跨平台即时通讯实战:从界面设计到TCP通信的完整实现

1. Qt跨平台即时通讯开发概述 用Qt框架开发即时通讯软件最大的优势就是"一次编写&#xff0c;到处运行"。我去年接手过一个项目&#xff0c;需要在Windows和Linux双平台上部署聊天工具&#xff0c;当时尝试过多种技术方案&#xff0c;最终Qt以绝对优势胜出。想象一下…...

Nunchaku FLUX.1-dev GPU算力优化:TensorRT加速推理实测对比

Nunchaku FLUX.1-dev GPU算力优化&#xff1a;TensorRT加速推理实测对比 如果你正在使用Nunchaku FLUX.1-dev模型生成图片&#xff0c;可能会发现一个问题&#xff1a;生成速度不够快&#xff0c;特别是当你想批量出图或者尝试不同参数时&#xff0c;等待时间有点长。 今天我…...

OpenClaw人人养虾:配置Anthropic (Claude)

Anthropic 是 Claude 系列模型的开发者。Claude 以出色的指令遵循能力、深度推理和长文本处理著称。OpenClaw 支持通过 API Key 或 Claude Code CLI OAuth 接入。 认证方式 方式一&#xff1a;API Key&#xff08;推荐&#xff09; 前往 Anthropic Console 创建 API Key在 O…...

Agent上线后有专人运营支持吗?深度解析AI Agent的全生命周期运维保障体系

随着AI Agent&#xff08;智能体&#xff09;在企业业务场景中的深度渗透&#xff0c;从简单的流程自动化到复杂的跨境贸易、研发辅助&#xff0c;企业对“数字员工”的期待已不再局限于单次的开发交付&#xff0c;而是转向了长期的稳定运行与持续进化。对于许多决策者而言&…...

告别桌面混乱:NoFences让文件管理效率提升80%的空间收纳方案

告别桌面混乱&#xff1a;NoFences让文件管理效率提升80%的空间收纳方案 【免费下载链接】NoFences &#x1f6a7; Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 每天在杂乱的桌面图标中寻找文件&#xff0c;就像在堆…...

Spring Boot 实现网络限速:让流量“收放自如”

Spring Boot 实现网络限速&#xff1a;让流量“收放自如” 一、为啥要网络限速&#xff1f; 在当今这个数字化时代&#xff0c;网络服务就像我们生活中的水电一样不可或缺&#xff0c;而网络限速则是保障这些服务稳定、高效运行的关键一环。它能确保在各种复杂的网络环境下&…...

网盘直链下载助手终极指南:3步实现高速下载新时代

网盘直链下载助手终极指南&#xff1a;3步实现高速下载新时代 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...

2026年黄山钢筋网片供应厂家揭秘

在建筑行业蓬勃发展的今天&#xff0c;钢筋网片作为建筑施工中不可或缺的材料&#xff0c;其质量和供应厂家的选择至关重要。对于黄山地区的建筑项目来说&#xff0c;找到一家靠谱的钢筋网片供应厂家&#xff0c;是保障工程质量和进度的关键。今天&#xff0c;我们就来揭秘一家…...

3D Face HRN开源镜像:ModelScope官方cv_resnet50_face-reconstruction部署

3D Face HRN开源镜像&#xff1a;ModelScope官方cv_resnet50_face-reconstruction部署 1. 引言&#xff1a;从2D照片到3D人脸的魔法转换 你是否曾经想过&#xff0c;仅仅通过一张普通的2D人脸照片&#xff0c;就能生成精确的3D人脸模型&#xff1f;这在过去可能需要专业设备和…...