使用 flying-saucer-pdf 实现html转换pdf

ps:之前研究了使用itext html转PDF 对中文和css的支持不很好,果然Google了一把,发现flying-saucer-pdf这个效果好,研究了一下果然行,运用到项目中基本上能满足需求。

1、pom.xml 文件 

 1  1   <dependency>
 2  2             <groupId>com.itextpdf</groupId>
 3  3             <artifactId>itextpdf</artifactId>
 4  4             <version>5.5.13</version>
 5  5         </dependency>
 6  6         <dependency>
 7  7             <groupId>com.itextpdf.tool</groupId>
 8  8             <artifactId>xmlworker</artifactId>
 9  9             <version>5.5.13</version>
10 10         </dependency>
11 11         <dependency>
12 12             <groupId>com.itextpdf</groupId>
13 13             <artifactId>itext-asian</artifactId>
14 14             <version>5.2.0</version>
15 15         </dependency>
16 16         <dependency>
17 17             <groupId>org.xhtmlrenderer</groupId>
18 18             <artifactId>flying-saucer-pdf</artifactId>
19 19             <version>9.0.3</version>
20 20         </dependency>

2、代码

package pdf.kit;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.Pipeline;
import com.itextpdf.tool.xml.XMLWorker;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.itextpdf.tool.xml.html.CssAppliers;
import com.itextpdf.tool.xml.html.CssAppliersImpl;
import com.itextpdf.tool.xml.html.Tags;
import com.itextpdf.tool.xml.net.FileRetrieve;
import com.itextpdf.tool.xml.net.ReadingProcessor;
import com.itextpdf.tool.xml.parser.XMLParser;
import com.itextpdf.tool.xml.pipeline.css.CSSResolver;
import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline;
import com.itextpdf.tool.xml.pipeline.end.PdfWriterPipeline;
import com.itextpdf.tool.xml.pipeline.html.*;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.Charset;

/**
 * html 转换成 pdf
 */
public class ParseHtmlTable {

    public static final String pdfDestPath = "C:/Users/xxx-b/Desktop/pdf/";
    public static final String htmlPath = "D:\\3-workspace\\pdf-test\\src\\test\\resources\\templates\\test.html";

    public static void main(String[] args) throws IOException, DocumentException {
        String pdfName = "test.pdf";
        ParseHtmlTable parseHtmlTable = new ParseHtmlTable();
        String htmlStr = FileUtils.readFileToString(new File(htmlPath));
        parseHtmlTable.html2pdf(htmlStr,pdfName ,"C:\\Windows\\Fonts");
    }

    public void html2pdf(String html, String pdfName, String fontDir) {
        try {
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            ITextRenderer renderer = new ITextRenderer();
            ITextFontResolver fontResolver = (ITextFontResolver) renderer.getSharedContext().getFontResolver();
            //添加字体库 begin
            File f = new File(fontDir);
            if (f.isDirectory()) {
                File[] files = f.listFiles(new FilenameFilter() {
                    public boolean accept(File dir, String name) {
                        String lower = name.toLowerCase();
                        return lower.endsWith(".otf") || lower.endsWith(".ttf") || lower.endsWith(".ttc");
                    }
                });
                for (int i = 0; i < files.length; i++) {
                    fontResolver.addFont(files[i].getAbsolutePath(), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
                }
            }
            //添加字体库end
            renderer.setDocumentFromString(html);
            renderer.layout();
            renderer.createPDF(os);
            renderer.finishPDF();
            byte[] buff = os.toByteArray();
            //保存到磁盘上
            FileUtil.byte2File(buff,pdfDestPath,pdfName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

FileUtil.java

package pdf.kit;

import java.io.*;

public class FileUtil {

    /**
     * 获得指定文件的byte数组
     *
     * @param filePath 文件绝对路径
     * @return
     */
    public static byte[] file2Byte(String filePath) {
        ByteArrayOutputStream bos = null;
        BufferedInputStream in = null;
        try {
            File file = new File(filePath);
            if (!file.exists()) {
                throw new FileNotFoundException("file not exists");
            }
            bos = new ByteArrayOutputStream((int) file.length());
            in = new BufferedInputStream(new FileInputStream(file));
            int buf_size = 1024;
            byte[] buffer = new byte[buf_size];
            int len = 0;
            while (-1 != (len = in.read(buffer, 0, buf_size))) {
                bos.write(buffer, 0, len);
            }
            return bos.toByteArray();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
            return null;
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
                if (bos != null) {
                    bos.close();
                }
            } catch (Exception e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
            }
        }
    }

    /**
     * 根据byte数组,生成文件
     *
     * @param bfile    文件数组
     * @param filePath 文件存放路径
     * @param fileName 文件名称
     */
    public static void byte2File(byte[] bfile, String filePath, String fileName) {
        BufferedOutputStream bos = null;
        FileOutputStream fos = null;
        File file = null;
        try {
            File dir = new File(filePath);
            if (!dir.exists() && !dir.isDirectory()) {//判断文件目录是否存在
                dir.mkdirs();
            }
            file = new File(filePath + fileName);
            fos = new FileOutputStream(file);
            bos = new BufferedOutputStream(fos);
            bos.write(bfile);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        } finally {
            try {
                if (bos != null) {
                    bos.close();
                }
                if (fos != null) {
                    fos.close();
                }
            } catch (Exception e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
            }

        }
    }

}

3.html



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <style type="text/css">

        *{
            padding: 0;
            margin: 0;
            color: #000;
            font-family:Microsoft YaHei
        }
    </style>
</head>
<body screen_capture_injected="true" ryt11773="1">
<p>
    <span style="font-size:12.0pt; font-family:MS Mincho">長空</span> <span
        style="font-size:12.0pt; font-family:Times New Roman,serif">(Broken
            Sword),</span> <span style="font-size:12.0pt; font-family:MS Mincho">秦王殘劍</span>
    <span style="font-size:12.0pt; font-family:Times New Roman,serif">(Flying
            Snow),</span> <span style="font-size:12.0pt; font-family:MS Mincho">飛雪</span>
    <span style="font-size:12.0pt; font-family:Times New Roman,serif">(Moon),
        </span> <span style="font-size:12.0pt; font-family:MS Mincho">如月</span> <span
        style="font-size:12.0pt; font-family:Times New Roman,serif">(the
            King), and</span> <span style="font-size:12.0pt; font-family:MS Mincho">秦王</span>
    <span style="font-size:12.0pt; font-family:Times New Roman,serif">(Sky).</span>
</p>
<p>选中<input type="checkbox" value="1" disabled="disabled" checked="checked"/></p>
<br/>
<textarea rows="11" cols="10"  disabled="disabled">
    adfadfadfadfa
</textarea>
</body>
</html>

 

4、pdf结果

5、一些总结

   1、模板的要求: html的格式要求符合xml格式,必须要有闭合标签。

2、字体的支持: font-family:Microsoft YaHei ,html中定义字体,程序中一定要导入想匹配的格式,才能有效。

原文地址:https://www.cnblogs.com/dongjingzhiai/p/9018956.html

时间: 2024-10-10 18:12:20

使用 flying-saucer-pdf 实现html转换pdf的相关文章

如何批量把Word转PDF,Word转换PDF如何在线转换

随着PDF文件的流行,大多数的公司存放文件和资料都已习惯性的用PDF格式,毕竟PDF文件的不可编辑性以及其保密性深受大家喜欢,今天就来跟大家分享一下如何批量将word文件转换成PDF文件.操作步骤:第一步:打开电脑,进入浏览器,在百度首页搜索迅捷PDF在线转换器.第二步:进入转换器首页后,在导航栏内点开文档转换,在下拉框内选择Word转PDF.第三步:打开Word转PDF后,点击选择文件,在弹出的窗口里加入待转换的Word文件.第四步:将提前准备好的Word文档添加好后,设置需要转换的页码等参数

如何把下载的PDF文档转换格式

有的时候我们更喜欢在一些资源丰富的平台上下载文档,如豆丁.豆瓣等等,在豆丁上下载了一些文档有些是PDF格式的,但是我想把这些PDF文档转换成可编辑的Word格式文字,对于一些Word扫描的PDF文档该怎么处理呢?这里有些经验供大家分享. 将PDF扫描件转换成Word文档比较麻烦,有些PDF转换成Word转换器都是转换不了的,转换出来的Word文档也只会时Word而已.对此大家可以尝试迅捷PDF转换器,针对加密.乱码.图文形式文字,都可以很好转换处理.而且能保证质量. 迅捷PDF转换器就是一个不错

手机中如何处理Excel格式转换PDF格式

现在不少人操作文件格式的问题大都是在电脑中进行的,那有没有其他工具也能够进行这样的操作呢?如手机,毕竟手机携带起来还比较方便操作起来,说了这么多下面就向大家介绍手机中处理Excel格式转换PDF格式的方法,不会的小伙伴可以看看. 1.说起手机处理文件格式转换的问题,首先手机上需要下载一个转换文件格式的迅捷PDF转换器.使用它来将Excel文件转换为PDF. 2.打开软件进入PDF转换器的首页,点击选择其它文件转换PDF,然后会发现它又分为了word转换PDF.Excel转换PDF.PPT转换PD

Flying Saucer实现html转pdf(一些问题,持续更新)

Flying Saucer实现html转pdf(及一些问题,持续更新) 关于FlyingSaucer的使用官网上有详细的介绍. 官网地址: https://today.java.net/pub/a/today/2007/06/26/generating-pdfs-with-flying-saucer-and-itext.html#the-problem-with-pdfs 中国人在使用FlyingSaucer将Html转换成PDF的过程中有如下问题: l 中文不显示的问题 l <td>内容过长

Java使用Flying Saucer实现HTML代码生成PDF文档

1.需要的jar包:org.xhtmlrenderer.flying-saucer-pdf-itext5,itext.itext,Maven依赖如下: 1 <dependency> 2 <groupId>org.xhtmlrenderer</groupId> 3 <artifactId>flying-saucer-pdf-itext5</artifactId> 4 <version>9.0.7</version> 5 &l

如何进行dwg转pdf 多页转换

Dwg格式文件是一种图纸格式,设计师常会遇到这样的文件,但是dwg格式文件不便携带,一般情况下也无法打开,这时候我们都会把dwg格式文件转成PDF文件. 一.但是,你知道dwg转PDF该怎么转换呢?如果想要多页批量转换该怎么办呢? 想要将dwg文件转换成PDF格式,我们可以使用迅捷CAD编辑器(官网下载:http://cad.xjpdf.com)进行转换,迅捷CAD编辑器是一款强大的专门应用于dwg格式文件编辑工具,支持多种图纸格式预览.编辑.格式转换等. 二.怎么把dwg转换成PDF格式? 1

一种CAD转换PDF比较简单的方式

CAD图纸文件不能够在的电脑上直接打开查看,我们需要下载安装CAD看图软件,因此一般情况下,CAD制图员都会将CAD直接转换成PDF文件,在发给客户,这样使用PDF阅读器.WPS或是office文档就可以直接查看了.那么CAD转换PDF怎么样比较简单呢? 步骤一,打开任意浏览器,输入迅捷CAD编辑器,找到该软件的官网,点击进入. 步骤二,大家可以在软件官网主界面点击"立即下载"将迅捷CAD编辑器将软件按照步骤下载安装到电脑桌面上. 步骤三,请打开迅捷CAD编辑器,进入软件操作界面,这时

CAD转换PDF简单几步就能够搞定

CAD制图是一个复杂的过程,里面凝聚了建筑工程师的心血.按照自己的想法完成CAD制图工作后,很多人选择将CAD图纸转换成PDF格式,这样更加便于预览.可CAD图纸怎么转换成PDF格式呢?本篇就教大家简单几步搞定CAD转换PDF. 请下载安装迅捷CAD编辑器,软件安装完成后,请直接打开运行,进入软件操作界面. 将CAD转换成PDF有两种方法,可以单个文件转换,也可以批量转换. 1.如果您刚刚绘制完成CAD文件,或是打开了一个CAD文件编辑后,想要直接将CAD保存成PDF文件,那么可以使用以下方法:

pdf热门干货分享 怎么把pdf文档转换成word

pdf文件不能单独编辑,所以平时我们将word文档转成pdf的经验比较多,而将pdf转换成word的形式少一点,有很多人用最简单粗暴的办法,就是对着pdf文件将里头的内容再一次手动敲成文字,这实在是太浪费时间了,而且效率低下,还容易出错.实际上,随着科学的进步,我们完全可以通过一些PDF转换软件完成格式间的转换工作. 迅捷PDF转换器就可以对PDF文件进行高质量精准解析和转换.拥有多个转换模式,不仅仅局限于普通的PDF转换Word的功能,PDF转换器全面支持多种不同文件格式之间的转换,实现对PD

pdf文件怎么转换成word 最好用的转换方法

想要将pdf转换成word,这非常简单,我们可以将pdf中的文字复制到word中.什么?想要将pdf文件的中各个元素都转换成word,那就需要第三方转换软件了,你有没有使用过效果性能不错的软件呢,小编是常常接触文本转换的人,所以对此颇有一些了解,下面给你一个最好用的转换方法,实现pdf文件怎么转换成word. 第1步:实现简单转换的转换工具我们可以选择迅捷pdf转换器,经过多年的研发,软件一代代的更新大家有目共睹.对于文本格式转换的设置我们已经完全可以完成任意格式了,用户可以任性转,将pdf转换