第二部分 其他文档格式 第七章 XML和 (X)HTML 本章主要介绍了如何利用iText控件生成XLM文档和(X)HTML文档,但我们对这些并不感兴趣,故只介绍本章中提到的将XML转为PDF。
在第一章中,我们通过5步生产一个PDF文件,为了将一个XML文件转换为PDF文件,只需重写第3和第4步,第5步由解析器自动处理。
//第3步:创建一个解析器并设置文档句柄:
iTextHandler h = new iTextHandler(document);
//第4步,转换该文档:
h.Parse("Chap0701.XML");
示例代码见示例代码0702
第八章 RTF文件 RTF包 RTF包是基于iText包扩展出来的,允许iText除生成PDF文件外还可以输出RTF文件,除了一些在RTF包中不支持的特性外,大多数PDF文件特性都可以使用。
创建一个RTF文档 创建一个RTF文档和创建一个PDF文档方法是一样的,都是这基本的5步,唯一的区别是第2步中用RtfWriter代替了PdfWriter,见示例代码0801。
第1步 创建一个the iTextSharp.text.Document对象的实例:
Document document = new Document();
第2步 创建一个document的RtfWriter将document写入你选择的输出流:
RtfWriter.getInstance(document, new FileStream("Chap0801.rtf"), FileMode.Create);
第3步 打开document:
document.Open();
第4步 添加内容到document
document.Add(new Paragraph("Hello World"));
第5步 关闭document
document.Close();
关于如何创建其他对象并添加到document中,请参见其他章节的内容。
不支持的特性 水印 阅读器参数 加密 内嵌字体 块间距 段落右缩排 列表右缩排 无圆点符号列表 嵌套表格 除JPEG和PNG的其他图片 RTF中扩展的页眉和页脚 写入RTF时无法在开始新页前通过setHeader方法改变文档的页眉或页脚,这里有两个办法来解决这个问题。
利用“Chapters”,添加一个新“chapter”到文档前,使用setHeader或setFooter,你可以在不同的“Chapters”中使用不同的页眉或页脚,见示例代码0802。 使用RtfHeaderFooters类。该类允许你设置4个页眉或页脚,并指定在哪页出现。你当然可以结合Chapter创建4个不同的页眉或页脚,见示例代码0803。 u 使用RtfHeaderFooters类
第1步创建一个RtfHeaderFooters类:
RtfHeaderFooters headers = new RtfHeaderFooters();
第2步添加HeaderFooter对象
headers.Add(RtfHeaderFooters.LEFT_PAGES, new HeaderFooter(new Phrase("This header is only on left hand pages")));
headers.Add(RtfHeaderFooters.RIGHT_PAGES, new HeaderFooter(new Phrase("This header is only on right hand pages")));
第3步如同使用页眉页脚一样使用RtfHeaderFooters
document.Header = headers;
使用RtfHeaderFooters.add(...)的常量:
FIRST_PAGE: 在你文档的第一页使用该页眉或页脚。你将使用rtfWriter.HasTitlePage = true来完成 LEFT_PAGES: 所有左边页均使用该页眉或页脚 RIGHT_PAGES: 所有右边页均使用该页眉或页脚 ALL_PAGES: 所有页均使用该页眉或页脚,只有和FIRST_PAGE 结合使用才有意义。 有一件事非常重要:如果你使用LEFT_PAGES或者RIGHT_PAGES来设置页眉或页脚,再使用ALL_PAGES,页眉和页脚均不会起作用。
表格效果见示例代码0804。
第三部分 iText的高级应用 第九章 字体 本章原文讲了许多字体的使用技巧,但就是没有讲如何使用中文,因此,意义不大,再说,如果不支持中文,前面的也就白翻译了,因此,根据原文讲到的一些知识,我摸索出汉字的使用方法,自己写了本章内容,应该算是“原创”了吧^_^(哎呀!谁拿鸡蛋扔我……)。
Windows中一般都是使用TrueType字体,每个中文版Windows操作系统均默认安装了宋体、仿宋、黑体和楷体四种字体,你还可以安装其他第三方字体,如安装了Office 2000后,会自动安装华文行楷等字体,比较奇怪的是,在PDF文件中插入了一种本计算机才有的字体,在打开PDF文件的计算机上虽然没有该字体,但仍然能正常显示!这有别于Word文件,Word文件将当前计算机中没有的字体一律用宋体代替,这大概是意外收获吧。
字体文件一般保存在windir\Fonts目录中,扩展名为TTF,还有扩展名为TTC的字体文件,也是TrueType字体,不过是一个集合,也就是里面有多种字体。下面列出windows2000简体中文版四种标准字体的文件名称:
SIMSUN.TTC:宋体和新宋体
SIMKAI.TTF:楷体
SIMHEI.TTF:黑体
SIMFANG.TTF:仿宋体
TrueType字体应用 按下面的方法写入黑体字文字,大小为32磅:
BaseFont bfHei = BaseFont.createFont(@"c:\winnt\fonts\SIMHEI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font font = new Font(bfHei, 32);
String text = "这是黑体字测试!";
document.Add(new Paragraph(text, font));
不要管BaseFont.createFont方法第二、三个参数的意思,依葫芦画瓢就行了,第一个参数显示就是字体文件存放的位置。
后面的代码都非常好理解,不再赘述。
TruType字体集合的应用 字体集合的使用同上面差不多,只是在在createFont方中要指定使用哪种字体。如:
BaseFont bfSun=BaseFont.createFont(@"c:\winnt\fonts\SIMSUN.TTC,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
font = new Font(bfSun, 16);
text = "这是字体集合中的新宋体测试!";
document.Add(new Paragraph(text, font));
不难看出,在使用BaseFont.createFont方法时,第一个参数@"c:\winnt\fonts\SIMSUN.TTC,1"中多了一个“,1”,表示使用序号为1字体,序号为0的字体为宋体。
毕竟我们不是做排版软件,有了上面的办法就基本上够用了,真正很复杂的PDF文件制作,不妨做成XML文件(最简单的办法就是用Word排版,然后另存为web页了),然后按第七章的办法转换。
代码见示例代码0901。
第十章 图象和文本的绝对位置 pdfContentByte 到目前为止,我们已经使用了简单的iText,我们已经添加了文本、图片、段落、章节、列表、表格等,没有涉及到布局问题。Itext分割文本到每页中,并将每个单词、句子、段落布置到页面上,但有时我们并不需要这种自动格式,有时我们希望将一些图象或者文本放置在某页的指定位置,为实现该功能,我们将使用PdfContentByte类。
为代替第一章,仅用PdfWriter类的getInstance方法是不够的,你必须真实地拥有一个PdfWriter对象,你可以通过在使用Writer对象中使用getDirectContent()方来得到该对象。例:
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("test.pdf"));
PdfContentByte cb = writer.DirectContent;
说明:当你添加高级对象(如表格)时,两个PdfContentByte对象将被内部使用:一个用于文本,一个用用于图象(如边界或单元格背景)。文本绘制浮于图象的上面。
当你通过getDirectContent()方法直接使用PdfContentByte对象时,你所添加的所有对象都将浮于文本和图象。如果你想避免这种情况和希望添加内容在图象或文本的背后,你需要使用用getDirectContentUnder()方。
一句话,当一页完成时,4层的重叠遵照如下顺序:
1、 通过getDirectContentUnder()得到的PdfContentByte
2、 包含图象或高级对象的内部PdfContentByte
3、 病文本或高级对象的内部PdfContentByte
4、 通过getDirectContent()得到的PdfContentByte
(编辑:aniston)
|