开发者社区> 杰克.陈> 正文

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

简介: 原文 【译】在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本  本篇文章是讲述使用iTextSharp这个开源组件的系列文章的第三篇,iTextSharp可以通过Asp.
+关注继续查看

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

 本篇文章是讲述使用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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
9889 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
25169 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
14735 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
18855 0
【译】在Asp.Net中操作PDF - iTextSharp - 利用列进行排版
原文 【译】在Asp.Net中操作PDF - iTextSharp - 利用列进行排版   在使用iTextSharp通过ASP.Net生成PDF的系列文章中,前面的文章已经讲述了iTextSharp所涵盖的大多数基本功能.
872 0
公司交换机arp 绑定操作
1、首先登入:192.168.1.1 2、sys 3、dis arp | inc 192.168.1.49(查看该ip绑定情况) 4、undo arp 192.168.1.49(不绑定命令)
788 0
在Asp.Net中操作PDF – iTextSharp - 使用表格
使用Asp.Net生成PDF最常用的元素应该是表格,表格可以帮助比如订单或者发票类型的文档更加格式化和美观。本篇文章并不会深入探讨表格,仅仅是提供一个使用iTextSharp生成表格的方法介绍     使用iTextSharp来操作表格是一件简单的事,尤其是iTextSharp中表格元素的命名方式和HTML与CSS中非常类似。
1064 0
+关注
杰克.陈
一个安静的程序猿~
10427
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载