首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CSharp每日代码示例:使用iTextSharp创建PDF文件

本文演示如何使用iTextSharp PDF库将文本文件转换为PDF文件。iTextSharp是一个从JAVA项目iText衍生的.Net版本的开源项目,采用GPL许可证发布。这个项目在创建PDF文件方面功能相当强大,弱点是缺少对于现有PDF文件进行修改和分析的功能。

介绍:

ITextSharp中相关的概念:

一、Document

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

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

第一个构造函数以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”。

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

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

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

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

但是你几乎永远不会用到Writer实例(除非你想创建高级PDF或者希望用一些非常特殊的函数,如ViewerPreferences 或 Encryption)。所以通过下面的办法得到实例已经足够了: 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。

外部链接示例:

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

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

内部链接示例:

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

Anchor anchor1 =newAnchor("This is an internal link");

anchor1.Name ="link1";

Anchor anchor2 =newAnchor("Click here to jump to the internal link");

anchor.Reference ="#link1";

七、列表(List,ListItem)

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

排序列表示例:

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

List list =newList(true, 20);

list.Add(newListItem("First line"));

list.Add(newListItem("The second line is longer to see what happens once the end of the line is reached. Will it start on a new line?"));

list.Add(newListItem("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

不排序示例如下:

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

List overview =newList(false, 10);

overview.Add(newListItem("This is an item"));

overview.Add("This is another item");

结果如下:

· This is an item

· This is another item

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

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

// 用字符串作为列表符号

list1.ListSymbol ="*";

// 用Chunk 作为列表符号(包含“•”字符)

list2.ListSymbol =newChunk("\u2022",FontFactory.getFont(FontFactory.HELVETICA, 20));

//用图片作为列表符号

list3.ListSymbol =newChunk(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对象:

外部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对象,它实现了如下接口:

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

public interfaceIPdfPageEvent

{

void OnChapter(PdfWriter writer, Document document,float paragraphPosition,Paragraph title);

void OnChapterEnd(PdfWriter writer, Document document,float paragraphPosition);

void OnCloseDocument(PdfWriter writer, Document document);

void OnEndPage(PdfWriter writer, Document document);

void OnGenericTag(PdfWriter writer, Document document, Rectangle rect,string text);

void OnOpenDocument(PdfWriter writer, Document document);

void OnParagraph(PdfWriter writer, Document document,float paragraphPosition);

void OnParagraphEnd(PdfWriter writer, Document document,float paragraphPosition);

void OnSection(PdfWriter writer, Document document,float paragraphPosition, int depth,Paragraph title);

void OnSectionEnd(PdfWriter writer, Document document,float paragraphPosition);

void OnStartPage(PdfWriter writer, Document document);

}

可以在这里面实现。

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

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

十一、书签

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

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

protectedPdfOutline SetDestination(PdfOutline root, Chunk chk,string name, string destination)

{ chk.SetLocalDestination(destination);return newPdfOutline(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是注册中文语言支持,后面是注册系统下的一些中文字体文件。

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

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

十四、表单写入

读取表单中的域:

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

public staticDictionary ReadForm(string pdfTemplate)

{

Dictionary dic = newDictionary();

PdfReader pdfReader =null;

try

{

pdfReader =newPdfReader(pdfTemplate);

AcroFields pdfFormFields = pdfReader.AcroFields;

foreach (KeyValuePair dein pdfFormFields.Fields)

{

dic.Add(de.Key,"");

}

}

finally

{

if (pdfReader != null)

{

pdfReader.Close();

}

}

return dic;

}

对表单中的域进行填充:

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

public static void FillForm(string pdfTemplate, string newFile,Dictionary dic)

{

PdfReader pdfReader =null;

PdfStamper pdfStamper =null;

try

{

pdfReader =newPdfReader(pdfTemplate);

pdfStamper =newPdfStamper(pdfReader,newFileStream(

newFile,FileMode.Create));

AcroFields pdfFormFields = pdfStamper.AcroFields;

foreach (KeyValuePair de in dic)

{

pdfFormFields.SetField(de.Key, de.Value);

}

pdfStamper.FormFlattening =true;

}

finally

{

if (pdfReader != null)

{

pdfReader.Close();

}

if (pdfStamper != null)

{

pdfStamper.Close();

}

}

}

简单示例:多个文本文件转换一个PDF

关于使用的类:

StreamReader类使用流(比如文本文件)提供读取访问。

Document类允许创建一个新的PDF文件。

PdfWriter类提供了从文档类对象编写PDF文档的即时访问。

引用的命名空间

有到的控件:

TextBox Control (txtOutput)

Button Control (btnSelect, btnCreatePDF, btnClear)

ListBox Control (lbInputs)

RadioButton Control (rbCombined, rbIndividual)

在下面,我实现了将多个文本文档转换为单个组合PDF和使用iTextSharp工具转换为单个PDF的代码

The Code

1. Variable Declaration

Documentdoc;//Create a New instance on Document Class

Listing 1

2. Select the Input Text Files (code for the "Select Files" Button); see:

using(OpenFileDialogfile =newOpenFileDialog())

{

//Allow to select multiple files

file.Multiselect =true;

//Allow to select only *.txt Files

file.Filter ="Only Text Documents|*.txt";

//Show the Dialog box to selcet file(s)

file.ShowDialog();

//Add the input file names to ListBox

lbInputs.Items.AddRange(file.FileNames);

}

Listing 2

3. Function to Create a New instance of the PDFWriter Class:

voidGetInstance(Stringstr)

{

//Create a New instance of PDFWriter Class for Output File

PdfWriter.GetInstance(doc,newFileStream(str,FileMode.Create));

}

Listing 3

4. Convert Text Files into PDF File(s) (code for "Create PDF" Button):

//ForCombined PDFOption is Selected

//Create a New instance on Document Class

doc =newDocument();

//Create a new instance of PDFWriter Class for output file

GetInstance(txtOutput.Text);

//Open the Document

doc.Open();

foreach(StringvarinlbInputs.Items)

{

//Access Each file in ListBox using StreamReader Class

using(StreamReaderrdr =newStreamReader(var))

{

//Add New Page to the Output file

doc.NewPage();

//Add the File name of text file to PDF File

doc.Add(newParagraph("File Name : "+ var +"\n\n"));

//Add the content of Text File to PDF File

doc.Add(newParagraph(rdr.ReadToEnd()));

}

}

//Close the Document

doc.Close();

MessageBox.Show("Conversion Successful....");

//Open the Converted PDF File"

System.Diagnostics.Process.Start(txtOutput.Text);

Listing 4

//ForIndividual PDFsOption is Selected

//Create a Output Directory for storing individual PDF files

Directory.CreateDirectory(txtOutput.Text

foreach(StringvarinlbInputs.Items)

{

//Create a New instance on Document Class

doc =newDocument();

//Create a New Instance of FileInfo Class

//to get the Extension of selected file

FileInfofile =newFileInfo(var);

//Create a new instance of PDFWriter Class for output file

GetInstance(txtOutput.Text +

file.Name.Replace(file.Extension,".pdf"));

using(StreamReaderrdr =newStreamReader(var))

{

//Open the Document

doc.Open();

//Add the content of Text File to PDF File

doc.Add(newParagraph(rdr.ReadToEnd().ToString()));

//Close the Document

doc.Close();

}

}

MessageBox.Show("ConversionSuccessful....");

Listing 5

现在执行应用程序并查看结果

本文:https://www.cnblogs.com/xcj26/articles/5688236.html

iTextSharp使用可参考博客:

http://www.cnblogs.com/CareySon/archive/2011/11/09/2243496.html

中的系列教程。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180609A095MM00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券