到目前为止,所有例子中使用的图片均来自地本地磁盘或者某个网站,但也可能使用包含图片信息的数组来得到图片的实例:
public static Image getInstance(byte[] img)
该方法同前面方法的效果相同,返回一个新的Gif,Jpeg或者Png类别的Image对象。
在示例代码0609中,我们添加一个从一个Jpeg文件中读入到字节数组中的图片,很明显,使用其他getInstance方法得到实例更优越,但这仅仅是一个例子,该getInstance方法在动态创建那些根本不存在的图片时非常有用。 该例子也演示了如何创建和使用一个原始图片。
public static Image getInstance(int width, int height, int components, int bpc, byte data[])
本例中创建了一个100×100象素的图片,因为每个象素用RGB描述,所以图片大小为100×100×3字节。
System.Drawing.Bitmap
示例代码0610是一个比较高级的话题,理由如下:
1. 首次使用到了System.Drawing.Bitmap类。该类在.net框架中,可以使用更多类型的图片,
如TIFF、GIF,而这些图片在iText中均不支持,你可以检查一下.net框架看看你需要的图片格式是否得到支持。
2. 前面的例子中,还有一些事情要注意:当添加一个图片时不会出现什么问题,文字始终浮于图片
上面,本例中,我们希望图片浮在文字上面。这也是为什么我们将使用iTextSharp.text.pdf.PdfContentByte类的原因(见第十章)。 3. 你将发现使用的图片为透明的gif格式,你可以到
http://itextsharp.sourceforge.net/examples/h.gif下载得到。
TIFF和CCITT
示例代码0611也是一个比较高级的话题,例中转换一个TIFF文件到PDF文件。
? 图片遮罩
示例代码0613在,我们创建了一个用作遮罩的图片
3C
该图片尺寸为8×8象素,每组一个字节,使用makeMask()方法可以转换成遮罩。
byte maskr[] = {(byte)0x3c, (byte)0x7e, (byte)0xe7, (byte)0xc3, (byte)0xc3, (byte)0xe7, (byte)0x7e, (byte)0x3c}; Image mask = Image.getInstance(8, 8, 1, 1, maskr); mask.makeMask();
mask.setInvertMask(true);
我们可以用该遮罩直接遮住其他图片的一部分。 PdfContentByte cb = writer.DirectContent; Image image = Image.getInstance(\image.ImageMask = mask;
或者我们将该遮罩用于模板遮罪中。
PdfContentByte cb = writer.DirectContent; cb.setRGBColorFill(255, 0, 0);
7E E7 C3 C3 E7 7E 3C
cb.addImage(mask, mask.scaledWidth() * 8, 0, 0, mask.scaledHeight() * 8, 100, 400);
关于ContentByte对象更多信息请参见第十章。
图片和其他对象
? 图片在块中
有时,可以方便地将图片置于块中,通过一定偏移将一个图片置于块中: Chunk ck = new Chunk(img, 0, -5);
具体代码见示例代码0614,我们可以添加该特殊图片块到短句、表格等,本例中的图片请到
http://itextsharp.sourceforge.net/examples/pngnow.png下载。 ? 图片在表格中
你可以将图片添加到单元格中,但有两个副作用:
? 表格的宽度是确定,当图片超出单元格的宽度时,将自动缩小。 ? 你不能进行文字绕排和为图片添加下划线。 参见示例代码0615。 ? 图片链接注释
如果你希望得到一个可点击的图片,或者想添加链接注释到图片上,你需要创建一个Annotation对象,并添加到图片上,你不需要指定位置(你可以使用0,0,0,0),该位置会内部更新以适合该图片。
gif.Annotation = new Annotation(0, 0, 0, 0, \jpeg.Annotation = new Annotation(\\are my children\0, 0, 0, 0);
参加示例代码0616。
第二部分 其他文档格式
第七章 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(\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。
? 使用RtfHeaderFooters类
第1步创建一个RtfHeaderFooters类: