xml与xsl-fo生成PDF
来源:互联网 发布:南华大学网络教学平台 编辑:程序博客网 时间:2024/04/30 11:31
保存数据窗口到PDF文件,现在有两种技术,一种是利用distiller和ghostscript(详见http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=205744),另一种是通过FOP(Apache XML Formatting Objects processor)和XSL-FO(XSL Formatting Objects ) 。第二种需要JVM和FOP支持,可以跨平台使用。
下面是我试用第二种方法的过程和问题。(试用环境:WINXP HOME EDITION,Powerbuilder 9.03)
1、首先,设置导出PDF的方法为XSLFOP!,然后在dw编辑预览面板下save as row为PDF文件。
问题:打开生成的pdf文档,其他正常,但中文显示错误,显示为####
2、因为dw可以saveas为XSL-FO文件,所以估计导出PDF的内部方法应该是先生成XSL-FO文件,然后利用fop.jar再生成PDF。于是,将该数据窗口导出为1.fo文件,准备用FOP命令手工生成PDF,从而寻求解决方法。
3、运行cmd,进入到C:/Program Files/Sybase/Shared/PowerBuilder/fop-0.20.4目录下,运行fop 1.fo 1.pdf 生成PDF成功,但提示:
[ERROR] unknown font Cyberbit,normal,normal so defaulted font to any
打开1.fo ,找到font-family="Cyberbit" ,可见,pb9生成的fo文件,将字体都设置为了Cyberbit,问题应该在这里。
4、查阅相关资料,原来需要给FOP注册Cyberbit 字体,步骤如下:
1)本机器上未找到cyberbit.ttf ,于是在http://seba.studentenweb.org/thesis/down/cyberbit.ttf先下载了一个(其实可以将fo文件中cyberbit修改为其他字体并注册,方法类似)。
2)命令行状态下 执行:java -cpbuild/fop.jar;lib/avalon-framework-cvs-20020315.jar;org.apache.fop.fonts.apps.TTFReader -ttcname "Cyberbit"C:/WINDOWS/Fonts/cyberbit.ttf cyberbit.xml
生成了cyberbit.xml 文件
3)修改配置文件conf/userconfig.xml,在<fonts></fonts>之间添加
<font metrics-file="cyberbit.xml" kerning="yes" embed-file="C:/WINDOWS/Fonts/cyberbit.ttf">
<font-triplet name="Cyberbit" style="normal" weight="normal"/>
<font-triplet name="Cyberbit" style="normal" weight="bold"/>
<font-triplet name="Cyberbit" style="italic" weight="normal"/>
<font-triplet name="Cyberbit" style="italic" weight="bold"/>
</font>
4)修改FOP.BAT批处理文件,增加-c conf/userconfig.xml参数。
修改后的内容为:java -cpbuild/fop.jar;lib/batik.jar;lib/xalan-2.3.1.jar;lib/xercesImpl-2.1.0.jar;lib/xml-apis.jar;lib/avalon-framework-cvs-20020315.jar;lib/logkit-1.0.jar;lib/jimi-1.0.jarorg.apache.fop.apps.Fop -c conf/userconfig.xml %1 %2 %3 %4 %5 %6 %7 %8
5、重新执行fop 1.fo 1.pdf ,结果提示错误:
[ERROR] Could not load user configuration file conf/userconfig.xml - error: Invalid byte 1 of 1-byte UTF-8 sequence.
于是将userconfig.xml存为UTF-8 格式再执行,新错误提示:
[ERROR] Failed to read font metrics file/C:/Program Files/Sybase/Shared/PowerBuilder/fop-0.20.4/cyberbit.xml :no protocol: /C:/ProgramFiles/Sybase/Shared/PowerBuilder/fop-0.20.4/cyberbit.xml
此错误比较难找到原因,经多次寻找后,发现原因来自于Program Files中间的空格。将整个文件夹fop-0.20.4复制到C:/下,再执行,成功通过!打开生成的pdf文件,中文显示正常。
6、此时,在pb9中另存为PDF却出现错误:
Save Rows As failed
java.lang.NullPointerException
于是将文件C:/Program Files/Sybase/Shared/PowerBuilder/fop-0.20.4/conf/userconfig.xml 重新保存为ansi格式,再次使用,恢复正常(中文还是没的显示)。
结论:对于中文等多字节语言,PB9中利用FOP生成PDF,使用SaveAs方法直接生成PDF会出现中文无法显示的情况。如果有此需要,可以先生成XSL-FO文件,配置好字体,然后使用FOP命令行方式生成PDF文件(也可以用java写出基于fop的xsl-fo=>xml的程序,然后pb中用createjavavm方法创建调用,更灵活,相比复杂一些)。
- xml与xsl-fo生成PDF
- xsl-fo模板,pl/sql生成的xml数据源,R12输出PDF
- XML,XSL,XSLT,XPath 以及 XSL-FO
- 使用FOP将xsl-fo转pdf
- XSL- FO
- XSL-FO
- XSL-FO
- Java与XML(六)xml的转换之pdf (fo 2 pdf)
- Java与XML(五)xml的转换之pdf (xml+xsl 2 pdf)
- XSL-FO 简介
- XSL-FO 基础知识(三)
- XSL-FO学习笔记
- Definitive XSL-FO
- Xsl Fo [ILLUSTRATED]
- XSL-FO表格(table)
- xhtml转xsl-fo
- XML与XSL
- Xml与xsl连接
- 入门 HelloWorld!
- 理想的编程语言
- 如何更改所有文件夹的图标排列方式和查看方式
- Delphi的"Invalid pointer operation"异常的解决办法
- LCS算法(动态规划实现最长公共子序列)c语言实现
- xml与xsl-fo生成PDF
- 网站资源很多,可是一般不让人用
- 随机数函数 rand () srand() (笔记)
- java policy 策略
- Quartz在Spring中动态设置cronExpression研究(spring设置动态定时任务)【转】
- 提高squid缓存的命中率
- 查询初始化参数的方法
- Spring结合Quartz实现多任务定时调用
- INF文件详解