关于html转pdf所遇到的一系列问题,求解答

vivian_ms 2012-04-21 11:30:01
首先直接将xhtml文件转换可以正常使用,也支持中文

package com.ksoft.apps.client.action;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import com.lowagie.text.pdf.BaseFont;

/**
* TODO class description *
*
* @author chaochen */
public class ITextRendererTest {
public static void main(String[] args) throws Exception {
String inputFile = "conf/template/test.xhtml";
String url = new File(inputFile).toURI().toURL().toString();
String outputFile = "firstdoc.pdf";
OutputStream os = new FileOutputStream(outputFile);
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(url);

// 解决中文支持问题
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont("C:/Windows/Fonts/arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

// 解决图片的相对路径问题, 图片路径必须以file开头,指定对应Tomcat下项目rootpath
renderer.getSharedContext().setBaseURL("file:/E:/apache-tomcat-6.0.16/apache-tomcat-6.0.16/webapps/apps-client/");
renderer.layout();
renderer.createPDF(os);

os.close();
}
}



而后,开始琢磨直接将html代码转成pdf,参考网上找的一篇帖子iText和flying saucer结合生成pdf的技术 http://blog.csdn.net/shanliangliuxing/article/details/6833471
然后发现我自己的ITextRenderer对象并未找到文章中所提到的setDocumentFromString()方法,
而只发现setDocument(File file),setDocument(String uri),setDocument(Document doc2, String url),
setDocument(Document doc2, String url, NamespaceHandler nsh)这几个方法。难道是我得jar包版本错了么?
我得项目里依赖德jar包:iText-2.0.8.jar、iTextAsian.jar、core-renderer.jar,求解答。


然后我想,既然没找到setDocumentFromString()方法,那我就用setDocument(Document doc2, String url)方法试试吧。



package com.ksoft.apps.client.action;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;



import com.lowagie.text.pdf.BaseFont;






public class TestCase {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stu
String encoding = "UTF-8";
String outputFile = "firstdoc.pdf";

InputStream intream = null;
Document doc = null;
Document doc2 = null;
try {
OutputStream out = new FileOutputStream(outputFile);


StringBuffer html = new StringBuffer();
// DOCTYPE 必需写否则类似于 这样的字符解析会出现错误
html.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
html.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">").
append("<head>")
.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />")
.append("<style type=\"text/css\" mce_bogus=\"1\">body {font-family: SimSun;}</style>")
.append("</head>")
.append("<body style='font-family:'Arial Unicode MS''>");
html.append("<div>支持中文!</div>");
html.append("</body></html>");


DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
ITextRenderer renderer = new ITextRenderer();
ITextFontResolver fontResolver = renderer.getFontResolver();

intream = new ByteArrayInputStream(html.toString().getBytes(encoding));
doc = (Document) builder.parse(intream); transformer.setOutputProperty("encoding", encoding);
transformer.transform(new DOMSource(doc), new StreamResult(bos));
intream = new ByteArrayInputStream(bos.toString().getBytes());
doc2 = (Document) builder.parse(intream);
// 解决中文支持问题
fontResolver.addFont("C:/Windows/Fonts/ARIALUNI.TTF",
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);


// 解决图片的相对路径问题
renderer.getSharedContext().setBaseURL("file:/E:/apache-tomcat-6.0.16/apache-tomcat-6.0.16/" +
"webapps/apps-client/");


renderer.setDocument(doc2, null);
// renderer.getSharedContext().setBaseURL("file:/c:/");
renderer.layout();

renderer.createPDF(out, true);

out.flush();
out.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}



调试的时候,发现在将html代码转成Document时候特别慢,就是红色字体的那行代码,请教有优化办法么?doc = (Document) builder.parse(intream);
另外发现这样做又不支持中文了,我在重新查证那篇博文,发现引用了arialuni.ttf字体,必须在html代码里的body标签增加个style
<body style="font-family:'Arial Unicode MS'">
但是这样的话就没办法生成Document对象了,顿时卡壳,求思路,求解惑
...全文
972 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
TombStorn 2012-11-28
  • 打赏
  • 举报
回复
// 解决中文支持问题 fontResolver.addFont("C:/Windows/Fonts/ARIALUNI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); 这行改为 fontResolver.addFont("C:/Windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); 之所以会类似于死掉,是因为html中的字体与提供的字体匹配不上导致的。 html中使用的中文字体的字体文件,不仅要在css中标明,还要在生成pdf时以这样的方式指定。 jar有冲突吧,保证项目中的jar为iText-2.0.8.jar;core-renderer.jar;iTextAsian.jar 以上关于iText的jar包不要有其他版本的jar。
MRLIYUANWEN 2012-09-04
  • 打赏
  • 举报
回复
我也不会了
MRLIYUANWEN 2012-09-04
  • 打赏
  • 举报
回复
好像到这句话就死了doc = (Document) builder.parse(intream);

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧