当前位置:K88软件开发文章中心编程语言.NET.NET01 → 文章内容

用C#制作PDF文件全攻略

减小字体 增大字体 作者:佚名  来源:翔宇亭IT乐园  发布时间:2018-12-31 11:51:02

terB = 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格式文件,不再翻译。

  第二章 块、短句和段落

  块

  块(Chunk)是能被添加到文档的文本的最小单位,块可以用于构建其他基础元素如短句、段落、锚点等,块是一个有确定字体的字符串,要添加块到文档中时,其他所有布局变量均要被定义。下面一行中,我们创建了一个内容为“hello World”、红色、斜体、COURIER字体、尺寸20的一个块:

  Chunk chunk = new Chunk("Hello world", FontFactory.getFont(FontFactory.COURIER, 20, Font.ITALIC, new Color(255, 0, 0)));

  u 典型字体1:

  在本指南中,除了第九章外(你可以在这里学会使用其他字体),我们将始终使用典型字体1,这些是不同的典型字体1:

  · Courier (该字体定宽)

  · Helvetica

  · Times Roman

  · Symbol

  · ZapfDingbats

  u 下划线/删除线

  如果你希望一些块有下划线或删除线,你可以通过改变字体风ge简单做到:

  Chunk chunk1 = new Chunk("This text is underlined", FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE));

  Chunk chunk2 = new Chunk("This font is of type ITALIC | STRIKETHRU", FontFactory.getFont(FontFactory.HELVETICA, 12, Font.ITALIC | Font.STRIKETHRU));

  u 上标/下标

  在块中有几个方法可以调用,其中大部分将在接下来的章节中介绍,本章中只介绍一个方法 setTextRise(float f). 你可以使用该方法在上标或下标中写块。

:2011-02-09 10:04:49

  u 块的背景

  如果你想改变块的背景,你可以使用方法setBackground(Color color). 这将在块文本的下面添加一个彩色矩形:

  ck.setBackground(new Color(0xFF, 0xFF, 0x00));

  在示例代码0101中,你可以概览典型字体1和一个使用setTextRise, setBackground等方法的的例子。

  短句

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

  u 古希腊语

  因为古希腊语经常使用,在类Phrase的构造函数中有一个特征:将一个字符串作为参数(如果你想避免这种情况,你只能使用块工作而不能使用字符串),正如你在示例代码0203中看到的,这个特征自动地将913至937(除903)和945至969(古希腊的ASCII值)范围内的所有字体改为希腊符号。

  u 非主要性

  与其说这是一个特征,不如说是一个缺陷,但无论如何,这使创建一个非主要性的短句或段落成为可能,这将产生一个由下向上书写的临时作用(参见示例代码0204)。如果你想在一页中将一些位置移动到上面时可能有用。

  说明,当你穿越上边届时无法检查,也没有办法让你回到前一页。

  段落

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

  Paragraph p1 = new Paragraph(new Chunk("This is my first paragraph.", FontFactory.getFont(FontFactory.HELVETICA, 12)));

  Paragraph p2 = new Paragraph(new Phrase("This is my second paragraph.", FontFactory.getFont(FontFactory.HELVETICA, 12)));

  Paragraph p3 = new Paragraph("This is my third paragraph.", FontFactory.getFont(FontFactory.HELVETICA, 12));

  所有有些对象将被添加到段落中:

  p1.add("you can add strings, "); p1.add(new Chunk("you can add chunks ")); p1.add(new Phrase("or you can add phrases."));

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

  u 保持段落的整体性

  在示例代码0206中,我们使用了setKeepTogether(true)方法来试图将一个段落放在同一页中,该方法并不是始终有效,举个例子,第一段不能刚好在一页中,于是被分成了两部分。第二段被放置在第二页,但第三段顺沿到了第三页上。

  字体的延续

  你应该掌握字体延续的一些规则,这些规则的应用见示例代码0207,当我们将一些内容用指定的字体(非默认字体)创建一个短句或者段落后再添加更多内容时,初始对象的字体风ge将被延续,请看“Hello 1!”和“Hello 2”:

  Phrase myPhrase = new Phrase("Hello 2! ", new Font(Font.TIMES_NEW_ROMAN, 8, Font.BOLD));

  myPhrase.Add(new Phrase("some other font ", new Font(Font.HELVETICA, 8, Font.ITALIC)));

  myPhrase.Add(new Phrase("This is the end of the sentence. ", new Font(Font.TIMES_NEW_ROMAN, 8, Font.ITALIC)));

  document.Add(myPhrase);

  我们由Times New Roman 粗体字开始,添加一些文本使用Helvetica字体而不指定风ge,我们发现文本被改变成了粗体,当我们再加一些文本使用Times New Roman字体和斜体风ge,结果变成了粗斜体。

  如果我们使用FontFactory来创建字体,字体风ge不会被延续,因为FontFactory使用了另外的技术构建一个字体:

  myPhrase = new Phrase("Hello 1bis! ", FontFactory.getFont(FontFactory.TIMES_NEW_ROMAN, 8, Font.BOLD));

  myPhrase.Add(new Phrase("some other font ", FontFactory.getFont(FontFactory.HELVETICA, 8, Font.ITALIC)));

  myPhrase.Add(new Phrase("This is the end of the sentence. ", FontFactory.getFont(FontFactory.TIMES_NEW_ROMAN, 8, Font.ITALIC)));

  document.Add(myPhrase);

  在上面的代码中,使用Helvetica字体的文本风字体没有指定(既不是粗体也不是斜体)。采用Times New Roman的额外文本仅仅显示为斜体。

  你也看到我们添加了一个段落,添加该段落就如同一个短句。

  Paragraph myParagraph = new Paragraph("Hello 1! ", new Font(Font.TIMES_NEW_ROMAN, 8, Font.BOLD));

  myParagraph.Add(new Paragraph("This is the end of the sentence.",FontFactory.getFont(new Font.TIMES_NEW_ROMAN, 8)));

  document.Add(myParagraph);

  你可以不这样做,但将失去字体风ge的延续,首先不用任何字体创建段落(例中我们仅仅给字体出间距为1.5倍),然后添加内容的不同部分。

  myParagraph = new Paragraph(12);

  myParagraph.Add(new Paragraph("Hello 3! ", new Font(Font.TIMES_NEW_ROMAN, 8, Font.BOLD)));

  myParagraph.Add(new Paragraph("This is the end of the sentence.", new Font(Font.TIMES_NEW_ROMAN, 8, Font.ITALIC)));

  document.Add(myParagraph);

  如果你使用了Phrase对象,你同样会失去字体风ge的延续:

  myPhrase = new Phrase(12);

  myPhrase.Add(new Phrase("Hello 4! ", new Font(Font.TIMES_NEW_ROMAN, 8, Font.BOLD)));

  myPhrase.Add(new Phrase("This is the end of the sentence.", newFont(Font.TIMES_NEW_ROMAN, 8, Font.ITALIC)));

  document.Add(myPhrase);

  u 更改分割符

  通常,当文本不能放在一行时,文本将被分割成不同的部分,iText首先会查找分割符,如果没有找到,文本将在行尾被截断。有一些预定的分割符如“ ”空ge和“-”连字符,但是你可以使用setSplitCharacter方法来覆盖这些默认值。在示例代码0208中,你可以看到当到达行尾时一个块是如何被分割的。然后分隔符被改成点“.”,该行在该字符处被分割。

  第三章 锚点、列表和注释

  锚点

  我们都知道HTML中的超文本链接,当我们点击某些语句,你能够跳转到网上的其他页。在PDF中也可以实现这种功能。事实上,在第十一章整个章节中有关于PDF链接的介绍,但这是iText的更高级的应用,本章中我们处理简单的iText。

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

  外部链接示例:

  Anchor anchor = new Anchor("website", FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE, new Color(0, 0, 255)));

  anchor.Reference = "http://itextsharp.sourceforge.net";

  anchor.Name = "website";

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

  内部链接示例:

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

  anchor1.Name = "link1";

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

  anchor.Reference = "#link1";

  这两个链接的例子请见示例代码0301。

  列表

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

  排序列表示例:

  List list = new List(true, 20);

  list.Add(new ListItem("First line"));

  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?"));

  list.Add(new ListItem("Third line"));

  结果如下:

  First line

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

  Third line

  不排序示例如下:

  List overview = new List(false, 10);

  overview.Add(new ListItem("This is an item"));

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

  结果如下:

  This is an item

  This is another item

  你可以通过setListSymbol方法更改列表符号:

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

  list1.ListSymbol = "*";

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

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

  //用图片作为列表符号

  list3.ListSymbol = new Chunk(Image.getInstance("myBullet.gif"), 0, 0);

  还可以使用setIndentationLeft和setIndentationRight方法设置缩排,列表符号的缩排在构造函数中设置。更多的例子请参见示例代码0302。

  注释

  iText支持不同风ge的注释。

  u 文本注释:

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

  Annotation a = new Annotation(

  "authors",

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

  u 外部链接注释:

  你需要指定一个可点击的矩形和一个字符串(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");

  u 外部PDF文件链接注释:

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

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

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

  u 指定行为链接注释

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

  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中,我们画了一些正方形(使用的函数将在第十章中介绍),为每个正方形添加了一些链接注释。

  第四章 页眉页脚、章节、区域和绘图对象

  使用在第三至第五章中描述的大量简单iText对象可以避免更多的高级话题(第九至十二章),紧记这些简单对象限制的功能,大量复杂的功能在第三部分。

  页眉页脚

  HeaderFooter对象可以于为文档每页添加页眉和页脚。这样一个页眉或页脚包含一个标准的短句(如果需要)和当前页码,如果你需要更多复杂的页眉和页脚(使用表格或者第几页共几页),请阅读第十二章。

  在示例代码0401中,你可以看到我们首先添加了一个包含页码没有任何边框的页脚。

  HeaderFooter footer = new HeaderFooter(new Phrase("This is page: "), true);

  footer.Border = Rectangle.NO_BORDER;

  document.Footer = footer

  我们还可以使用下面的构造函数:

  HeaderFooter footer = new HeaderFooter(new Phrase("This is page "), new Phrase("."));

  构造函数知道你希望添加一个页码和将其放置在两个短句间,如果你只是设置一个HeaderFooter而不改变边框,页眉或页脚的文本上下各有一条直线。

  HeaderFooter header = new HeaderFooter(new Phrase("This is a header without a page number"), false);

  document.Header = header;

  章节和区域

  在第十一章中将描述如何构建一个树的外观,如果你只需要一个简单的章节和(子)区域,你可以用Chapter对象和Section对象自动构建一个树:

  Paragraph cTitle = new Paragraph("This is chapter 1", chapterFont);

  Chapter chapter = new Chapter(cTitle, 1);

  Paragraph sTitle = new Paragraph("This is section 1 in chapter 1", sectionFont);

  Section section = chapter.addSection(sTitle, 1);

  在示例代码0402中,我们添加了一系列的章节和子区域,你可以看到完整的树形,树形结构默认打开,如果你希望部分节点关闭,你必须使用用BookmarkOpen属性其值为false,详见示例代码0403。

上一页  

:2011-02-09 10:04:49

  图形

  如果你想添加图形,如直线、圆、几何窗体,你应该阅读读十章,但如果你只需要一些有限的功能,你可以使用Graphic对象

  Graphic grx = new Graphic();

  //添加一个矩形

  grx.rectangle(100, 700, 100, 100);

  // 添加一条斜线

  grx.moveTo(100, 700);

  grx.lineTo(200, 800);

  // 将图形显示出来

  grx.stroke();

  document.Add(grx);

  完整的代码请见示例代码0404,如果想看到全部的方法,请参见PdfContentByte对象API。

  当你想给页面加一个边框或者在文本当前位置画一条水平线时,图形对象非常有用。下面的方法用指定的宽度、间距(如果需要)和颜色画一个边框。

  public void setBorder(float linewidth, float extraSpace);

  public void setBorder(float linewidth, float extraSpace, Color color);

  下面的方法用指定的宽度(如果需要)和颜色画一条水平线,线的长度是指定两边缘间可用面积的的百分比。

  public void setHorizontalLine(float linewidth, float percentage)

  public void setHorizontalLine(float linewidth, float percentage, Color color)

  示例代码5中,有一个离边界5磅,线宽3磅的边框,还有两条水平线,一条为黑色,5磅宽,可用空间的100%,另外一条为红色,线宽3磅,可用空间的80%。

  第五章 表格

  重点:如果你仅仅生成PDF文件(没有XML、HTML、RTF……),使用类pdfPTable代替类Table更好。

  一些简单的表格

  一个表格是包含单元格排列成矩阵的矩形区域。表格的距阵并不要求是m×n的,它可以有空洞或者单元格比单个的要大。

  创建一个表格最通用的办法是预先知道有几行几列:

  public Table(int columns, int rows);

  在示例代码0501中,我们构建了一个简单的表:

  Table aTable = new Table(2,2);

  aTable.addCell("0.0");

  aTable.addCell("0.1");

  aTable.addCell("1.0");

  aTable.addCell("1.1");

  该表格有两行两列,单元格被自动添加,从第一行第一列开始,然后是第二列,当一行满后,下一单元格自动添加到下一行的第一列中。

  也可以将单元格添加到表中指定的位置,如示例代码0502,别了要添加System.Drawing.dll引用,以获得Point对象,我们创建了一个4行4列的表格然后添加一些单元格到随机的位置上:

  Table aTable = new Table(4,4);

  aTable.AutoFillEmptyCells = true;

  aTable.addCell("2.2", new Point(2,2));

  aTable.addCell("3.3", new Point(3,3));

  aTable.addCell("2.1", new Point(2,1));

  aTable.addCell("1.3", new Point(1,3));

  你可以看到我们将AutoFillEmptyCells属性设置为true,这将自动、默认的单元格布局填充空的单元格,如果我们忘记了这样做(就象本例中第二个表格),将没有额外的单元格添加,不包含任何单ge的行也将被忽略,在本例中,第一行将不显示,因为该行是空行。

  经常用

上一页  [1] [2] [3] [4]  下一页


用C#制作PDF文件全攻略