当创建一个矩形或设置边距时,你可能希望知道该用什么度量单位:厘米、英寸或象素,事实上,默认的度量系统以排版单位磅为基础得出其他单位的近似值,如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类的构造函数是私有的,你只能通过下面的方法创建一个实例:
p lic 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中测试这些代码。
第三步 打开Document
u 摘要
在你写入任何实际数据之前,你可能希望通过以下几种方法写入一些关于本文档的摘要:
p lic boolean addTitle(String title)
p lic boolean addS ject(String s ject)
p lic boolean addKeywords(String keywords)
p lic boolean addAuthor(String author)
p lic boolean addCreator(String creator)
p lic boolean addProd?r()
p lic boolean addCreationDate()
p lic boolean addHeader(String name, String content)
你可以选择自己的标题、主题、关键字、作者、创建程序,但以下产品信息将始终被添加:iTextSharp (或者iTextSharp的引用)和创建时间(实际上这两种方法是自动调用的)。
你还可以将自定义的名称添加为“报头信息”,但是这对于PdfWriter没有任何作用,如果看看实例代码0101产生的pdf文件的“文档属性”,我们可以看到仅仅有PDF创建程序和产品日期,而示例代码0106的“文档属性”框中有更多的信息。
打开document前要做的事:
你只能在Open方法调用之前添加摘要,这是iText开发工具提供的一个选择。
在HTML中,报头信息被放在文档前面报头标识中间,调用Open方法将导致报头信息写入流,因而在Document被打开后无法更改这些数据。
PDF报头信息不包括摘要,看起来有类似于:
%PDF-1.2
该行显示生成的文档是一个版本为1.2的PDF格式的文件,在PDF中,摘要保存在PdfInfo对象中,当文档关闭时已经写入PdfWriter中了,因此,没有关于为什么不能修改库来满足任何时候添加或更改摘要的技术原因
u 页面初始化
Open方法在不同的Witer中同时会产生初始化事件,举例来说,如果你需要一个水印或者页眉页角对象出现在文档第一页的开始处,你需要在打开文档前添加这些,同样的用于设置该文档其他页水印、页眉、页角、页数和尺寸。
当调用下列方法:
p lic bool setPageSize(Rectangle pageSize)
p lic bool Add(Watermark watermark)
p lic void removeWatermark()
setting Header property
p lic void resetHeader()
setting Footer property
p lic void resetFooter()
p lic void resetPageCount()
setting PageCount property
产生的结果只能在下一个新页中看到(当在本页调用初始化方法时),代码见示例代码0107,你必须要准备一张名为watermark.jpg的图片,如下图:
u 阅读器参数:
你可以通过下面的办法为PDF文件指定一些阅读器 (如Adobe Reader) 参数:
p lic void setViewerPreferences(int preferences)
在示例代码0108中,指定了下面一些参数:
writerA.setViewerPreferences(PdfWriter.PageLayoutTwoColumnLeft);
writerB.setViewerPreferences(PdfWriter.HideMen ar | PdfWriter.HideToolbar);
writerC.setViewerPreferences(PdfWriter.PageLayoutTwoColumnLeft | PdfWriter.PageModeFullScreen | PdfWriter.NonFullScreenPageModeUseThumbs);
正如你所看到的,参数可以使用以下一些常量:
l 文件被打开时,页面布局用到下面的其中一个 :
PdfWriter.PageLayoutSinglePage – 同时只显示一个页面
PdfWriter.PageLayoutOneColumn –单列显示
PdfWriter.PageLayoutTwoColumnLeft –双列显示,奇数页在左
PdfWriter.PageLayoutTwoColumnRight -双列显示,奇数页在右
l 文件打开时,页面模式用到下面其中之一:
PdfWriter.PageModeUseNone – 既不显示大钢也不显示缩略图
PdfWriter.PageModeUseOutlines – 显示大纲
PdfWriter.PageModeUseThumbs – 显示缩略图
PdfWriter.PageModeFullScreen – 全屏模式,没有菜单、windows控件或者其他任何windows可见控件
l PdfWriter.HideToolbar – 当文档激活时,是否隐藏阅读程序(如Adobe Reader)的工具条
l PdfWriter.HideMen ar -当文档激活时,是否隐藏阅读程序的菜单.
l PdfWriter.HideWindowUI -当文档激活时,是否隐藏阅读程序的界面元素,如滚动条、导航条等,而仅仅保留文档显示
l PdfWriter.FitWindow – 是否调整文档窗口尺寸以适合显示第一页。
l PdfWriter.CenterWindow – 是否将文档窗口放到屏幕中央
l 在全屏模式下,指定如何显示界面元素(选择一个)
PdfWriter.NonFullScreenPageModeUseNone -既不显示大钢也不显示缩略图
PdfWriter.NonFullScreenPageModeUseOutlines – 显示大钢
PdfWriter.NonFullScreenPageModeUseThumbs – 显示缩略图
说明:你只能在类PdfWriter中调用这些方法。
u 加密
打开文档之前还要做的一件事情就是加密(如果你希望该文档加密),要达到这个目的,你可以使用下面的方法:
p lic void setEncryption(boolean strength, String userPassword, String ownerPassword, int permissions);
strength 是下面两个常量之一:
PdfWriter.STRENGTH40BITS: 40 位
PdfWriter.STRENGTH128BITS: 128位 (Acrobat Reader 5.0及以上版本支持)
UserPassword和ownerPassword 可以为空或零长度, 这种情况下, ownerPassword 将被随机的字符串代替
Permissions 为下列常量之一:
PdfWriter.AllowPrinting
PdfWriter.AllowModifyContents
PdfWriter.AllowCopy
PdfWriter.AllowModifyAnnotations
PdfWriter.AllowFillIn
PdfWriter.AllowScreenReaders
PdfWriter.AllowAssembly
PdfWriter.AllowDegradedPrinting
该功能参见示例代码0109和示例代码0110。
writer.setEncryption(PdfWriter.STRENGTH40BITS, null, null, PdfWriter.AllowCopy);
示例代码0109产生的文件能够被打开而无须密码,但用户不能打印、修改本文档。
writer.setEncryption(PdfWriter.STRENGTH128BITS, "userpass", "ownerpass", PdfWriter.AllowCopy | PdfWriter.AllowPrinting);
打你试图打开示例代码0110产生的文件时,将要求输入密码(\'userpass\'),因为添加了AllowPrinting参数,你可以打印该文档而不会发生任何问题。
第四步 添加内容
在解释第一步到第三步的不同示例中,你可能已经遇到了一些对象如Phrase, Paragraph等 在接下来的几章中,所有这些问题都将得到详细解释。
有时你可能想一个writer故意忽略document产生的行为,如示例代码0111:
当我们创建了两个writer: writerA 和 writerB:
PdfWriter writerA = PdfWriter.getInstance(document, new FileStream("Chap0111a.pdf", FileMode.Create));
PdfWriter writerB = PdfWriter.getInstance(document, new FileStream("Chap0111b.pdf", FileMode.Create));
我们可以创建两个有细微差别的文档:
writerA.Pause();
document.add(new Paragraph("This paragraph will only be added to Chap0111b.pdf, not to Chap0111a.pdf"));
writerA.resume();
你可以比较文件: Chap0111a.pdf和Chap0111b.pdf的区别
第五步,关闭 document
关闭 document 非常重要, 因为它将关闭正在运行的Writer并将内容写入文件,该方法在最后被调用,你应该总是要关闭文档。
高级话题:阅读PDF文件
该部分内容介绍了iText只能产生PDF格式的文件而不能解析PDF格式文件,不再翻译。
第二章 块、短句和段落
块