PDF文档转换为图片、图片转成PDF 及PDF合并
程序员文章站
2022-08-23 15:29:57
简介 功能:PDF文档按每页转换成一张图片,一张图片转换成一张PDF 并将多张PDF合成一个多页的PDF文档。 经历:在各个网站上搜索始终出现各种问题,尤其是遇到引用的版本问题尤其头疼,不是不能适用当前的方法就是出现水印标签,最终在各位大佬的帮助下终于完成一个相对完整的代码(主要的是能满足需求)。 ......
简介
功能:pdf文档按每页转换成一张图片,一张图片转换成一张pdf 并将多张pdf合成一个多页的pdf文档。
经历:在各个网站上搜索始终出现各种问题,尤其是遇到引用的版本问题尤其头疼,不是不能适用当前的方法就是出现水印标签,最终在各位大佬的帮助下终于完成一个相对完整的代码(主要的是能满足需求)。
背景
之前在项目中遇到一个需求:将多页的pdf上传并转成图片展示要求一页一页的排列开看(例如图1),并要求在传送到服务中心平台看到的时候是pdf文档(服务中心平台只提供下载)。
点击下载需要使用到的dll文件
o2s.components.pdfrender4net.dll 版本:4.7.4.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(); } }
下一篇: 五款晒后修护单品,平复紫外线伤害
推荐阅读
-
CAD图纸怎么转换为PDF及图片格式?
-
Vue项目pdf(base64)转图片遇到的问题及解决方法
-
AI中怎么把pdf转成jpg格式?用AI把pdf文档转换成jpg图片格式的方法介绍
-
福昕pdf阅读器怎么把pdf文档转成jpg图片?福昕阅读器pdf转图片教程
-
PDF文档转换为图片、图片转成PDF 及PDF合并
-
[那些年踩过的坑]pdf转换为图片的教程(pdf的Base64字符串转换为图片的base64字符串和不通过第三方来实现pdf转图片的Dome)
-
CAD图纸怎么转换为PDF及图片格式?
-
Vue项目pdf(base64)转图片遇到的问题及解决方法
-
pdf文档转图片如何操作
-
PDF文档转换为图片、图片转成PDF 及PDF合并