本博客主要演示使用 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 文件,但是效果有待商榷。我还是推荐直接把内容直接生成 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"> </td> <td class="tab_attr">公司名称</td><td class="tab_content" id="unitName"> </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; } }