在开发过程中,发现生成的PDF文件中,所有中文都不能显示,以”#“表示。
在ofbiz中,生成pdf的过程是:
1、访问xxx.pdf的url.
2、controller.xml中对*.pdf配置如下:
<handler name="screenfop" type="view" class="org.ofbiz.widget.screen.ScreenFopViewHandler"/>
...
<view-map name="PicklistReport.pdf" type="screenfop" page="component://warehouse/widget/warehouse/screens/shipping/ShippingScreens.xml#PicklistReportPDF" content-type="application/pdf" encoding="none"/>
3、在ScreenFopViewHandler.java中,先把PicklistReport.fo.ftl渲染成xml
// render and obtain the XSL-FO
Writer writer = new StringWriter();
FopFactory fopFactory = ApacheFopFactory.instance();
ScreenRenderer screens = new ScreenRenderer(writer, null, htmlScreenRenderer);
screens.populateContextForRequest(request, response, servletContext);
// this is the object used to render forms from their definitions
screens.getContext().put("formStringRenderer", new FoFormRenderer(request, response));
screens.render(page);
然后由apache的FOP(Formatting Objects Processor)对xml渲染,生成pdf文件,并放回到response中输出:
ByteArrayOutputStream out = new ByteArrayOutputStream();
TransformerFactory transFactory = TransformerFactory.newInstance();
try {
Fop fop = fopFactory.newFop(contentType, out);
Transformer transformer = transFactory.newTransformer();
// set the input source (XSL-FO) and generate the output stream of contentType
Reader reader = new StringReader(writer.toString());
Source src = new StreamSource(reader);
// Get handler that is used in the generation process
Result res = new SAXResult(fop.getDefaultHandler());
// Transform the FOP XML source
transformer.transform(src, res);
// We don't want to cache the images that get loaded by the FOP engine
fopFactory.getImageFactory().clearCaches();
// set the content type and length
response.setContentType(contentType);
response.setContentLength(out.size());
// write to the browser
out.writeTo(response.getOutputStream());
response.getOutputStream().flush();
又一次看到中文被鄙视了,Apache FOP中不支持任务中文字体,所以要做下边三步,才能使pdf中的中文正常显示:
1、用FOP生成黑体字体配置文件simhei.xml,并把windows下的黑体文件simhei.ttf放在相同的目录下。在openb2c 中为:
%OPENB2C_HOME%\hot-deploy\opentaps-common\lib\DejaVu\
生成simhei.xml的命令为:
java -classpath framework\webapp\lib\fop-0.93.jar;framework\base\lib\avalon-framework-4.2.0.jar;framework\webapp\lib\batik-all-1.6.jar;framework\base\lib\commons\commons-logging.jar;framework\base\lib\commons\commons-io-1.4.jar;framework\base\lib\serializer.jar;framework\base\lib\xalan.jar;framework\base\lib\xml-apis-2.8.1.jar;framework\webapp\lib\xmlgraphics-commons-1.1.jar org.apache.fop.fonts.apps.TTFReader -ttcname "SimHei" C:\WINDOWS\Fonts\simhei.ttf D:\simhei.xml
2、修改ofbiz中fop的配置文件fop.xconf
添加字体:simhei
<font metrics-url="simhei.xml" kerning="yes" embed-url="simhei.ttf">
<font-triplet name="simhei" style="normal" weight="normal"/>
</font>
3、修改*.fo.ftl模板文件,把font-family改为simhei
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"
font-family="simhei">
重启看到pdf能正常显示中文了!
为我们公司做下广告易合信息技术yiihee.com