本篇文章是讲述使用iTextSharp这个开源组件的系列文章的第三篇,iTextSharp可以通过Asp.Net创建PDFs,就像HTML和ASP.Net为文本提供了多种容器一样,iTextSharp提供了Chunk,Phrase和Paragraph这三个类作为容器,在开始之前,如果你还没有阅读我之前的文章,那么地址为:
在ASP.NET中创建PDF-iTextSharp起步
在Asp.Net中操作PDF - iTextSharp - 使用字体
Chunks
块(Chunks)是容纳文本的最小容器,就像ASP.Net中的<asp:Label>一样。就像使用Label一样,对于块的使用需要小心.下面代码展示如何为块设置文本,然后将其写入PDF 3次.
string path = Server.MapPath("PDFs");
Rectangle r = new Rectangle(400, 300);
Document doc = new Document(r);
PdfWriter.GetInstance(doc, new FileStream(path + "/Blocks.pdf", FileMode.Create));
doc.Open();
Chunk c1 = new Chunk("A chunk represents an isolated string. ");
for (int i = 1; i < 4; i++)
{
doc.Add(c1);
}
[接下来的一段你要格外注意,我们后面还要用到]
结果如下,可以看出文本已经被加入文档,但显示出来却是一团乱麻.Chunk并不知道文本长度何时超过文档宽度并自动换行。你可以使用”\n”或者Environment.NewLine,甚至是Chunk.NEWLINE作为给Chunk对象赋值的一部分.
1
Chunk有一系列方法允许你为文本设置样式,比如setUnderLine(), setBackGround(), 和 setTextRise()以及一些构造函数来设置字体类型以及风格.
Chunk chunk = new Chunk("Setting the Font", FontFactory.GetFont("dax-black"));
chunk.SetUnderline(0.5f, -1.5f);
2
PHRASE
Phrase是比Chunk大一级的容器,Phrase可以理解为一组Chunk,并且会在长度超过文档宽度后自动换行,每一行之间的行距(测量方法其实是每行底部之间的距离)是字体大小的1.5倍,因为在iTextSharp行距之间的举例是12pt,所以下面代码之间的行距为16pt.你可以在Phrase初始化的时候设置字体和行距.当然也可以通过其多种构造函数重载来在初始化时为Phrase添加内容.
下面代码展示了前面3个chunk加入Phrase后展示的结果:
Phrase phrase = new Phrase();
for (int i = 1; i < 4; i++)
{
phrase.Add(c1);
}
3
Paragraphs
目前为止,我们已经看到了如何在PDF中添加最基本的文本块.而事实上你应该用的最多的类是Paragraphs.Paragraph其实是一组有序Phrase和Chunk的集合。Paragraph派生于Phrase,所以和Phrase一样,Paragraph也会在长度超过文档长度时自动换行.不仅如此,Paragraph和Paragraph之间也会自动空一行(就像文字处理软件那样),在本文前面Chunk部分对部分文字设置格式是我们日常经常需要的,所以下面代码中,我会将格式化的文本通过Chunk和Phrase来添加到Paragraphs中:
string path = Server.MapPath("PDFs");
Rectangle r = new Rectangle(400, 300);
Document doc = new Document(r);
try
{
PdfWriter.GetInstance(doc, new FileStream(path + "/Blocks2.pdf", FileMode.Create));
doc.Open();
string text = @"The result can be seen below, which shows the text 
having been written to the document but it looks a 
mess. Chunks have no concept of how to force a new 
line when the length exceeds the available width in 
the document. Really, all they should be used for is 
to change or set the style of a word or phrase inline. ";
text = text.Replace(Environment.NewLine, String.Empty).Replace("  ", String.Empty);
Font brown = new Font(Font.COURIER, 9f, Font.NORMAL, new Color(163, 21, 21));
Font lightblue = new Font(Font.COURIER, 9f, Font.NORMAL, new Color(43, 145, 175));
Font courier = new Font(Font.COURIER, 9f);
Font georgia = FontFactory.GetFont("georgia", 10f);
georgia.Color = Color.GRAY;
Chunk beginning = new Chunk(text, georgia);
Phrase p1 = new Phrase(beginning);
Chunk c1 = new Chunk("You can of course force a newline using \"", georgia);
Chunk c2 = new Chunk(@"\n", brown);
Chunk c3 = new Chunk("\" or ", georgia);
Chunk c4 = new Chunk("Environment", lightblue);
Chunk c5 = new Chunk(".NewLine", courier);
Chunk c6 = new Chunk(", or even ", georgia);
Chunk c7 = new Chunk("Chunk", lightblue);
Chunk c8 = new Chunk(".NEWLINE", courier);
Chunk c9 = new Chunk(" as part of the string you give a chunk.", georgia);
Phrase p2 = new Phrase();
p2.Add(c1);
p2.Add(c2);
p2.Add(c3);
p2.Add(c4);
p2.Add(c5);
p2.Add(c6);
p2.Add(c7);
p2.Add(c8);
p2.Add(c9);
Paragraph p = new Paragraph();
p.Add(p1);
p.Add(p2);
doc.Add(p);
}
catch (DocumentException dex)
{
throw (dex);
}
catch (IOException ioex)
{
throw (ioex);
}
finally
{
doc.Close();
}
首先,来看结果,然后我再解释代码:
4
在代码中添加异常处理并不是一件复杂的事,当然,每次越到关于IO的操作时,最好都要使用try…catch。对于iTextSharp的Document对象来说,还有DocumentException这个异常需要处理.我还在iTextSharp发现了其他几个猥琐的异常,当我写测试代码去生成PDF文件时,我不小心对Font对象的构造函数传了两个参数,我先传入了Font.NORMAL,后传入了文字大小,然后悲剧发生了,字体大小被设置成了0.在代码执行到doc.Close()时抛出异常,我不得不强关了VS来释放在内存中的PDF.
所以,异常处理非常重要,至少在document从内存释放之前,你也需要注意字体类型传入时,都要在后面加个f后缀,来表明编译器它是FLOAT类型,这样能防止你遇到和我同样的错误。
第一块文字,也就是@+引号,或者说是纯文本,不允许中间有空格和换行符,否则空格和换行符就会原样在PDF中显示出来。除此之外,每一个设置了风格样式的字体都需要包含在一个Chunk中,然后再将Chunk添加到Phrase来确保文字会自动换行,最后,所有Phrase和Chunk都会被添加到Paragraph对象中。还可以通过Paragraph.setAlignment()设置Paragraph的对齐方式,这个方法接受一个String类型的参数,可以是"Left", "Center", "Justify",和 "Right".下面是设置p.setAlignment("Justify");居中的显示效果:
5
Paragraph还有许多其他的方法来设置缩进:
Paragraph.FirstLineIndent  //allows you to apply a float value to indent the first line
Paragraph.IndentationLeft  //allows you to add space to the left hand side
Paragraph.IndentationRight //allows you to add space to the right hand side
Paragraph.setSpacingBefore //adds a specified amount of space above the paragraph
Paragraph.setSpacingAfter  //adds the specified amount of space after the paragraph
下一篇文章将会探索更多基于文本的功能,尤其是在列表方面。
原文链接:iTextSharp - Adding Text with Chunks, Phrases and Paragraphs
Translated by CareySon
分类: iTextSharp
标签: iTextSharp, Pdf, Asp.net创建PDF
好文要顶 关注我 收藏该文    
本文转自CareySon博客园博客,原文链接http://www.cnblogs.com/CareySon/archive/2011/11/03/2234625.html如需转载请自行联系原作者

【译】在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本相关推荐

  1. java在模板图片中填写文字,java 操作pdf模板(向指定域添加文本内容和图片)

    项目需求涉及到操作pdf模板,根据生成好的模板向里面填充数据 用到的jar包是iText-5.0.6.jar 和iTextAsian.jar 上代码: public static void main( ...

  2. Java中操作pdf模板生成pdf

    [java] iText使用PDF模板生成输出PDF 项目需求涉及到操作pdf模板,根据生成好的模板向里面填充数据 用到的jar包是iText-5.0.6.jar 和iTextAsian.jar pd ...

  3. Go实战--golang中操作PDF(rsc.io/pdf、jung-kurt/gofpdf、signintech/gopdf)

    生命不止,继续 go go go !!! 昨天介绍了golang中如何操作excel: Go实战–golang中操作excel(tealeg/xlsx.360EntSecGroup-Skylar/ex ...

  4. 在ASP.NET中操作文件的例子

    利用SYSTEM.IO 名空间中的STREAMWRITER,STREAMREADER及FILE类,完成文件读.写.删除的操作.  ----------------------------------- ...

  5. ASP.Net 中操作Ajax

    有时候,越深入去了解一个点,越发觉得自己无知,而之前当自己晓得一两个片面的点还洋洋自得,殊不知,这是多么讽刺,JQuery中有很多优势,比如异步提交值,部分刷新,给用户很好的体验感.目前为止,大部分项 ...

  6. 在docker容器中操作es,并给es7.6添加用户鉴权设置密码

    1.docker启动命令:docker-compose up -d 加上 -d 表示后台运行,只是docker-compose up则是在控制台运行,会不停的打印日志. 2.从容器中拷贝文件到宿主机: ...

  7. RT-Thread移植到STM32F103ZET6具体操作步骤(利用keil5新建工程,添加RT-Thread源码到工程)

    RT-Thread移植(基于STM32F103ZET6) 因为学习RT-Thread的原因,需要把RT-Thread移植到STMF103ZET6上,在RT-Thread官网下载的原文件中实际上已经ST ...

  8. itex将html转成pdf加水印,itext操作PDF文件添加水印

    功能描述:添加图片和文字水印 /** * * [功能描述:添加图片和文字水印] [功能详细描述:功能详细描述] * @param srcFile 待加水印文件 * @param destFile 加水 ...

  9. java 修改pdf_Java 操作PDF书签详解 - 添加、修改、读取和删除

    目录前言 Free Spire.PDF for Java库概述和安装 给PDF文档添加书签 修改现有书签 设置PDF文档打开时展开或折叠书签 读取书签标题 从PDF文档中删除书签 前言 书签在一些PD ...

最新文章

  1. CRM是什么?我心中理想的CRM形态
  2. 两个有序数组的中位数—leetcode4
  3. 二进制安全与MySQL的关系_《高可用MySQL》节选 -- 安全和二进制日志
  4. 死磕 java集合之TreeMap源码分析(三)- 内含红黑树分析全过程
  5. java date 时分秒_java Date 获得时分秒代码
  6. 一个“想忘带东西都难”的出行指南
  7. RDD和DataFrame和DataSet三者间的区别
  8. Pandas——数据可视化
  9. 动态ip解析 linux,ddwrt路由/linux动态解析ip(ddns)到dnspod配置
  10. 【To Do】程序员面试金典——18.11最大子方阵
  11. Win 10 Edge不能上网,微软商店打不开的问题
  12. echart之全国地图切换省级地图
  13. Web案例——制作简历
  14. Java教程:如何对接自定义钉钉机器人并实现群聊消息发送
  15. 【OSChina-MoPaaS应用开发大赛】幼家宝
  16. 什么是程序?计算机时如何执行程序?
  17. 爬虫数据executemany插入_python爬虫:爬取易迅网价格信息,并写入Mysql数据库
  18. 增长黑客读书笔记(七)留存:唤醒并留住用户
  19. 《Redis实战篇》一、短信登录
  20. 网站搭建34个相关术语解释

热门文章

  1. java 让进度条动起来_自定义进度条动起来
  2. 深圳坪山,中国首个全区全域全车无人的RoboTaxi运营区
  3. 火星无人机同款技术全部公开!高通还特意给Plus了一下
  4. 国产期刊崛起!上海大学、郑州大学主办期刊IF超15,2021版SCI期刊影响因子出炉...
  5. 48万!百度推出全球最便宜RoboTaxi,赚钱能力2倍于人类网约车
  6. AI啊,我这里有些羞羞的东西,你要不要看一眼?
  7. 花最少的钱,训超6的机器人:谷歌大脑推出机器人强化学习平台,硬件代码全开源...
  8. 开工快乐!AI内参邀你继续学习,并送上50元优惠券!
  9. Apollo 5.0,GitHub热榜第四
  10. 什么Linux服务器最适合你?