PDF生成类库
from:https://blog.csdn.net/plean/article/details/8097015
最近忙了两个星期的任务了 iTextSharp.dll是个开源的用于生成pdf的类库了 项目中我们只需要引用就可以了 说实话确实很好用 因为自己的英文水平实在有限 所以没去看API了 找资料上费了不少功夫 因为网上的资料大部分都只是介绍一些基础的应用 所以很多地方还得靠自己慢慢来摸索了 现在将自己生成的pdf代码奉献给大家 希望对有用到的朋友一些帮助 给的代码中有些属性和方法不明白的需要大家自己去找资料参考了 代码里面就不解释了
代码量有一些 可能还不是很完善 毕竟自己的能力还是很有限 所以代码部分还有一些需要优化 不过生成是没问题的 就当给大家参考吧 当然有高人提些意见还是很不错的
先看图片吧 我需要生成的pdf是什么样的:
先看图片吧 我需要生成的pdf是什么样的:
- using iTextSharp.text;
- using iTextSharp.text.pdf;
- using System.IO;
- using System.Text;
- using System.Xml;
- private static float bankai;//页面宽度的一半
- private static float bangao;//页面高度的一半
- private static float[] left = { , };
- private static float[] rightwidth = { , };
- private static float[] imageWidth = { , };
- private static float[] imgWidth = { , };
- private static bool boo = true;//当目录数大于10则进行分栏
- private static int column = ;//0为左边1为右边
- public void CreatePDF(DataTable dt,string imagePath,string pdfPath)//第一个参数是是生成pdf所需要的内容,第二个是生成pdf所需要的图片路径,第三个是生成pdf后存放的路径
- {
- int status = ;
- //获取图片路径
- string lift = imagePath+ @"/lift.jpg";
- string right = imagePath+ @"/right.jpg";
- string top1 = imagePath + @"/top1.jpg";
- string top2 = imagePath + @"/top2.jpg";
- Document document = new Document(iTextSharp.text.PageSize.A4, , , , );//定义pdf大小,设置上下左右边距
- Rectangle rect = new Rectangle(, );//设置整个版面的宽度和高度
- document.SetPageSize(rect);
- bankai = document.PageSize.Width / ;
- bangao = document.PageSize.Height / ;
- PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(pdfPath + DateTime.Now.ToString("yyyyMMddhhmmss") + ".pdf", FileMode.Create));//生成pdf路径,创建文件流
- document.Open();
- PdfContentByte cb = writer.DirectContent;
- ColumnText ct = new ColumnText(cb);
- iTextSharp.text.Image img4 = iTextSharp.text.Image.GetInstance(top1);//定位背景图片1
- img4.ScalePercent();
- cb.AddImage(img4, bankai, , , img4.ScaledHeight, , );
- iTextSharp.text.Image img5 = iTextSharp.text.Image.GetInstance(top2);//定位背景图片2
- img5.ScalePercent();
- cb.AddImage(img5, img5.ScaledWidth, , , img5.ScaledHeight, , );
- Color c = new Color(int.Parse("6c423c", System.Globalization.NumberStyles.AllowHexSpecifier));//设置颜色
- BaseFont bf = BaseFont.CreateFont(@"c:/windows/fonts/SIMLI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//设置字体
- cb.Stroke();
- cb.BeginText();
- cb.SetFontAndSize(bf, );
- cb.SetColorFill(c);
- cb.SetTextMatrix(, );
- cb.ShowText("卷一");//定位卷一
- cb.EndText();
- int pagenum = ;
- bool boo = true;//当目录数大于10则进行分栏
- bool bo = true;
- int newpage = ;
- int newpageHeight = ;
- int Count = ;
- int PageIndex = ;
- bool pageBool = false;
- //对标题数目进行判断 当目录大于左栏的时候 定位于右栏 当标题大于右栏时新建一个页面 依次循环
- for (int i = ; i < dt.Rows.Count; i++)//当目录数目过大,对目录进行分页
- {
- if (i != )
- {
- if (i % == )//每一栏为10个目录
- {
- if (bo == false)//当目录大于一页的时候新建一个页面
- {
- boo = true;
- cb.Stroke();
- document.NewPage();
- newpage = -i;
- newpageHeight = ;
- iTextSharp.text.Image imglift = iTextSharp.text.Image.GetInstance(lift);//定位左边的图片
- imglift.Alignment = iTextSharp.text.Image.ALIGN_MIDDLE;
- cb.AddImage(imglift, , , , , , -);
- }
- else
- {
- boo = false;
- newpage = -i;
- }
- }
- }
- bo = boo;
- //因为不确定标题的长度为多少 所以不能固定死 而且因为pdf里面对字体的长度有限制比如-和字符在里面的显示长度是不同的 所以根据长度来显示肯定不行了
- //因此只能判断他们在pdf中的像素来确定他们的长度 我的办法是先获得-的像素 然后获得标题的像素 然后用总像素减去标题的像素和页码像素度再除以-的像素
- //就得到-的个数 然后再添加到标题和页码中就可以了
- string fuhao = "-";
- float fuhaochangdu = bf.GetWidthPoint(fuhao, (float));//得到-的像素
- float biaotichangdu;
- if (dt.Rows[i]["Title"].ToString().Length > )//判断目录长度是否大于30
- {
- string jiequTitle = dt.Rows[i]["Title"].ToString().Substring(, ) + "……";//大于30加......
- biaotichangdu = bf.GetWidthPoint(jiequTitle, (float));//获得标题的像素
- cb.Stroke();
- cb.BeginText();
- cb.SetFontAndSize(bf, );
- cb.SetColorFill(c);
- if (!bo) { cb.SetTextMatrix( + bankai, + newpageHeight - ((i - + newpage) * )); }//对标题进行定位,标题位于左栏
- else { cb.SetTextMatrix(, + newpageHeight - ((i - + newpage) * )); }//当标题大于左栏的时候定位于右栏
- cb.ShowText(jiequTitle);
- cb.EndText();
- }
- else//如果标题长度大于30则添加......
- {
- biaotichangdu = bf.GetWidthPoint(dt.Rows[i]["Title"].ToString(), (float));
- cb.Stroke();
- cb.BeginText();
- cb.SetFontAndSize(bf, );
- cb.SetColorFill(c);
- if (!bo) { cb.SetTextMatrix( + bankai, + newpageHeight - ((i - + newpage) * )); }//对标题进行定位
- else { cb.SetTextMatrix(, + newpageHeight - ((i - + newpage) * )); }
- cb.ShowText(dt.Rows[i]["Title"].ToString());//给目录添加标题
- string abc = dt.Rows[i]["Title"].ToString();
- cb.EndText();
- }
- int changdu = (int)((bankai - - biaotichangdu) / fuhaochangdu);//获得-的个数
- StringBuilder sb = new StringBuilder();
- for (int j = ; j < changdu; j++)//判断标题与索引之间所需要的-
- {
- sb.Append(fuhao);//依次添加-
- }
- cb.Stroke();
- cb.BeginText();
- cb.SetFontAndSize(bf, );
- cb.SetColorFill(c);
- if (!bo) { cb.SetTextMatrix( + biaotichangdu + bankai, + newpageHeight - ((i - + newpage) * )); }//左栏定位-
- else { cb.SetTextMatrix( + biaotichangdu, + newpageHeight - ((i - + newpage) * )); }//右栏定位-
- cb.ShowText(sb.ToString());//给目录中间添加-
- cb.EndText();
- int page = PDFPageNum(dt, i);//获得内容的页码
- cb.Stroke();
- cb.BeginText();
- cb.SetFontAndSize(bf, );
- cb.SetColorFill(c);
- if (!bo) { cb.SetTextMatrix(bankai - + bankai, + newpageHeight - ((i - + newpage) * )); }//左栏定位页码
- else { cb.SetTextMatrix(bankai - , + newpageHeight - ((i - + newpage) * )); }//右栏定位页码
- cb.ShowText((PageIndex).ToString());//显示页码
- cb.EndText();
- if (page == ) { pagenum = ; PageIndex += ; }//给目录添加页码
- else if (page == ) { pagenum = ; PageIndex += ; }
- else { pagenum = ; PageIndex += page + ; }//目录的页数
- Color color = new Color(int.Parse("9f9fa0", System.Globalization.NumberStyles.AllowHexSpecifier));
- cb.Stroke();
- cb.BeginText();
- cb.SetFontAndSize(bf, );
- cb.SetColorFill(color);
- if (!bo) { cb.SetTextMatrix( + bankai, + newpageHeight - ((i - + newpage) * )); }
- else { cb.SetTextMatrix(, + newpageHeight - ((i - + newpage) * )); }
- cb.ShowText(dt.Rows[i]["banmianming"].ToString());//给目录添加版面名称
- cb.EndText();
- }
- //因为我的pdf要求是先版面然后文章了 如果目录在左边的话版面就在右边了 第二页左边就为文章 右边又为版面 一次类推了 如果目录占到了右边
- //那么第二页左边为版面右边为文章了
- if (!boo)//判断目录是否生成新的页面
- {
- column = ;
- pageBool = false;
- }
- else//没有生成页面则添加版面和页码
- {
- iTextSharp.text.Image img6 = NewBanMianImages(dt, cb, c, bf, , );
- cb.Stroke();
- cb.BeginText();
- cb.SetFontAndSize(bf, );
- cb.SetTextMatrix(, );
- cb.ShowText("");
- cb.EndText();
- }
后面将对这个目录进行补充 关于其中的int page = PDFPageNum(dt, i);//获得内容的页码 方法所要做的是什么
PDF生成类库的更多相关文章
- 赞!jsPDF – 基于 HTML5 的强大 PDF 生成工具
jsPDF 是一个基于 HTML5 的客户端解决方案,用于生成各种用途的 PDF 文档.使用方法很简单,只要引入 jsPDF 库,然后调用内置的方法就可以了.浏览器兼容性: IE 10, Firefo ...
- C#写PDF文件类库PDF File Writer介绍
.NET平台开源项目速览(16)C#写PDF文件类库PDF File Writer介绍 阅读目录 1.PDF File Writer基本介绍 2.一个简单的使用案例 3.资源 1年前,我在文章:这 ...
- jsPDF – 基于 HTML5 的强大 PDF 生成工具
jsPDF 是一个基于 HTML5 的客户端解决方案,用于生成各种用途的 PDF 文档. 使用方法很简单,只要引入 jsPDF 库,然后调用内置的方法就可以了. 米扑科技项目用到了HHTML5生成PD ...
- .Net 对于PDF生成以及各种转换的操作
前段时间公司的产品,要做一个新功能,签章(就是把需要的数据整理成PDF很标准的文件,然后在盖上我们在服务器上面的章) 然后我就在百度上找了找,发现搞PDF的类库很少,要么就要钱,要么就有水印,破解版的 ...
- 使用Nuget生成类库
背景: 为了开始ITOO项目,我们先学习了一些基本知识,这些就是一个基本知识,这实现的是一种封装的思想,将方法打包,这样我们就可以在其他系统中直接引用而需要再耗费人力和财力去做,真正实现了高效率 ...
- 生成类库项目时同时生成的pdb文件是什么东东?
英文全称:Program Database File Debug里的PDB是full,保存着调试和项目状态信息.有断言.堆栈检查等代码.可以对程序的调试配置进行增量链接.Release 里的PDB是p ...
- C#使用iTextSharp+ZXing.Net+FreeSpire.PDF生成和打印pdf文档
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.Net+FreeSpire.PDF三个类库实现了生成pdf.生成条形码和打印pdf功能. 首先在项 ...
- Java中常用的操作PDF的类库
iText iText是一个能够快速产生PDF文件的java类库.iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的.它的类库尤其与java Servlet有很好的给合.使用 ...
- .NET平台开源项目速览(16)C#写PDF文件类库PDF File Writer介绍
1年前,我在文章:这些.NET开源项目你知道吗?.NET平台开源文档与报表处理组件集合(三)中(第9个项目),给大家推荐了一个开源免费的PDF读写组件 PDFSharp,PDFSharp我2年前就看过 ...
随机推荐
- IDEA 使用教程(破解2019.1.1)
2019-08-02更新 最新破解方法: ZKVVPH4MIO-eyJsaWNlbnNlSWQiOiJaS1ZWUEg0TUlPIiwibGljZW5zZWVOYW1lIjoi5o6I5p2D5Luj ...
- Something is already running on port 3000. Would you like to run the app on another port instead?
查看端口sudo lsof -i :3000 删除进程 sudo kill -9 12297[pid]
- python蟒蛇绘制的代码以及目前还不知道怎么用的RGB颜色对照表
#PythonDraw.py import turtle#引入海龟库 turtle.setup(650,350,200,200)#确定窗口大小,长650,高350,确定窗口位置,距离电脑左上角200, ...
- java 静态代码块和spring @value等注解注入顺序
java 静态代码块和spring @value等注解注入顺序 问题所在 先上代码 java方法 @Value("${mf.cashost}") public static S ...
- rest-framework频率组件、url注册器、响应器、分页器
频率组件 import time from rest_framework.throttling import BaseThrottle,SimpleRateThrottle IP_DICT = {} ...
- 《代码敲不队》第九次团队作业:Beta冲刺第1天
项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 代码敲不队 作业学习目标 (1)项目文档的完善与整理:(2)团队项目总结陈述PPT编制:(3)符合 ...
- mac pro下安装brew软件包管理工具
Homebrew简称brew,OSX上的软件包管理工具,在Mac终端可以通过brew安装.更新.卸载软件. 1.打开终端直接输入下面指令回车: ruby -e "$(curl -fsSL h ...
- 九.Protobuf3特殊类型
Protobuf3 Any类型 Any消息类型允许您将消息作为嵌入类型,而不需要它们 .proto定义.Any包含任意序列化的消息(字节),以及一个URL,该URL充当该消息的全局唯一标识符并解析为该 ...
- 分段三次Hermite插值及其与三次样条的比较
分段三次 Hermite 插值多项式 (PCHIP) 语法 p = pchip(x,y,xq) pp = pchip(x,y) 说明 p = pchip(x,y,xq) 返回与 xq 中的查询点对 ...
- tensorflow 运行效率 GPU memory leak 问题解决
问题描述: Tensorflow 训练时运行越来越慢,重启后又变好. 用的是Tensorflow-GPU 1.2版本,在GPU上跑,大概就是才开始训练的时候每个batch的时间很低,然后随着训练的推进 ...