保存数据窗口到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 -cp build/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 -cp build/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.jar org.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:/Program Files/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方法创建调用,更灵活,相比复杂一些)。

以上结论来自本人特定环境下的试用结果,仅作为在类似问题下的参考。

保存数据窗口到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 ) 。第二 <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> http://hi.csdn.net/attachment/201012/31/0_1293756047X766.gif 已经有新版的示例程序,http://download.csdn.net/source/2969443 运行效果http://hi.csdn.net/attachment/201101/8/0_1294452269sSha.gif
除了前面提到的 PDF Box和iText外,还有一些其他的 PDF 开源库: 1. Apache FOP :用于将 XML 文档转换为 PDF 和其他输出格式的 XSL -FO处理引擎。 2. j PDF Writer:用于 Java 平台的 PDF 库,可以创建 PDF 文档、添加文本和图像、设置页眉和页脚等。 3. PDF jet:一个简单易用的 Java PDF 库,支持文本、图像、表格等。 4. PDF sharp:一个.NET库,提供了创建和修改 PDF 文档的功能。 5. Py PDF 2:一个用于Python的 PDF 库,可以合并、拆分、旋转和加密 PDF 文档等。 6. PDF .js:一个 Java Script库,可以在Web浏览器 显示 PDF 文档。 这些 PDF 开源库各有特点,可以根据自己的需求选择使用。
CSDN-Ada助手: 非常棒的博客!继续努力,写更多优秀的技术博客吧!我们期待着你的下一篇技术文章。建议你可以写一篇关于如何使用POI读取DOCX中的表格数据的技术博文,这是很多人都遇到的问题。希望你可以分享你的经验和技巧,让更多人受益。期待你的精彩文章! 为了方便博主创作,提高生产力,CSDN上线了AI写作助手功能,就在创作编辑器右侧哦~(https://mp.csdn.net/edit?utm_source=blog_comment_recall )诚邀您来加入测评,到此(https://activity.csdn.net/creatActivity?id=10450&utm_source=blog_comment_recall)发布测评文章即可获得「话题勋章」,同时还有机会拿定制奖牌。 POI读取DOCX中的标题编号 CSDN-Ada助手: Java 技能树或许可以帮到你:https://edu.csdn.net/skill/java?utm_source=AI_act_java PB程序间传递字符串变量 小李00: srctype,offlinetype是什么 Eclipse Rcp中替换Eclipse默认全局快捷键 caijunlin1994: 我又试了一下ctrl+s如果没有使用saveAction = ActionFactory.SAVE.create(window);register(saveAction);创建和注册的话和已覆盖掉,但是现在我想覆盖掉ctrl+n我的rcp程序启动直接按ctrl+n的话会有new空的对话框。我现在覆盖掉这个对话框 Eclipse Rcp中替换Eclipse默认全局快捷键 caijunlin1994: 没用啊楼主,还是系统自带的快捷键,我换了ctrl+n和+s都不行