ITextSharp使用说明 (转)

原文: http://www.cnblogs.com/LifelongLearning/archive/2010/12/28/1919138.html

TextSharp是一个生成Pdf文件的开源项目,最近在项目中有使用到这个项目,对使用中的经验作一个小结.

ITextSharp中相关的概念:

一、Document

这个对象有三个构造函数:

隐藏行号 复制代码 ?这是一段程序代码。

  1. public Document();
  2. public Document(Rectangle pageSize);
  3. public Document(Rectangle pageSize,
  4. int marginLeft,
  5. int marginRight,
  6. int marginTop,
  7. int marginBottom);

第一个构造函数以A4页面作为参数调用第二个构造函数,第二个构造函数以每边36磅页边距为参数调用调用第三个构造函数。

页面尺寸:

你可以通过指定的颜色和大小创建你自己的页面,示例代码0102创建一个细长的浅黄色背景的页面:

Rectangle pageSize = new Rectangle(144, 720);

pageSize.BackgroundColor = new Color(0xFF, 0xFF, 0xDE);

Document document = new Document(pageSize);

通常,你不必创建这样的页面,而可以从下面页面尺寸中选择:

A0-A10, LEGAL, LETTER, HALFLETTER, _11x17, LEDGER, NOTE, B0-B5, ARCH_A-ARCH_E, FLSA 和 FLSE

大多数情况下使用纵向页面,如果希望使用横向页面,你只须使用rotate()函数:

Document document = new Document(PageSize.A4.rotate());

详细代码见示例代码0103。

页边距:

当创建一个文件时,你还可以定义上、下、左、右页边距:

Document document = new Document(PageSize.A5, 36, 72, 108, 180);

说明:

当创建一个矩形或设置边距时,你可能希望知道该用什么度量单位:厘米、英寸或象素,事实上,默认的度量系统以排版单位磅为基础得出其他单位的近似值,如1英寸=72磅,如果你想在A4页面的PDF中创建一个矩形,你需要计算以下数据:

21 厘米 / 2.54 = 8.2677 英寸

8.2677英寸* 72 = 595 磅

29.7 厘米 / 2.54 = 11.6929 英寸

11.6929英寸* 72 = 842 磅

默认边距为36磅即半英寸。

如果你修改了页面尺寸,仅仅影响到下一页,如果你修改了页边距,则影响到全部,故慎用。

二、Writer

一旦创建了document,我们可以创建该文档的多个Writer的实例,所有这些Writer实例均继承自抽象类“iTextSharp.text.DocWriter”。

同时还有另外一种情况,你可以用iTextSharp.text.pdf.PdfWriter产生文档PDF文件,如果你想创建一个TeX文档,你可以使用iTextSharp.text.TeX.TeXWriter包。

Writer类的构造函数是私有的,你只能通过下面的方法创建一个实例:

public static xxxWriter getInstance(Document document, Stream os);(xxx 是 Pdf 或 Xml)

你可以通过下面的方法创建一个实例:

PdfWriter writer = PdfWriter.getInstance(document, new FileStream("Chap01xx.pdf"));

但是你几乎永远不会用到Writer实例(除非你想创建高级PDF或者希望用一些非常特殊的函数,如ViewerPreferencesEncryption)。所以通过下面的办法得到实例已经足够了: PdfWriter.getInstance(document, new FileStream("Chap01xx.pdf"));

在第一步中创建一个文档时,第一个参数意义不大,第二个参数可以是任何一种流,到目前为止我们一直使用System.IO.FileStream将Document写入文件中,示例代码0105用到了System.IO.MemoryStream(这不是一个独立的例子,你必须在Servlet Engine中测试这些代码。

文档加密:

public void setEncryption(boolean strength, String userPassword, String ownerPassword, int permissions);

· strength 是下面两个常量之一:

o PdfWriter.STRENGTH40BITS: 40 位

o PdfWriter.STRENGTH128BITS: 128位 (Acrobat Reader 5.0及以上版本支持)

· UserPassword和ownerPassword 可以为空或零长度, 这种情况下, ownerPassword 将被随机的字符串代替

· Permissions 为下列常量之一:

o PdfWriter.AllowPrinting

o PdfWriter.AllowModifyContents

o PdfWriter.AllowCopy

o PdfWriter.AllowModifyAnnotations

o PdfWriter.AllowFillIn

o PdfWriter.AllowScreenReaders

o PdfWriter.AllowAssembly

PdfWriter.AllowDegradedPrinting

三、块(Chunk)

块(Chunk)是能被添加到文档的文本的最小单位,块可以用于构建其他基础元素如短句、段落、锚点等,块是一个有确定字体的字符串,要添加块到文档中时,其他所有布局变量均要被定义。

四、短句(Phrases)

短句(Phrases)是一系列以特定间距(两行之间的距离)作为参数的块,一个短句有一个主字体,但短句中的一些块具有不同于主字体的字体,你有更多的选择去创建短句。

五、段落

段落是一系列块和(或)短句。同短句一样,段落有确定的间距。用户还可以指定缩排;在边和(或)右边保留一定空白,段落可以左对齐、右对齐和居中对齐。添加到文档中的每一个段落将自动另起一行。

说明:一个段落有一个且仅有一个间距,如果你添加了一个不同字体的短句或块,原来的间距仍然有效,你可以通过SetLeading来改变间距,但是段落中所有内容将使用新的中的间距。

更改分割符

通常,当文本不能放在一行时,文本将被分割成不同的部分,iText首先会查找分割符,如果没有找到,文本将在行尾被截断。有一些预定的分割符如“ ”空格和“-”连字符,但是你可以使用setSplitCharacter方法来覆盖这些默认值。

以使用IndentationLeft和IndentationRight,FirstLineIndent属性设置缩排;

六、锚点(Anchor)

如果你想在文档中添加一个外部链接(例如使用URL链接到WEB上的其他文档),你可以简单地使用Anchor对象,它派生于Phrase对象,使用方法相同。只有两种额外方法定义两种额外变量:setName和 setReference。

外部链接示例:

隐藏行号 复制代码 ?这是一段程序代码。

  1. Anchor anchor = new Anchor("website", FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE, new Color(0, 0, 255)));
  2. anchor.Reference = http://itextsharp.sourceforge.net;
  3. anchor.Name = "website";
    

如果你想添加内部链接,你需要选择该链接不同的名称,就象你相位在HTML中利用名称作为锚点一样。为达到该目的,你需要添加一个“#”。

内部链接示例:

隐藏行号 复制代码 ?这是一段程序代码。

  1. Anchor anchor1 = new Anchor("This is an internal link");
  2. anchor1.Name = "link1";
  3. Anchor anchor2 = new Anchor("Click here to jump to the internal link");
  4. anchor.Reference = "#link1";

七、列表(List,ListItem)

通过类List 和ListItem,你可以添加列表到PDF文件中,对于列表你还可以选择是否排序。

排序列表示例:

隐藏行号 复制代码 ?这是一段程序代码。

  1. List list = new List(true, 20);
  2. list.Add(new ListItem("First line"));
  3. list.Add(new ListItem("The second line is longer to see what happens once the end of the line is reached. Will it start on a new line?"));
  4. list.Add(new ListItem("Third line"));
    

结果如下:

1. First line

2. The second line is longer to see what happens once the end of the line is reached. Will it start on a new line?

3. Third line

不排序示例如下:

隐藏行号 复制代码 ?这是一段程序代码。

  1. List overview = new List(false, 10);
  2. overview.Add(new ListItem("This is an item"));
  3. overview.Add("This is another item");
    

结果如下:

· This is an item

· This is another item

可以通过SetListSymbol方法来更改列表符号,可以使用图片或其它对象作为列表符号。

隐藏行号 复制代码 ?这是一段程序代码。

  1. // 用字符串作为列表符号
  2. list1.ListSymbol = "*";
  3. // 用Chunk 作为列表符号(包含“?”字符)
  4. list2.ListSymbol = new Chunk("\u2022", FontFactory.getFont(FontFactory.HELVETICA, 20));
  5. //用图片作为列表符号
  6. list3.ListSymbol = new Chunk(Image.getInstance("myBullet.gif"), 0, 0);

还可以使用IndentationLeft和IndentationRight属性设置缩排,列表符号的缩排使用SymbolIndent属性,也可以在构造函数中设置。

八、注释

你可以添加一小段文本到你的文档中,但它并非文档内容的一部分,注释有标题和内容:

Annotation a = new Annotation(

"authors",

"Maybe it‘s because I wanted to be an author myself that I wrote iText.");

外部链接注释:

你需要指定一个可点击的矩形和一个字符串(URL描述)或URL对象:

Annotation annot = new Annotation(100f, 700f, 200f, 800f, new URL("http://www.lowagie.com"));

Annotation annot = new Annotation(100f, 700f, 200f, 800f, "http://www.lowagie.com");

外部PDF文件链接注释:

你需要指定一个可点击的矩形和一个字符串(文件名称)和目的文件或页码。

Annotation annot = new Annotation(100f, 700f, 200f, 800f, "other.pdf", "mark");

Annotation annot = new Annotation(100f, 700f, 200f, 800f, "other.pdf", 2);

指定行为链接注释

你需要指定一个可点击的矩形和一个指定的行为:

Annotation annot = new Annotation(100f, 700f, 200f, 800f, PdfAction.FIRSTPAGE);

u 应用程序链接注释:

你需要指定一个可点击的矩形和一个应用程序:

Annotation annot = new Annotation(300f, 700f, 400f, 800f, "C://winnt/notepad.exe", null, null, null);

我们无须在页面上指定一个位置,iText会内部处理。你能够看到iText添加文本注释在页面上当前位置下面,第一个在段后第一行下面,第二个在短句结束处的下面。

所有其他注释需要指定想匹配的矩形区域,在示例代码0304中,我们画了一些正方形(使用的函数将在第十章中介绍),为每个正方形添加了一些链接注释。

九、页眉页脚

在旧版本中,有HeaderFooter对象就可以设置页眉页脚,但是新版本中,已经不存在这个对象。

新版本中,使用新的对象PdfWriter中有一个对象:PdfEvent对象,它实现了如下接口:

隐藏行号 复制代码 ?这是一段程序代码。

  1. public interface IPdfPageEvent
  2. {
  3.  void OnChapter(PdfWriter writer, Document document, float paragraphPosition, Paragraph title);
  4.         void OnChapterEnd(PdfWriter writer, Document document, float paragraphPosition);
  5.         void OnCloseDocument(PdfWriter writer, Document document);
  6.  void OnEndPage(PdfWriter writer, Document document);
  7.   void OnGenericTag(PdfWriter writer, Document document, Rectangle rect, string text);
  8.      void OnOpenDocument(PdfWriter writer, Document document);
  9.  
  10.         void OnParagraph(PdfWriter writer, Document document, float paragraphPosition);
  11.  
  12.        void OnParagraphEnd(PdfWriter writer, Document document, float paragraphPosition);
  13.  
  14.         void OnSection(PdfWriter writer, Document document, float paragraphPosition, int depth, Paragraph title);
  15.  
  16.        void OnSectionEnd(PdfWriter writer, Document document, float paragraphPosition);
  17.  
  18.         void OnStartPage(PdfWriter writer, Document document);
  19.  
  20.     }

可以在这里面实现。

十、章节(Chapter)和区域(Section)

章节的使用就比较少了,并且不太好控制,这就不作说明

十一、书签

简单创建书签,使用如下代码:

隐藏行号 复制代码 ?这是一段程序代码。

  1. protected PdfOutline SetDestination(PdfOutline root, Chunk chk, string name, string destination)
  2. {
         chk.SetLocalDestination(destination);
         return new PdfOutline(root, PdfAction.GotoLocalPage(destination, false), name);
    }
    

复杂的书签就要使用Pdfaction,PdfOutline,PdfDestination三个对象来创建了。

十二、中文语言支持

中文语言支持,要加入一些扩展dll,加入方法如下所示:

public static void RegisterFont()
        {
            if (!_isRegisterFont)
            {
                lock (typeof(TextSharpHelper))
                {
                    if (!_isRegisterFont)
                    {
                        BaseFont.AddToResourceSearch("iTextAsian.dll");
                        BaseFont.AddToResourceSearch("iTextAsianCmaps.dll");
                        FontFactory.Register(Environment.GetFolderPath(Environment.SpecialFolder.System) +
                                             @"\..\Fonts\STSONG.ttf");
                        FontFactory.Register(Environment.GetFolderPath(Environment.SpecialFolder.System) +
                                             @"\..\Fonts\simhei.ttf");
                        FontFactory.Register(Environment.GetFolderPath(Environment.SpecialFolder.System) +
                                             @"\..\Fonts\simsun.ttc");
                        _isRegisterFont = true;
                    }
                }
            }

        }

上面的两个dll是注册中文语言支持,后面是注册系统下的一些中文字体文件。

十三、文字、表格、图像混排

在进行文字、表格、图像混排中,有时比较难控制位置,最好是把文字、表格、图像分别放到不同的段落中,这样才能很好控制位置。

十四、表单写入

读取表单中的域:

隐藏行号 复制代码 ?这是一段程序代码。

  1. public static Dictionary<string, string> ReadForm(string pdfTemplate)
    
  2.         {
    
  3.             Dictionary<string, string> dic = new Dictionary<string, string>();
    
  4.             PdfReader pdfReader = null;
    
  5.             try
    
  6.             {
    
  7.                 pdfReader = new PdfReader(pdfTemplate);
    
  8. 
    
  9. 
    
  10.                 AcroFields pdfFormFields = pdfReader.AcroFields;
    
  11.                 foreach (KeyValuePair<string, AcroFields.Item> de in pdfFormFields.Fields)
    
  12.                 {
    
  13.                     dic.Add(de.Key, "");
    
  14.                 }
    
  15. 
    
  16.             }
    
  17.             finally
    
  18.             {
    
  19.                 if (pdfReader != null)
    
  20.                 {
    
  21.                     pdfReader.Close();
    
  22.                 }
    
  23.             }
    
  24. 
    
  25.             return dic;
    
  26.         }
    

对表单中的域进行填充:

隐藏行号 复制代码 ?这是一段程序代码。

  1. public static void FillForm(string pdfTemplate, string newFile, Dictionary<string, string> dic)
    
  2.         {
    
  3.             PdfReader pdfReader = null;
    
  4.             PdfStamper pdfStamper = null;
    
  5.             try
    
  6.             {
    
  7.                 pdfReader = new PdfReader(pdfTemplate);
    
  8.                 pdfStamper = new PdfStamper(pdfReader, new FileStream(
    
  9.                  newFile, FileMode.Create));
    
  10. 
    
  11. 
    
  12.                 AcroFields pdfFormFields = pdfStamper.AcroFields;
    
  13.                 foreach (KeyValuePair<string, string> de in dic)
    
  14.                 {
    
  15.                     pdfFormFields.SetField(de.Key, de.Value);
    
  16.                 }
    
  17. 
    
  18.                 pdfStamper.FormFlattening = true;
    
  19.             }
    
  20.             finally
    
  21.             {
    
  22.                 if (pdfReader != null)
    
  23.                 {
    
  24.                     pdfReader.Close();
    
  25.                 }
    
  26. 
    
  27.                 if (pdfStamper != null)
    
  28.                 {
    
  29.                     pdfStamper.Close();
    
  30.                 }
    
  31.             }
    
  32.         }
时间: 2024-10-13 08:15:27

ITextSharp使用说明 (转)的相关文章

itextsharp利用模板生成pdf文件笔记

iTextSharp是一款开源的PDF操作类库,使用它可以快速的创建PDF文件. 中文参考网站:http://hardrock.cnblogs.com/ http://pdfhome.hope.com.cn/Article.aspx?CID=bf51a5b6-78a5-4fa3-9310-16e04aee8c78&AID=f5fe52dd-8419-4baa-ab1c-ea3f26952132 英文参考网站:http://itext.ugent.be/library/ ·  技术文章(http:

Linux系统下安装rz/sz命令及使用说明

对于经常使用Linux系统的人员来说,少不了将本地的文件上传到服务器或者从服务器上下载文件到本地,rz / sz命令很方便的帮我们实现了这个功能,但是很多Linux系统初始并没有这两个命令.今天,我们就简单的讲解一下如何安装和使用rz.sz命令. 1.软件安装 (1)编译安装 root 账号登陆后,依次执行以下命令: 1 cd /tmp 2 wget http://www.ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz 3 tar zxvf lrzsz-0.1

利用itextsharp导出pdf

在项目中,客户要求把一些表格导出pdf格式,在网上找了好久终于发现一个完美的解决方案,利用itextsharp可以很方便的导出pdf文件,不说太多了,直接上图,有图有真相 首先是页面图片 然后是导出的pdf图片 导出pdf代码如下: //导出Mold pdf文档 public void exportpdf_Mold(string quotenum, string fullpath) { string pdfName = quotenum + ".pdf"; string savePat

android 布局之滑动探究 scrollTo 和 scrollBy 方法使用说明

涉及到滑动,就涉及到VIEW,大家都知道,android的UI界面都是由一个一个的View以及View的派生类组成,View作为基类,而常用的布局里面的各种布局就是它派生出来的ViewGroup的子类,ViewGroup作为各个组件的容器搭建了整体的UI.以下是android UI的结构示示意图: 查看源码 /** * Implement this to do your drawing. * * @param canvas the canvas on which the background w

Git使用说明

Git是流行的分布式版本控制系统,可以方便的管理多人协作的项目并避免了集中式版本控制系统对服务器的依赖. 简介 版本库(repository)是一个由Git管理的目录,Git将跟踪工作目录下文件的修改并在需要时还原. 在工作目录下.git子目录则维护着版本库 . Git维护三个组件: 工作目录: 保存实际文件 暂存区 : 保存尚未提交的修改 版本库: 保存已提交的修改 HEAD: 指向最后一次提交后的结果(checkout 命令的主要功能就是操作HEAD). Git将每次提交的修改串成一条时间线

软件使用说明

软件使用说明:我们的软件是一款基于在校女大学生的记账软件,根据调查身边的女生,统计出了大部分的女生每个月开销的分类.在我们的软件中按这些分类记录每个人的每天的开销,根据调查结果显示有部分学生还有收入,所以我们的记账软件还增加了收入项.我们软件可以根据你每天输入的开销来计算你每个月的开销,并且你可以在其中设置每个月开销的额度,根据你的开销对你的花销进行提醒.在每天你也可以收到关于你这一天开销的提醒,比如:提醒你录入,提醒你今天的花费是否超标.

IDEA工具使用说明

IDEA使用说明 1.安装 2.开始界面 1)create New Project (新建项目) 2)Import Project  (导入项目) 3)Open (打开已有的项目) 4)Check out from Version Control (从版本控制库中导入项目) 3.新建项目 1)方式一: 说明:左边的列表显示的是IDEA可以的项支持目种类,右边是需要额外添加的构面,选择好相应的构面,点击next. 说明:上面的一部分是制定项目的名称,下面一部分是制定项目中模块的名称.当创建了一个项

中海达RTK使用说明之两个点计算参数

中海达RTK求转换参数操作步骤,中海达GPS四参数计算,中海达HI-Survey参数计算简要操作,已知两个控制点求转换参数, 手薄型号:Ihand20 安卓系统手薄 软件:hi-survey road\elec 仪器:中海达公司任意RTK产品 使用两个点求转换参数流程: 第一步:碎步测量控制点 第二步:把两个控制点已知坐标输入到控制点库 第三步:计算参数 第四步:检核参数精度,测控制点作对比,或点放样控制点 使用两个点如何求转换参数? 如何选取控制点计算参数? 四参数控制范围只是计算选用的两个控

AC6102开发板USB3.0测试和使用说明

AC6102开发板USB3.0测试和使用说明 概述 AC6102上集成了一颗Cypress 推出的高性能USB3.0传输芯片CYUSB3014,Cypress称之为EZ-USBFX3.该芯片性能强劲,功能强大,接口简单,非常适合用于各种需要高速数据传输的场合,以下为摘自EZ-USBFX3数据手册中关于该芯片的介绍: 赛普拉斯EZ-USBFX3是新一代USB3.0外设控制器,具有高度集成的灵活特性,可帮助开发人员为任何系统添加USB3.0功能.EZ-USBFX3具有一个可进行完全配置的并行通用可编