您的位置:首页 > 编程语言 > Java开发

用 Java 把 html 转成 pdf

2011-03-30 17:24 381 查看
 

1。下载iText-2[1].0.8.jar,core-renderer.jar两个包

2。代码

代码

1
package test;
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;
public class WordToPdf {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
String inputFile = "D://test.html";
String url = new File(inputFile).toURI().toURL().toString();
String outputFile = "D://test.pdf";
System.out.println(url);
OutputStream os = new FileOutputStream(outputFile);
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(url);
// 解决中文支持问题
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont("C:/Windows/Fonts/SIMSUN.TTC",
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
// 解决图片的相对路径问题
// renderer.getSharedContext().setBaseURL("file:/D:/z/temp/");
renderer.layout();
renderer.createPDF(os);
os.close();
}
}


 

代码
2

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;

public class TestFlyingSauser
{

public static void main( String[] args ) throws Exception
{
//        demo_1();
demo_2();
}

// 不支持中文
public static void demo_1() throws Exception
{
String inputFile = "D:/Test/flying.html";
String url = new File( inputFile ).toURI().toURL().toString();
String outputFile = "D:/Test/flying.pdf";
OutputStream os = new FileOutputStream( outputFile );
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument( url );
renderer.layout();
renderer.createPDF( os );
os.close();
}

// 支持中文
public static void demo_2() throws Exception {
String outputFile = "G:/demo_3.pdf";
OutputStream os = new FileOutputStream(outputFile);
ITextRenderer renderer = new ITextRenderer();
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont("C:/Windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
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("<mce:style type=/"text/css/" mce_bogus=/"1/"><!--
body {font-family: SimSun;}
--></mce:style><style type=/"text/css/" mce_bogus=/"1/" mce_bogus="1">body {font-family: SimSun;}</style>")
.append("</head>")
.append("<body>");
html.append("<div>支持中文!</div>");
html.append("</body></html>");
renderer.setDocumentFromString(html.toString());
// 解决图片的相对路径问题
// renderer.getSharedContext().setBaseURL("file:/F:/teste/html/");
renderer.layout();
renderer.createPDF(os);
os.close();
}}


 

 

代码
3

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
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;

public class HTML2PDF {

/**
* 调用方式 htmlToPDF(response.getOutputStream(), htmlstr, "C:/WINDOWS/Fonts/simfang.ttf", "FangSong_GB2312", "GB2312", "http://xxxx/dtd/xhtml1-transitional.dtd");
*
* 相关图片必须使用绝对路径才能显示 如果要下载生成的文件,在此方法上方加上:
* response.setHeader("Content-disposition",
* "attachment;filename=英文文件名.pdf");
*
* @param 参数
* @param OutputStream out 输出流
* @param String htmlcode html代码。
*
* @param String fontName 字体名称 如:FangSong_GB2312
* @param String fontpath windows 字体路径 如:C:/WINDOWS/Fonts/simfang.ttf
* @param String encoding 编码 如:GB2312。
* @param String htmlDTDURL  如:http://xxxx/xhtml1-transitional.dtd
* version 2009.03.05
*/
public void htmlToPDF(OutputStream out, String htmlcode, String fontpath,
String
fontName, String encoding, String htmlDTDURL) throws Exception {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
Transformer transformer = TransformerFactory.newInstance()
.newTransformer();
ITextRenderer renderer = new ITextRenderer();
ITextFontResolver resolver = renderer.getFontResolver();
InputStream intream = null;
Document doc = null;
Document doc2 = null;
try {
htmlcode = this.filterHeader(htmlcode,

encoding, fontName, htmlDTDURL);

intream = new ByteArrayInputStream(htmlcode.getBytes(encoding));
doc = (Document) builder.parse(intream);
transformer.setOutputProperty("encoding", encoding);
new DOMSource(doc);
transformer.transform(new DOMSource(doc), new StreamResult(bos));
intream = new ByteArrayInputStream(bos.toString().getBytes());
doc2 = (Document) builder.parse(intream);

resolver.addFont(fontpath, BaseFont.IDENTITY_H,
BaseFont.NOT_EMBEDDED);

renderer.setDocument(doc2, null);
renderer.layout();

renderer.createPDF(out, true);

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

throw new Exception(ex.getMessage());
}
}
/**
*文件头
*/
private String filterHeader(String htmlcode, String encoding,String fontName,String htmlDTDURL) {
htmlcode="<table style="/" mce_style="/""font-family:FangSong_GB2312/" width=/"100%/" height=/"100%/" border=/"0/"><tr><td>"+htmlcode+"</td></tr></table>";
htmlcode="<!DOCTYPE html PUBLIC /"-//W3C//DTD XHTML 1.0 Transitional//EN/"  /""+htmlDTDURL+"/" >/n"+htmlcode;
htmlcode = "<?xml version=/"1.0/" encoding=/"" + encoding + "/" ?>/n"
+ htmlcode;
return htmlcode;
}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息