在 Web 应用程序中动态生成国际化的 PDF(1)
- UID
- 1066743
|
在 Web 应用程序中动态生成国际化的 PDF(1)
Internet 使得公司能够在国际市场上做生意。因此使用支持 Web 的方式为客户提供国际化的内容变得非常迫切。可移植文档格式(PDF)是一种流行的在 Web 上交付内容的格式,使用任何主流的浏览器都可以方便地下载 PDF 文档,然后使用 Adobe Acrobat Reader 来查看它,或者使用 Adobe 插件在浏览器中查看。为国际化的受众生成 PDF 内容提出了一项挑战,特别是日语、中文和韩语这类语言的双字节特性更需要专门考虑。Unicode 字体通常是一种不错的解决方法,但是这类字体可能是特定于平台的。另一个重要问题是,不能仅仅因为希望在普通的 HTML 之外使用 PDF 格式而改变应用程序逻辑。
我们首先对字体和语言作一般的讨论,然后介绍一种在 Java Web 应用程序中使用开放源代码技术生成 PDF 文档的方法。
字体概述字体是称为图符的字符图像以及从字符码到图符的映射的集合。字符是在特定书写系统中表示字母和数字这类对象的符号。呈现特定的字符时,表示这个字符的形状称为图符。计算机系统中使用的常见字体是 Unicode TrueType 字体。但是,TrueType 字体自身不足以呈现双字节语言中的数据。TrueType 字体是呈现大量字符的最佳选择,但是它是特定于系统的:
- 在 Windows 操作系统中,Microsoft 提供了 Arial Unicode MS 字体,支持多数语言中的字符显示,其中包括双字节语言。该字体放在一个单独的文件中,默认情况下,字体不用安装到用户的系统上。为了使用这种字体,可能需要 Windows 的国际化支持特性。
- 类似地,在 IBM 的 AIX 的操作系统中,如果默认使用英语安装和配置系统,TrueType 字体也不会自动安装。您必须安装多个字体文件,比如用于日语、汉语和中文(简体和繁体)的 AIXwindows Unicode TrueType 字体-CJK。如果操作系统是 Linux,我们建议您仔细看看如何安装 TrueType 字体。
PDF 文档中的字体在支持国际化的标准 Web 应用程序中,小心处理本地化和编码问题非常重要。但是,对于国际化 PDF 文档,还需要考虑到与字体有关的问题。
在 PDF 中,嵌入字体使得文档能够移植,从而可以在安装了 Adobe Acrobat Reader 的任何系统上查看。如果没有嵌入字体,那么用户系统上 Reader 的本地化版本就会选择本机上的字体来显示这种语言。比方说,如果系统支持英语,则显示和打印的时候就用 Base 14 PostScript 字体来代替。这种字体涵盖了多数单字节语言,但是不包括任何双字节语言。另一种办法是提示用户从 Adobe 下载 Font Pack 来查看国际化文档,但是让客户下载额外的字体工具不是一种好办法。通过在 PDF 中使用嵌入字体,就无需担心远程用户或机器是否有显示文档所需要的字体了。因此,使用嵌入式 Unicode TrueType 字体来呈现国际化的 PDF 数据是一种很好的解决方案。
FOP 和 XSL-FO我们采用的在 Web 应用程序中生成 PDF 文档的方法是以格式化对象处理程序(Formatting Objects Processor,FOP)为基础。FOP 是由 XSL 格式化对象(XSL-FO)推动的世界上第一个打印格式化程序。它是一个开放源代码项目,是 Apache 下一项使用 Java 技术的 XML 项目。
说明了使用开放源代码 FOP 生成 PDF 文档的一般流程。输入数据需要采用 XML UTF-8 编码。转换程序接收 XML 数据,使用样式表生成 PDF。为了生成 PDF,FOP 格式化程序需要知道文档中使用的字体,特别是使用的所有图符的宽度。它需要这些细节来计算行的长度、连字符、对齐格式,等等。这些信息称为字体的规格,保存在每种字体中。如果能够得到字体规格信息,FOP 格式化程序就能成功地生成的 PDF。本文的后面部分将讨论如何生成字体规格文件。
图 1. 使用 Apache 开放源代码 FOP 转换 PDF此外,样式表中还使用 font-family 属性从 XSL-FO 生成 PDF。根据 W3C 定义,可以使用字体族名(font family name)或者一般族名(generic family name)。font-family 的值可以是 Helvetica、Times、Courier 和 Symbol。而一般族名有 serif、sansserif、cursive、fantasy 和 monospace。在 XSL-FO 中,font-family 属性是按优先顺序排列的字体族名列表,可以试着按照顺序寻找符合选择条件的可用字体(如 所示)。但是,当前的 FOP 不支持 font-family 列表,如果存在这样的列表,也只会使用列表中的第一个字体。比如,如果指定 font-family="A,B,C"(如 所示),而 A 不存在,则 B 和 C 都将被忽略不用。有关的更多信息,请参阅 W3C 站点。
清单 1. FOP 不支持在 font-family 中使用字体列表的典型 XSL-FO 语法1
2
3
4
5
| <fo:block text-align="center"
font-family="A,B,C"
font-size="16pt">
<xsl:text>Welcome! </xsl:text>
</fo:block>
|
与 iText 的比较我们前面说过,FOP 是使用 XSL-FO 和 XML 进行 PDF 转换的开放源代码 Java 程序。另一种开放源代码的 PDF 转换程序称为 iText(请参阅 ),它采用面向对象的方法,并提供 Java 对象来呈现 PDF 文档。这两种方法各有优缺点,但我们认为 XSL-FO 模型在视图层上更适合模型-视图-控制器(MVC)架构。它还得到了 Struts for Transforming XML and XSL(stxx)扩展的支持,后者基于 Struts 应用程序框架。此外,这种方法更适合生成 PDF 报告,报告的模板可使用 XSL 指定,后者得到了 W3C 的支持。 |
|
|
|
|
|