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 文件效果:
Java 实现 Html 转 pdf_第1张图片Java 实现 Html 转 pdf_第2张图片

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

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

代码如下:
html 代码





Insert title here




	

PDF测试

软件名称  公司名称 
公司地址北京海淀 联系方式123456789
公司简介 闹大目的是发手动阀哦士大夫爱的发声难道额我发 奥斯丁你发送的你发送的发阿奎那的方法, 啊的反思的。


软件名称某某管理系统 公司名称北京海淀科技有限公司
公司地址北京海淀 联系方式123456789
公司简介 闹大目的是发手动阀哦士大夫爱的发声难道额我发 奥斯丁你发送的你发送的发阿奎那的方法, 啊的反思的。


软件名称某某管理系统 公司名称北京海淀科技有限公司
公司地址北京海淀 联系方式123456789
公司简介 闹大目的是发手动阀哦士大夫爱的发声难道额我发 奥斯丁你发送的你发送的发阿奎那的方法, 啊的反思的。

ps:标签务必加上结束符,例如上面的

— – 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;
	}
}

你可能感兴趣的:(Java)