当前位置:
首页 > Python基础教程 >
-
C#教程之PDF文档转换为图片、图片转成PDF 及PDF合
简介
功能:PDF文档按每页转换成一张图片,一张图片转换成一张PDF 并将多张PDF合成一个多页的PDF文档。
经历:在各个网站上搜索始终出现各种问题,尤其是遇到引用的版本问题尤其头疼,不是不能适用当前的方法就是出现水印标签,最终在各位大佬的帮助下终于完成一个相对完整的代码(主要的是能满足需求)。
背景
之前在项目中遇到一个需求:将多页的PDF上传并转成图片展示要求一页一页的排列开看(例如图1),并要求在传送到服务中心平台看到的时候是PDF文档(服务中心平台只提供下载)。
点击下载需要使用到的dll文件
O2S.Components.PDFRender4NET.dll 版本:4.7.4.0
itextsharp.dll 版本:5.5.10.0
主要的代码如下
/// <summary> /// 将PDF文档转换为图片的方法 /// </summary> /// <param name="pdfInputPath"></param> /// <param name="desPath">输出相对路径</param> /// <param name="definition">设置图片的清晰度,数字越大越清晰</param> /// <returns></returns> public static List<string> ConvertPDF2Image(string pdfInputPath, string desPath, Definition definition, string title) { List<string> imgList = new List<string>(); PDFFile pdfFile = PDFFile.Open(pdfInputPath); int startPageNum = 1, endPageNum = pdfFile.PageCount; int number = 1; for (int i = startPageNum; i <= endPageNum; i++) { Bitmap pageImage = pdfFile.GetPageImage(i - 1, 56 * (int)definition); string filePath = desPath + title + "-" + number + ".jpg"; imgList.Add(filePath); pageImage.Save(System.Web.HttpContext.Current.Server.MapPath(filePath)); number++; } pdfFile.Dispose(); return imgList; } public enum Definition { One = 1, Two = 2, Three = 3, Four = 4, Five = 5, Six = 6, Seven = 7, Eight = 8, Nine = 9, Ten = 10 } /// <summary> /// 合并PDF /// </summary> /// <param name="fileList">绝对路径集合</param> /// <param name="outMergeFile">合并后的文件存在地址绝对路径</param> public static void mergePdfFiles(List<string> fileList, string outMergeFile) { PdfReader reader; //此处将内容从文本提取至文件流中的目的是避免文件被占用,无法删除 FileStream fs1 = new FileStream(fileList[0], FileMode.Open); byte[] bytes1 = new byte[(int)fs1.Length]; fs1.Read(bytes1, 0, bytes1.Length); fs1.Close(); reader = new PdfReader(bytes1); reader.GetPageSize(1); // iTextSharp.text.Rectangle rec = new iTextSharp.text.Rectangle(1000,800);//设置样式 iTextSharp.text.Rectangle rec = reader.GetPageSize(1); float width = rec.Width; float height = rec.Height; //创建一个文档变量 iTextSharp.text.Document document = new iTextSharp.text.Document(rec, 50, 50, 50, 50); //创建该文档 PdfWriter pdfWrite = PdfWriter.GetInstance(document, new FileStream(outMergeFile, FileMode.Create)); //打开文档 document.Open(); //添加内容 PdfContentByte contentByte = pdfWrite.DirectContent; PdfImportedPage newPage; for (int i = 0; i < fileList.Count; i++) { FileStream fs = new FileStream(fileList[i], FileMode.Open); byte[] bytes = new byte[(int)fs.Length]; fs.Read(bytes, 0, bytes.Length); fs.Close(); reader = new PdfReader(bytes); int pageNum = reader.NumberOfPages;//获取文档页数 for (int j = 1; j <= pageNum; j++) { document.NewPage(); newPage = pdfWrite.GetImportedPage(reader, j); contentByte.AddTemplate(newPage, 0, 0); } } document.Close(); }
/// <summary> /// 图片转PDF /// </summary> /// <param name="imagepath">图片位置(绝地路径)</param> /// <param name="pdfpath">存放PDF地址(绝地路径)</param> public static void iTextSharpCreatPDF(string imagepath, string pdfpath) { iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(imagepath); float percentage = 1; //这里都是图片最原始的宽度与高度 float resizedWidht = image.Width; float resizedHeight = image.Height; Document doc = new Document(new iTextSharp.text.Rectangle(resizedWidht, resizedHeight), 0, 0, 0, 0); //new Rectangle(1000,1000) //指定文件预设开档时的缩放为100% //PdfDestination pdfDest = new PdfDestination(PdfDestination.XYZ, 0, doc.PageSize.Height, 1f); try { PdfWriter.GetInstance(doc, new FileStream(pdfpath, FileMode.Create)); doc.Open(); #region 下面对图片进行操作 ////这时判断图片宽度是否大于页面宽度减去也边距,如果是,那么缩小,如果还大,继续缩小, ////这样这个缩小的百分比percentage会越来越小 while (resizedWidht > (doc.PageSize.Width - doc.LeftMargin - doc.RightMargin)) { percentage = percentage * 0.9f; resizedHeight = image.Height * percentage; resizedWidht = image.Width * percentage; } #region 注释 ////There is a 0.8 here. If the height of the image is too close to the page size height, ////the image will seem so big //while (resizedHeight > (doc.PageSize.Height - doc.TopMargin - doc.BottomMargin) * 0.8) //{ // percentage = percentage * 0.9f; // resizedHeight = image.Height * percentage; // resizedWidht = image.Width * percentage; //} #endregion ////这里用计算出来的百分比来缩小图片 image.ScalePercent(percentage * 100); //让图片的中心点与页面的中心点进行重合 image.SetAbsolutePosition(doc.PageSize.Width / 2 - resizedWidht / 2, doc.PageSize.Height / 2 - resizedHeight / 2); doc.Add(image); #endregion } catch (DocumentException dex) { System.Web.HttpContext.Current.Response.Write(dex.Message); } catch (IOException ioex) { System.Web.HttpContext.Current.Response.Write(ioex.Message); } catch (Exception ex) { System.Web.HttpContext.Current.Response.Write(ex.Message); } finally { doc.Close(); } }
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式