Java 实现 Html 转 pdf

本博客主要演示使用 itextpdf-5.4.3.jar 和 xmlworker-5.4.3.jar 把 Html 转换成 pdf 文件。但是效果还不如直接用内容生成的 pdf 。戳我拿 jar 包
本 Demo 涉及了 html、css、js,不过 js 并不起作用 ,所以涉及 js 赋值的 html 文件还是别转换,直接去生成吧。可参阅上篇博客 Java 生成 pdf ;另外,css 文件似乎无法很好的转换。
先看一下网页效果和 pdf 文件效果:
网页效果pdf 文件效果

  1. 第一个表的软件名称和公司名称是空的,网页是通过 js 文件赋值,所以转换时无效。
  2. 表格整体没有居中,网页是通过 margin 实现的,但 pdf 没有显示效果。
  3. css 设置的 line-height,网页是正常显示效果的。在 pdf 文件中,表格前两行可能因为内容是单行的,没有显示行高效果。在公司简介一栏,内容有两行是,显示了行高效果,但是,这也太丑了吧。

虽然通过直接转换可以更简单地生成 pdf 文件,但是效果有待商榷。我还是推荐直接把内容直接生成 pdf 文件,虽然代码多了点,排版效果却好了很多

代码如下:
html 代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"></meta>
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="html2pdf.css"></link>
<script type="text/javascript" src="html2pdf.js"></script>
</head>
<body>
	<h3>PDF测试</h3>
	<table>
		<tr>
			<td class="tab_attr">软件名称</td><td class="tab_content" id="itemName">&nbsp;</td>
			<td class="tab_attr">公司名称</td><td class="tab_content" id="unitName">&nbsp;</td>
		</tr>
		<tr>
			<td class="tab_attr">公司地址</td><td class="tab_content">北京海淀</td>
			<td class="tab_attr">联系方式</td><td class="tab_content">123456789</td>
		</tr>
		<tr>
			<td class="tab_attr">公司简介</td>
			<td colspan="3">闹大目的是发手动阀哦士大夫爱的发声难道额我发 奥斯丁你发送的你发送的发阿奎那的方法, 啊的反思的。</td>
		</tr>
	</table>
	<br></br>
	<table>
		<tr>
			<td class="tab_attr">软件名称</td><td class="tab_content">某某管理系统</td>
			<td class="tab_attr">公司名称</td><td class="tab_content">北京海淀科技有限公司</td>
		</tr>
		<tr>
			<td class="tab_attr">公司地址</td><td class="tab_content">北京海淀</td>
			<td class="tab_attr">联系方式</td><td class="tab_content">123456789</td>
		</tr>
		<tr>
			<td class="tab_attr">公司简介</td>
			<td colspan="3">闹大目的是发手动阀哦士大夫爱的发声难道额我发 奥斯丁你发送的你发送的发阿奎那的方法, 啊的反思的。</td>
		</tr>
	</table>
	<br></br>
	<table>
		<tr>
			<td class="tab_attr">软件名称</td><td class="tab_content">某某管理系统</td>
			<td class="tab_attr">公司名称</td><td class="tab_content">北京海淀科技有限公司</td>
		</tr>
		<tr>
			<td class="tab_attr">公司地址</td><td class="tab_content">北京海淀</td>
			<td class="tab_attr">联系方式</td><td class="tab_content">123456789</td>
		</tr>
		<tr>
			<td class="tab_attr">公司简介</td>
			<td colspan="3">闹大目的是发手动阀哦士大夫爱的发声难道额我发 奥斯丁你发送的你发送的发阿奎那的方法, 啊的反思的。</td>
		</tr>
	</table>
	
</body>
</html>

ps:标签务必加上结束符,例如上面的 </meta> </link> </br>
— – jsp 文件页跟 html 文件一样可以转换。
css 代码:

h3{
	text-align: center;
}

table, table tr td { border:1px solid #999; }
table { border-collapse: collapse; padding:2px; width:1200px; margin-left: 70px;}
tr { line-height:50px;}

.tab_attr{
	width: 20%;
	text-align: right;
}
.tab_content{
	width: 30%;
}

js 代码

window.function(){
	document.getElementById("itemName").innerHTML="js软件名称";
	document.getElementById("unitName").innerHTML="js公司名称";
}

Java 代码

package html2PDF;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;

import com.itextpdf.text.Document;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;

public class Html2PDF {
	private static final String PDF_PATH = "E:\\testFile\\html2PDF.pdf";
	private static final String HTML_PATH = "E:\\testFile\\pdfTest.jsp";
	private static final String CSS_PATH = "E:\\testFile\\html2pdf.css";

	public static void main(String[] args) throws Exception {
//		BaseFont baseFont = BaseFont.createFont("E:\\testFile\\msyh.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
		// 文字如果要加粗,修改第三个参数
//		Font msya = new Font(baseFont, 12, Font.NORMAL);
		
		Document document = new Document(PageSize.A4, 10, 10, 10, 10);//左右上下的margin
		document.setMargins(0, 0, 0, 0);
		PdfWriter pdfwriter;
		pdfwriter = PdfWriter.getInstance(document, new FileOutputStream(PDF_PATH));
		document.open();
		XMLWorkerHelper wh = XMLWorkerHelper.getInstance();
		InputStream cssInput = new FileInputStream(CSS_PATH);
		wh.parseXHtml(pdfwriter, document, new FileInputStream(HTML_PATH), cssInput, new DefineFontProvider());

/*		// 读取完 html 的内容后,可以继续往 pdf 文件中写其他内容
		// 读取一个图片
		Image image = Image.getInstance("E:\\testFile\\dream.jpg");
		
		image.scalePercent(50);
		image.setAlignment(Image.ALIGN_RIGHT);
		// 设置图片的绝对位置
		// image.setAbsolutePosition(0, 0);
		// image.scaleAbsolute(500, 400);
		// 插入一个图片
		document.add(image);
		document.add(new Phrase("短语标题", msya));
//		document.add(new Paragraph("\n"));
		document.add(new Paragraph("段落内容", msya));
*/		
		document.close();
	
		System.out.println("succeed");
	}
}

DefineFontProvider.java

package html2PDF;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Font;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;

public class DefineFontProvider extends XMLWorkerFontProvider {
	@Override
	public Font getFont(final String fontname, final String encoding, final boolean embedded, final float size,
			final int style, final BaseColor color) {
		BaseFont bf = null;
		try {
			bf = BaseFont.createFont("E:\\testFile\\msyh.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
		} catch (Exception e) {
			e.printStackTrace();
		}
		Font font = new Font(bf, size, style, color);
		font.setColor(color);
		return font;
	}
}