Chapter 16. iText PDF生成

Seam目前包括了一个利用iText生成文档的组件集。Seam的iText文档支持主要关注于PDF文档的生成,但它也对生成RTF文档提供基本的支持。

16.1. 使用PDF支持

iText支持由 jboss-seam-pdf.jar 提供。 这个JAR包中含有用来构造可以渲染成PDF的视图的iText JSF控件和把把渲染好的文档提供给用户的DocumentStore组件。 为了在你的应用程序中包括PDF支持,要把 jboss-seam-pdf.jar 和iText JAR 文件一起放在你的 WEB-INF/lib 路径下。 要使用Seam的iText支持就只是这样,无需更多的配置了。

Seam iText模块需要使用Facelets作为视图技术。这个库的未来版本也可能支持使用JSP。此外,这个模块还需要用到seam-ui包。

工程 examples/itext 包含了一个PDF支持实践的例子。 这个例子示范了正确的部署包,它包含一些例子,用来示范目前支持PDF生成的关键特性。

16.1.1. 创建一个文档

<p:document>

描述

文档是由facelets文档利用命名空间 http://jboss.com/products/seam/pdf 中的标签生成的。 文档应该总是以 document 标签作为文件的根结点。 document 标签为Seam产生文档到文档库并渲染一个HTML重定向到存储内容做准备。

属性

  • type — 要生成文档的类型。 有效值为PDFRTFHTML 模式。 Seam默认为PDF生成,并且很多特性只有在生成PDF文档时才能正确工作。

  • 最常用的值是 LETTERA4。 被支持页面大小的全部列表可以在类 com.lowagie.text.PageSize 中找到。 也可以这样,pageSize可以直接指定宽度和高度。例如,值"612 792"与LETTER的页面大小是一样的。

  • orientation — 页面的定位。 有效值是 portraitlandscape,在前景模式下,页面大小的高度和宽度值是颠倒的。

  • margins — 有左边距,右边距,上边距和下边距值。

  • marginMirroring — 显示页边距设置应该反转一个交换页面。

Metadata属性

  • 标题

  • 主题

  • 关键字

  • 作者

  • 创建者

用法

<p:document xmlns:p="http://jboss.com/products/seam/pdf">
  The document goes here.文档指向这里。
</p:document>

16.1.2. 基本的文本元素

有用的文档需要包含的不仅仅是文本。但是标准的UI组件只适合生成HTML,而不适合生成PDF内容。 反之,Seam则提供了一种特殊的UI组件,用来生成适当的PDF内容。 像 <p:image><p:paragraph> 这样标签是简单文档的根本。 像 <p:font> 这样的标签给它们周围的所有内容都提供了样式信息。

<p:paragraph>

描述

为了使文本片段能够按照逻辑分组布局、格式化、修饰,段落标签中包含了文本的大部分用法。

属性

  • firstLineIndent 行首缩进

  • extraParagraphSpace 额外段落空间

  • leading 段首

  • multipliedLeading 复合段首

  • spacingBefore — 段落元素前要插入的空白

  • spacingAfter — 段落元素后要插入的空白

  • indentationLeft 左缩进

  • indentationRight 右缩进

  • keepTogether 保持对齐

用法

<p:paragraph alignment="justify">
    This is a simple document.  It isn't very fancy. 这是一个简单的文档,它不是很常用。
</p:paragraph>

<p:text>

描述

text 标签能够使用一般的JSF转换机制从应用程序数据中生成为文本片段。 在渲染HTML文档的时候,它的用法非常类似于 outputText 标签。

属性

  • value — 要显示的这个值,通常是一个值绑定表达式。

用法

<p:paragraph>
    The item costs 显示一件商品的价格<p:text value="#{product.price}">
        <f:convertNumber type="currency" currencySymbol="$"/>
    </p:text>
</p:paragraph>

<p:font>

描述

font标签为它内部的所有文本定义要使用的默认字体。

属性

  • name — 字体名称,例如: COURIERHELVETICATIMES-ROMANSYMBOL 或者 ZAPFDINGBATS

  • size — 字体大小

  • style — 字体样式,下面这些的任意组合: NORMALBOLDITALICOBLIQUEUNDERLINELINE-THROUGH

  • encoding — 字符设置编码

用法

<p:font family="courier" style="bold" size="24">
    <p:paragraph>My Title</p:paragraph>
</p:font>

<p:newPage>

描述

p:newPage 插入一个新页面。

用法

<p:newPage />

<p:image>

描述

p:image 将一张图片插入到文档中。 利用value 属性从classpath或者Web应用程序上下文加载图片。

资源也可以由应用程序代码动态地生成。 imageData 属性可以指定一个值为 java.awt.Image 对象的值绑定表达式。

属性

  • value —一个资源名称或者是一个应用程序生成的图片的方法表达式绑定。

  • rotation — 图片旋转角度。

  • height — 图片高度。

  • width — 图片宽度。

  • alignment— 图片对齐方式。(可能的值请见 Section 16.1.7.2, “对齐方式值”

  • alt — 替换图片的文本。

  • indentationLeft 左缩进

  • indentationRight 右缩进

  • spacingBefore — 元素前要插入的空白。

  • spacingAfter — 元素后要插入的空白

  • widthPercentage 宽度百分比

  • initialRotation 初始旋转

  • dpi 像素

  • scalePercent(图片放缩比例) — 图片放缩比例因子(百分比)。 可以是一个百分比值,也可以两个分别代表X方向和Y方向的百分比值。

  • wrap

  • underlying 下划线

用法

<p:image value="/jboss.jpg" />
<p:image value="#{images.chart}" />

<p:anchor>

描述

p:anchor 定义文档中的活链接. 它支持下面的属性:

属性

  • name — 文档中目标锚点的名称。

  • reference — 链接指向的目标。文档中其他点的链接应该以一个"#"开头。 例如,"#link1" 用 link1 的一外名称指向 name 另一个锚点位置。 链接也可以是指向文档之外的一个资源的完整URL路径。

用法

<p:listItem><p:anchor reference="#reason1">Reason 1</p:anchor></p:listItem>
...
<p:paragraph>
    <p:anchor name="reason1">It's the quickest way to get "rich"</p:anchor>
    ...
</p:paragraph>

16.1.3. 页眉和页脚

<p:header>

<p:footer>

描述

p:headerp:footer 组件提供了将页眉和页脚文本放在生成文档的每个页面上的能力,除了第一个页面之外。页眉和页脚声明应该出现在文档的顶部。

属性

  • alignment — 页眉/页脚框的对齐方式。 (对齐方式的取值请见 Section 16.1.7.2, “对齐方式值”

  • backgroundColor — 页眉/页脚框的背景色。(颜色值请见 Section 16.1.7.1, “颜色值”

  • borderColor — 页眉/页脚框的边框颜色。 单独设置各边框颜色用 borderColorLeftborderColorRightborderColorTopborderColorBottom。(颜色值请见 Section 16.1.7.1, “颜色值”

  • borderWidth — 边框的宽度。 每一条单独的边可以利用 borderWidthLeftborderWidthRightborderWidthTopborderWidthBottom 来指定。

用法

<p:facet name="header">
  <p:font size="12">
    <p:footer borderWidthTop="1" borderColorTop="blue"
              borderWidthBottom="0" alignment="center">
        Why Seam? [<p:pageNumber />]
    </p:footer>
  </p:font>
</f:facet>

<p:pageNumber>

描述

通过 p:pageNumber 标签能够将当前页码放到页眉或者页脚的位置。 该标签只能用在页眉或者页脚的上下文中,并且只能使用一次。

用法

<p:footer borderWidthTop="1" borderColorTop="blue"
          borderWidthBottom="0" alignment="center">
    Why Seam? [<p:pageNumber />]
</p:footer>

16.1.4. 章节

<p:chapter>

<p:section>

描述

如果按照书籍/文章的结构生成文档,p:chapterp:section 标签就可以用来提供必要的结构。 小节标签只能在章的内部使用,但是它们之间却可以任意地嵌套。 大多数的PDF浏览工具都提供可以在文档内部章节之间自由切换的功能。

属性

  • alignment — 页眉/页脚框的对齐方式。 (对齐方式取值请见 Section 16.1.7.2, “对齐方式值”

  • number — 章序号。每章都应该有一个章序号。

  • numberDepth — 文档中章节的层次数。所有的小节都有一个相对于它们周围章/节的序号。 如果文章的默认显示层次数是3,那么3.1.4就表示第三章第一节的第四小节。 如果忽略章序号,那么层数就是2,上述小节的序号就应该显示为1.4。

用法

<p:document xmlns:p="http://jboss.com/products/seam/pdf"
            title="Hello">

   <p:chapter number="1">
      <p:title><p:paragraph>Hello</p:paragraph></p:title>
      <p:paragraph>Hello #{user.name}!</p:paragraph>
   </p:chapter>

   <p:chapter number="2">
      <p:title><p:paragraph>Goodbye</p:paragraph></p:title>
      <p:paragraph>Goodbye #{user.name}.</p:paragraph>
   </p:chapter>

</p:document> 

<p:header>

描述

任何一个章或节都可以包含一个 p:title 标签,用于显示下一章节的序号。 标签的主体可以包含原始文本,或者是一个 p:paragraph 标签。

16.1.5. 列表

标签 p:listp:listItem 可以显示列表结构。 列表里可以包含任意嵌套的子列表。列表中的项不能在列表之外使用。 在文档中通过以下文档使用 ui:repeat 标签显示从Seam组件获取到的值的列表。

<p:document xmlns:p="http://jboss.com/products/seam/pdf"
            xmlns:ui="http://java.sun.com/jsf/facelets"
            title="Hello">
   <p:list style="numbered">
      <ui:repeat value="#{documents}" var="doc">
         <p:listItem>#{doc.name}</p:listItem>
      </ui:repeat>
   </p:list>
</p:document>

<p:list>

属性

  • style — 列表的有序/无序排列方式。 可选项:NUMBEREDLETTEREDGREEKROMANZAPFDINGBATSZAPFDINGBATS_NUMBER。 如果没有指定样式,列表项就以无序排列。

  • listSymbol — 针对无序列表,指定列表符号。

  • indent — 列表的缩进程度。

  • lowerCase — 针对以字母方式排序的列表,表明字母是否应该为小写。

  • charNumber — 针对ZAPFDINGBATS排序,指明无序字符的字符编码。

  • numberType — 针对ZAPFDINGBATS_NUMBER排序,指明编号方式。

用法

<p:list style="numbered">
  <ui:repeat value="#{documents}" var="doc">
    <p:listItem>#{doc.name}</p:listItem>
  </ui:repeat>
</p:list>

<p:listItem>

描述

p:listItem 支持以下属性:

属性

用法

...

16.1.6. 表格

可以使用标签 p:tablep:cell 创建表格结构。 和许多表格结构不同,这里的的表格结构没有明确的行声明。如果一个表格有3列,那么每3个单元格会自动组成一行。 可以声明标题行和注脚行,并且当一个表格结构跨越多个页面的时候,标题行和注脚行就会重复地出现在每个页面上。

<p:table>

描述

p:table 支持以下属性。

属性

  • columns — 组成一个表行的列(单元格)的数量。

  • widths — 每个列的相对宽度。每个列应该都要有一个值。 例如widths="2 1 1"表示这个表格有3列,第一列的宽度是第二列和第三列的两倍。

  • headerRows — 初始行数量, 可以认为是标题或者注脚行的数量,在表格跨多个页面的时候应该重复的行数。

  • footerRows — 被认为是注脚行的行数。 这个值应该减去 headerRows 值。 如果文档有2行构成标题行、1行构成注脚行,那么 headerRows 应该设置为3,footerRows 应该设置为1

  • widthPercentage — 表格占页面宽度的百分比。

  • horizontalAlignment — 表格的水平对齐方式。 (可能取值请见 Section 16.1.7.2, “对齐方式值”

  • skipFirstHeader

  • runDirection

  • lockedWidth

  • splitRows

  • spacingBefore — 元素前要插入的空白。

  • spacingAfter — 元素后要插入的空白。

  • extendLastRow

  • headersInEvent

  • splitLate

  • keepTogether

用法

<p:table columns="3" headerRows="1">
  <p:cell>name</p:cell>
  <p:cell>owner</p:cell>
  <p:cell>size</p:cell>
  <ui:repeat value="#{documents}" var="doc">
    <p:cell>#{doc.name}</p:cell>
    <p:cell>#{doc.user.name}</p:cell>
    <p:cell>#{doc.size}</p:cell>
  </ui:repeat>
</p:table>

<p:cell>

描述

p:cell 支持下面的属性。

属性

  • colspan — 通过声明 colspan 值大于1,单元格可以跨多个列。表格不具备跨多行的能力。

  • horizontalAlignment — 单元格的水平对齐方式。 (可能取值请见 Section 16.1.7.2, “对齐方式值”

  • verticalAlignment — 单元格的垂直对齐方式。 (可能取值请见 Section 16.1.7.2, “对齐方式值”

  • padding — 填充指定的边还可以通过以下属性来指定: paddingLeftpaddingRightpaddingToppaddingBottom

  • useBorderPadding

  • leading

  • multipliedLeading

  • indent 缩进

  • verticalAlignment 垂直对齐

  • extraParagraphSpace 额外段落空间

  • fixedHeight 固定高度

  • noWrap

  • minimumHeight 最小高度

  • followingIndent 底部缩进

  • rightIndent 右缩进

  • spaceCharRatio 字符间距比

  • runDirection 排列方向

  • arabicOptions 阿拉伯语选项

  • useAscender 递增

  • grayFill 灰色填充

  • rotation 旋转度

用法

<p:cell>...</p:cell>

16.1.7. 文档常量

本节例举了一些被属性在多个页面共享的常量。

16.1.7.1. 颜色值

Seam 尚未支持全部颜色的定义。目前只支持下面的颜色:whitegraylightgraydarkgrayblackredpinkyellowgreenmagentacyanblue

16.1.7.2. 对齐方式值

在用到对齐方式值的地方,Seam PDF支持下列水平对齐值: leftrightcenterjustifyjustifyall。 垂直对齐值为:topmiddlebottombaseline

16.1.8. iText配置

生成的文档无需其它的额外配置就可以使用。但是更加严格的应用程序则需要一些配置的要点。

默认的实现能够从一般的URL得到PDF文档,/seam-doc.seam。 许多浏览器(和用户)更倾向于见到包含实际PDF文档名诸如 /myDocument.pdf的链接。 这个功能需要一些配置。为了在浏览器中浏览PDF文件,所有的*.pdf资源都应该被映射到Seam Servlet过滤器以及DocumentStoreServlet:

<filter>
    <filter-name>Seam Servlet Filter</filter-name>
    <filter-class>org.jboss.seam.servlet.SeamServletFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>Seam Servlet Filter</filter-name>
    <url-pattern>*.pdf</url-pattern>
</filter-mapping>

<servlet>
    <servlet-name>Document Store Servlet</servlet-name>
    <servlet-class>org.jboss.seam.pdf.DocumentStoreServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Document Store Servlet</servlet-name>
    <url-pattern>*.pdf</url-pattern>
</servlet-mapping>

文档存储组件中的 useExtensions 选项保证了文档存储时的扩展名和生成时的一致。

<components xmlns="http://jboss.com/products/seam/components"
            xmlns:pdf="http://jboss.com/products/seam/pdf">
    <pdf:documentStore useExtensions="true" />
</components>

生成的文档保存在当前对话范围中直到对话结束。此时,文档的引用就无效了。 当对文档不存在时,你可以利用documentStore的 errorPage 属性指定要显示的默认视图。

<pdf:documentStore useExtensions="true" errorPage="/pdfMissing.seam" />

16.2. 图表

<p:barchart>

描述

显示柱状图。

属性

  • borderVisible — 控制图表边框是否要显示。

  • borderPaint — 边框可见时的边框颜色。

  • borderBackgroundPaint — 图表的默认背景色。

  • borderStroke

  • domainAxisLabel — 域坐标轴的文本标签。

  • domainAxisPaint — 域坐标轴标签的颜色。

  • domainGridlinesVisible— 是否在图表上显示域坐标上的网格。

  • domainGridlinePaint— 域坐标上网格可见时的颜色。

  • domainGridlineStroke — 域坐标轴上网格线可见时的画笔风格。

  • height — 图表的高度。

  • width — 图表的宽度。

  • is3D — 表示图表应该以3D而不是2D渲染的一个布尔值。

  • legend — 表示图表中是否应该显示图例的一个布尔值。

  • legendItemPaint— 图例中文本标签的默认颜色。

  • legendItemBackgoundPaint— 图例的背景色与图表的背景色不一致时的颜色。

  • orientation — 绘图方向,可以是 <code>vertical</code>(默认),也可以是 <code>horizontal</code>

  • plotBackgroundPaint— 绘图背景的颜色。

  • plotBackgroundAlpha— 绘图区域背景的alpha(透明度)级别。 它应该是0(完全透明)到1(完全不透明)之间的一个数字。

  • plotForegroundAlpha— 绘图区域的alpha(透明度)级别。 它应该是0(完全透明)到1(完全不透明)之间的一个数字。

  • plotOutlinePaint— 绘图区域边线可见时的颜色。

  • plotOutlineStroke — 绘图区域边线可见时的画笔风格。

  • rangeAxisLabel — 值坐标轴上的文本标签。

  • rangeAxisPaint — 值坐标轴上的标签颜色。

  • rangeGridlinesVisible— 是否显示值坐标轴上的网格。

  • rangeGridlinePaint— 值坐标轴上网格可见时的颜色。

  • rangeGridlineStroke — 值坐标轴上网格线可见时的画笔风格。

  • title — 图表标题文字。

  • titlePaint— 图表标题文字的颜色。

  • titleBackgroundPaint— 图表标题文字的背景色。

  • width — 图表的宽度。

用法

<p:barchart title="Bar Chart" legend="true"
            width="500" height="500">
    <p:series key="Last Year">
        <p:data columnKey="Joe" value="100" />
        <p:data columnKey="Bob" value="120" />
    </p:series>        <p:series key="This Year">
        <p:data columnKey="Joe" value="125" />
        <p:data columnKey="Bob" value="115" />
    </p:series>
</p:barchart>
                            

<p:linechart>

描述

显示一个折线图。

属性

  • borderVisible — 控制是否显示整个图表的边框。

  • borderPaint — 图表边框可见时的颜色。

  • borderBackgroundPaint — 图表的默认背景色

  • borderStroke

  • domainAxisLabel — 域坐标轴的文本标签。

  • domainAxisPaint — 域坐标轴标签的颜色。

  • domainGridlinesVisible— 控制是否在图表上显示域坐标的网格。

  • domainGridlinePaint— 域坐标上网格可见时的颜色。

  • domainGridlineStroke — 域坐标轴上网格线可见时的画笔风格。

  • height — 图表的高度。

  • width — 图表的宽度。

  • is3D — 表示应该以3D而不是2D图表渲染的一个布尔值。

  • legend — 表示是否应该在图表中包括图例的一个布尔值。

  • legendItemPaint— 图例中文本标签的默认颜色。

  • legendItemBackgoundPaint— 图例的背景色与图表的背景色不一致时的颜色。

  • orientation — 绘图区的方向,可以是<code>vertical</code>(默认), 也可以是 <code>horizontal</code>

  • plotBackgroundPaint— 绘图区域的背景色。

  • plotBackgroundAlpha— 绘图区域背景的alpha(透明度)级别。 它应该是0(完全透明)到1(完全不透明)之间的一个数字。

  • plotForegroundAlpha— 绘图区域的alpha(透明度)级别。 它应该是0(完全透明)到1(完全不透明)之间的一个数字。

  • plotOutlinePaint— 绘图区域边线可见时的颜色。

  • plotOutlineStroke — 绘图区域边线可见时的画笔风格。

  • rangeAxisLabel — 值坐标轴上的文本标签。

  • rangeAxisPaint — 值坐标轴上的标签颜色。

  • rangeGridlinesVisible— 控制是否在图表上显示值坐标轴的网格。

  • rangeGridlinePaint— 值坐标轴上网格可见时的颜色。

  • rangeGridlineStroke — 值坐标轴上网格线可见时的画笔风格。

  • title — 图表的标题文字。

  • titlePaint— 图表标题文字的颜色。

  • titleBackgroundPaint— 图表标题的背景色。

  • width — 图表的宽度。

用法

<p:linechart title="Line Chart"
            width="500" height="500">
    <p:series key="Prices">
        <p:data columnKey="2003" value="7.36" />
        <p:data columnKey="2004" value="11.50" />
        <p:data columnKey="2005" value="34.625" />
        <p:data columnKey="2006" value="76.30" />
        <p:data columnKey="2007" value="85.05" />
    </p:series>
</p:linechart>

<p:piechart>

描述

显示一个饼状图。

属性

  • title 标题

  • label 标签

  • legend 图例

  • is3D 是否3D

  • labelLinkMargin 标签链接边距

  • labelLinkPaint 标签链接颜色

  • labelLinkStroke 标签链接画笔风格

  • labelLinksVisible 标签链接是否可见

  • labelOutlinePaint 标签外边线颜色

  • labelOutlineStroke 标签外边线画笔风格

  • labelShadowPaint 标签阴影颜色

  • labelPaint 标签颜色

  • labelGap 标签间隔

  • labelBackgroundPaint 标签背景色

  • startAngle 起始角度

  • circular 圆形

  • direction 方向

  • sectionOutlinePaint 截面外边线颜色

  • sectionOutlineStroke 截面外边线画笔风格

  • sectionOutlinesVisible 截面外边线是否可见

  • baseSectionOutlinePaint 基本截面外边线颜色

  • baseSectionPaint 基本界面颜色

  • baseSectionOutlineStroke 基本界面外边线画笔风格

用法

<p:series>

描述

类数据可以分解成系列。series标签用于按照系列给一组数据分类,并且将样式应用到所有系列。

属性

  • key — 系列名。

  • seriesPaint — 系列中每个项的颜色。

  • seriesOutlinePaint — 系列中每个项的外边线颜色。

  • seriesOutlineStroke — 系列中每个项所使用的画笔风格

  • seriesVisible — 表示系列是否显示的一个布尔值。

  • seriesVisibleInLegend — 表示是否在图例中列出系列的一个布尔值。

用法

<p:series key="data1">
    <ui:repeat value="#{data.pieData1}" var="item">
        <p:data columnKey="#{item.name}" value="#{item.value}" />
    </ui:repeat>
</p:series>

<p:data>

描述

该数据标签描述要在图表中显示的每个数据点。

属性

  • key — 数据项的名称。

  • series — 系列名,当该标签没有内嵌在<code><p:series></code>中的时候。

  • value — 数字化的数据值。

  • explodedPercent — 对于饼状图,表示分离块的百分比大小。

  • sectionOutlinePaint — 对于柱状图,表示截面外边线的颜色。

  • sectionOutlineStroke — 对于柱状图,表示截面外边线的画笔风格。

  • sectionPaint — 对于柱状图,表示截面的颜色。

用法

<p:data key="foo" value="20" sectionPaint="#111111"
        explodedPercent=".2" />
<p:data key="bar" value="30" sectionPaint="#333333" />
<p:data key="baz" value="40" sectionPaint="#555555"
        sectionOutlineStroke="my-dot-style" />

<p:color>

描述

颜色组件声明一种颜色或者一组渐变的颜色,可以在绘制填充图形时使用。

属性

  • color — 颜色值,对于渐变的颜色,这表示起始的颜色值。 Section 16.1.7.1, “颜色值”

  • color2 — 对于渐变的颜色,这表示结束渐变的颜色值。

  • point — 渐变颜色的起始坐标

  • point2 — 渐变颜色的结束坐标

用法

<p:color id="foo" color="#0ff00f"/>
<p:color id="bar" color="#ff00ff" color2="#00ff00"
                  point="50 50" point2="300 300"/>  

<p:stroke>

描述

描述一种用来在图表中画线的画笔风格。

属性

  • width — 画笔的宽度。

  • cap — 线端类型,有效值为 buttroundsquare

  • join — 线交汇点的类型,有效值为 miter, roundbevel

  • miterLimit — 线边缘交汇,这个值限制交汇点的大小。

  • dash — 设置要用来画线的虚线模式的虚线值。整数代表交替画实线和虚线的长度。

  • dashPhase — 表示虚线模式中实线的偏移量。

用法

<p:stroke id="dot2" width="2" cap="round" join="bevel" dash="2 3" />
                            

16.3. 柱状图编码

...

<p:barcode>

描述

属性

  • type 类型

  • code 编码

  • xpos 横坐标

  • ypos 纵坐标

  • rotDegrees 旋转角度

  • barHeight 高度

  • textSize 文本大小

  • minBarWidth 最小柱状图宽度

  • barMultiplier

用法

16.4. 更详细的文档

关于iText的更多信息,请见: