Html导出Pdf工具类

	<dependency>
		<groupId>com.itextpdf</groupId>
		<artifactId>itextpdf</artifactId>
		<version>5.5.9</version>
	</dependency>

<dependency>
	<groupId>com.itextpdf.tool</groupId>
	<artifactId>xmlworker</artifactId>
	<version>5.5.9</version>
</dependency>

<dependency>
	<groupId>com.itextpdf</groupId>
	<artifactId>itext-asian</artifactId>
	<version>5.2.0</version>
</dependency>

<dependency>
	<groupId>org.xhtmlrenderer</groupId>
	<artifactId>flying-saucer-pdf-itext5</artifactId>
	<version>9.0.3</version>
</dependency>
 /**
     * 把html转换成pdf,以字节数组的形式返回pdf文件
     *
     * @param html
     * @return pdf字节数组
     * @throws IOException
     * @throws DocumentException
     * @throws CssResolverException
     */
    public static byte[] html2pdf(String html, String waterMarkName) throws IOException, DocumentException, CssResolverException {
       String data = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"> <html lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\">";
        html = data+html.replace("<br>", "<br/>").replace("<hr>", "<hr/>").replace("<img>", "<img/>").replace("<param>", "<param/>")
                .replace("<link>", "<link/>").replace("<td>", "<td/>");

        Document document = new Document(PageSize.A4);
        ByteArrayOutputStream docout = new ByteArrayOutputStream();
        PdfWriter pdfWriter = PdfWriter.getInstance(document, docout);
        document.open();
        XMLWorkerHelper worker = XMLWorkerHelper.getInstance();
        InputStream inputStream = null;
        pdfWriter.setViewerPreferences(PdfWriter.HideToolbar);

        pdfWriter.setPageEvent(new BackGroundPdf(waterMarkName));
        PdfContentByte under = pdfWriter.getDirectContentUnder();
        Properties properties = System.getProperties();
        //动态获取环境变量的值;Windows 10
        String property = properties.getProperty("os.name");
        boolean windows = property.contains("Windows");
        BaseFont bfChinese = null;
        if (windows) {

            bfChinese = BaseFont.createFont("C:/WINDOWS/Fonts/SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        } else {
            //LINUX环境
            String FONT_PATH = "/usr/share/fonts/chinese/SIMYOU.TTF";
            bfChinese = BaseFont.createFont(FONT_PATH, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

        }

        //添加水印
        under.beginText();
        under.setColorFill(BaseColor.LIGHT_GRAY);
        under.setFontAndSize(bfChinese, 30);

        for (float y = 0; y < 1000; y = y + 350) {
            for (float x = 0; x < 800; x = x + 200) {
                //设置数据位置的x,y轴,通过双重循环来达到铺满背景的目的
                under.setTextMatrix(x, y);

                // 设置水印文字字体倾斜 开始
                under.showTextAligned(Element.ALIGN_LEFT, waterMarkName, y, x, 45);

            }

        }
        under.endText();
        worker.parseXHtml(pdfWriter, document, new ByteArrayInputStream(html.getBytes(StandardCharsets.UTF_8)), inputStream, StandardCharsets.UTF_8, new AsianFontProvider());
        document.close();
        return docout.toByteArray();
    }

    /**
     * 用于中文显示的Provider
     */
    static class AsianFontProvider extends XMLWorkerFontProvider {
        @Override
        public Font getFont(final String fontname, String encoding, float size, final int style) {
            try {
                Properties properties = System.getProperties();
                String property = properties.getProperty("os.name");
                boolean windows = property.contains("Windows");
                BaseFont bfChinese = null;
                if (windows) {
                    bfChinese = BaseFont.createFont("C:/WINDOWS/Fonts/SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
                } else {
                    //LINUX环境
                    String FONT_PATH = "/usr/share/fonts/chinese/SIMYOU.TTF";
                    bfChinese = BaseFont.createFont(FONT_PATH, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
                }
                return new Font(bfChinese, size, style);
            } catch (Exception ignored) {
            }
            return super.getFont(fontname, encoding, size, style);
        }
    }
public class BackGroundPdf extends PdfPageEventHelper {
    private String waterMarkName = "";

    public String getWaterMarkName() {
        return waterMarkName;
    }

    public void setWaterMarkName(String waterMarkName) {
        this.waterMarkName = waterMarkName;
    }

    public BackGroundPdf(){

    }

    public BackGroundPdf(String waterMarkName){
        this.waterMarkName = waterMarkName;
    }
    @SneakyThrows
    @Override
    public void onStartPage(PdfWriter pdfWriter, Document document) {
        PdfContentByte under = pdfWriter.getDirectContentUnder();
        Properties properties = System.getProperties();
        String property = properties.getProperty("os.name");
        boolean windows = property.contains("Windows");
        BaseFont bfChinese = null;
        if (windows) {
            bfChinese = BaseFont.createFont("C:/WINDOWS/Fonts/SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        } else {
            //LINUX环境
            String FONT_PATH = "/usr/share/fonts/chinese/SIMYOU.TTF";
            bfChinese = BaseFont.createFont(FONT_PATH, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        }
//添加水印
        under.beginText();
        under.setColorFill(BaseColor.LIGHT_GRAY);
        under.setFontAndSize(bfChinese, 30);

        for (float y = 0; y < 1000; y = y + 350) {
            for (float x = 0; x < 800; x = x + 200) {
                //设置数据位置的x,y轴,通过双重循环来达到铺满背景的目的
                under.setTextMatrix(x, y);

// 设置水印文字字体倾斜 开始
                under.showTextAligned(Element.ALIGN_LEFT, waterMarkName, y, x, 45);


//                    textStamp.setXIndent(x);
//					textStamp.setYIndent(y);
                //添加水印
            }

        }
        under.endText();
        super.onStartPage(pdfWriter, document);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值