Board logo

标题: 在 Web 应用程序中动态生成国际化的 PDF(2)示例 Web 应用程序 [打印本页]

作者: look_w    时间: 2018-7-15 13:49     标题: 在 Web 应用程序中动态生成国际化的 PDF(2)示例 Web 应用程序

我们将使用一个示例 Java Web 应用程序示范建立 Unicode 字体、生成字体规格文件和使用 stxx 生成 PDF 文档的步骤。
该示例应用程序将一些应用程序数据转换成 PDF。我们假设您对 XML、XSL-FO、Struts 和 J2EE 有一些了解。示例应用程序有以下两个版本:
本质上,这是同一个应用程序,只不过在 XML 配置文件中的一个标志控制下以两种模式运行。这种方法需要以 Unicode 编码的 XML 格式提供数据。很多 Web 应用程序都在某一点生成 XML,这样就可以将 XML 和适当的 XSL 交给 stxx FOP 来完成转换。但是,如果 XML 不是在应用程序中生成的,那么需要首先将应用程序数据转换成 XML。交给 stxx 的 XML 数据添加了地区信息。可以利用地区挑选出 PDF 文档中显示的适当静态信息和动态数据。比如,在生成 PDF 输出的订单状态应用程序中,可以使用适当的地区信息从资源绑定中挑选静态标签。
为了运行示例应用程序,我们使用了 Tomcat 4.1.30 和 stxx 1.3。Tomcat 是一种开放源代码的 servlet 容器。当然您也可以使用其他的 servlet 容器,无论是开放源代码产品,还是 IBM WebSphere Application Server 这样的商业产品。stxx 是 Struts 框架的扩展,不需要改变 Struts 的运行时行为就可以支持 XML 和 XSL。stxx 当前的版本是 1.3,它使用 FOP 0.20.4。
这个例子是一个简单的基于 Struts 的应用程序。我们使用 IBM WebSphere Studio 作为开发环境。(WebSphere Studio 使用 Eclipse 工具框架,可以与 Tomcat 服务器很好地集成在一起,并提供了 Java 和 XML 开发特性)。呈现为 PDF 格式的数据来自包含多语言内容(比如 )的 XML 文件。其中包含翻译成不同双字节语言的文本“Product Service”。初始化应用程序的时候,嵌入字体被加载到 Struts 系统中。使用 stxx 动作将 XML 文档转化成 stxx XML 格式,其中包括 Web 应用程序的地区信息。我们使用 Apache Jakarta Digester 模式将 XML 配置文件加载到 Struts 插件中。stxx FOP 转换器使用 XSL-FO 样式表进行 PDF 转换。样式表中明确使用了 Arial Unicode MS,它属于 Helvetica 字体家族,最终,字体信息嵌入在了 PDF 中。
解压 sample.war 文件后可以看到所有的配置文件和源代码。
图 2. XML 示例数据部署示例应用程序的步骤本文中的例子使用的是没有安装 Unicode 字体的 English 语言机器。如果您使用的是不同的机器(比如日语机器),步骤仍然一样。
可以在任何兼容 J2EE 的 servlet 容器中部署这个应用程序。下面是在 Tomcat 上安装该应用程序的步骤。(其他详细信息,请参阅 。)
可以看到,双字节样本数据被显示成“#####”这样的符号。这意味着系统中的默认字体设置不能显示双字节语言的字符。现在已经完成了应用程序第一个版本的运行。
为了保证正确地呈现双字节数据,请按照下面的步骤将使用的 Unicode 字体嵌入到 PDF 中:
第 1 步:安装 Unicode TrueType 字体这个例子是从 Windows 系统上开发的。要安装 Arial Unicode MS 字体,还请参阅 Microsoft 的国际化支持站点(请参阅 )。如果使用其他操作系统,请参阅安装字体的标准说明。
第 2 步:生成 Unicode TrueType 字体规格文件TrueType 字体文件有两种类型:TrueType Font 文件(扩展名为 .ttf)和 TrueType Collection 文件(扩展名为 .ttc)。FOP 允许嵌入这两种文件。
在安装 Unicode 字体之后,看看字体目录中是否能找到字体文件(比如 C:\windows\fonts\ARIALUNI.TTF)。然后使用  中的 FOP 命令生成字体规格文件。一定要确保类路径的设置正确。还要保存生成的 XML 文件,以便 Web 应用程序运行时使用该文件。
清单 2. 使用 FOP 生成字体规格文件
1
$ java org.apache.fop.fonts.apps.TTFReader C:\windows\fonts\Arialuni.ttf arialuni.xml




第 3 步:用 FOP 注册嵌入字体初始化应用程序时用 FOP 注册嵌入字体是一个好主意。在 Struts 中,可以使用插件加载这个字体规格文件。可以创建一个 XML 文件规定字体规格文件的位置,我们选择了  所示的格式。
修改 userconfig.xml 选择 。
清单 3. 使用 userconfig.xml 注册嵌入式 Unicode TrueType 字体
1
2
3
4
5
6
7
<font metrics-file="C:/temp/font/arialuni/arialuni.xml"
          embed-file="C:/windows/Fonts/arialuni.ttf" kerning="yes">
      <font-triplet name="arialuni" style="normal" weight="normal"/>
      <font-triplet name="arialuni" style="normal" weight="bold"/>
      <font-triplet name="arialuni" style="italic" weight="normal"/>
      <font-triplet name="arialuni" style="italic" weight="bold"/>
</font>




应用程序配置是在单独的配置文件(pdf-userconfig.xml)中指定的,该文件由 Struts 插件选择。它位于示例应用程序的“WEB-INF”文件夹中。文件内容如  所示。默认情况下,enabled 属性被设为 false。
清单 4. pdf-userconfig.xml 应用程序配置
1
2
3
4
5
6
7
8
<configuration>
   <pdf-fonts>
       <userconfig name="pdf-unicode"
                   path="font\userconfig.xml"
                   enabled="false"
                   comment="for Unicode Font"/>
   </pdf-fonts>
</configuration>




要加载字体规格文件,可以使用 Struts 插件和 Java 代码加载 userconfig.xml,如  所示。
清单 5. Struts 插件中用于支持嵌入字体的 Java 代码
1
2
3
4
5
6
7
8
9
...
try {
    File userConfigFile = new File("userconfig.xml");
    org.apache.fop.apps.Options options
            = new org.apache.fop.apps.Options(userConfigFile);
} catch (FOPException fe) {
    fe.printStackTrace();
}
...




第 4 步:在 servlet 引擎中使用 FOP 转换按照 Struts 架构,可以创建一个动作(action),通过三步生成 PDF 文档:
代码如  所示。
清单 6. 呈现 PDF 的 Struts 动作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class SampleXslFoAction extends Action {
  
    private String xmlUsed = "/xml/sample_transform.xml"; //default
    private String successFwd = "success"; //default
     
    public org.apache.struts.action.ActionForward execute(
                    ActionMapping mapping,
                    ActionForm form,
                    HttpServletRequest request,
                    HttpServletResponse response)
            throws IOException, ServletException {
                 
        //**************************
        // make user selections
        //**************************
        decideSuccessFwd(request);
        decideXmlUsed(request);
         
        //*******************
        // Construct XML
        //*******************
        Document doc = null;
        try {
            String fileName = request.getRealPath(xmlUsed);
            FileInputStream fis = new FileInputStream(fileName);
            doc = new SAXBuilder().build(fis);
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
        saveDocument(request, doc);
        //****************************
        // process PDF doc view option
        //****************************
        if(request.getParameter("viewformat").equalsIgnoreCase("download")){
            response.setContentType("application/pdf");
            response.setHeader("Content-Disposition",
            "attachment;filename=pdfdoc.pdf");
        }
        //**************************
        //Go forward rendering it
        //**************************
        return mapping.findForward(successFwd);
    }
    ...
}




所有的配置和代码都在这个例子中实现了。按照上述步骤生成字体规格文件并修改 userconfig.xml 文件之后,必须将 pdf-userconfig.xml 文件中的 enabled 属性改为 true。然后重新启动 Tomcat 服务器,再次打开 homepage.html。如果单击 View PDF,可以看到这一次正确显示了所有内容,如图 6 所示。
图 6. FOP 转换的多语言内容的 PDF 视图可以看到,这里正确地呈现了不同语言的示例文本“Product Service”。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0