美文网首页
Springboot 中集成itextpdf HTML转PDF并

Springboot 中集成itextpdf HTML转PDF并

作者: 码农家的蜗牛 | 来源:发表于2019-04-09 15:23 被阅读0次
依赖包 pom.xml 配置
<properties>
      <itextPdf.version>5.5.11</itextPdf.version>
      <itextAsian.version>5.2.0</itextAsian.version>
</properties>
<dependencies>
      <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>${itextPdf.version}</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>${itextAsian.version}</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>${itextPdf.version}</version>
        </dependency>
</dependencies>
代码帮助类主要方法
/**
  * 生成PDF文件的主要方法
  * @param filePath 生成pdf文件存放的完整绝对路径  example: **/test.pdf
  * @param context  pdf 正文
  * @param watermark pdf 每页的水印, 建议不要过长 8个字符差不多了, 太长需要调节字体大小, 否则无法显示完整 
  */
public static void createPDF(String filePath, String content, String waterMark) {
        Assert.notNull(filePath, "FilePath can not be null");
        Assert.notNull(content, "Content can not be null");
        Assert.notNull(waterMark, "WaterMark can not be null");
        Document document = new Document(PageSize.A4);
        try {
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filePath));
            writer.setPageEvent(new CustomEvent(waterMark));
            document.addTitle("PDF标题");
            document.open();

            // 额外添加内容的方法 如果只是普通文本转pdf, 用下面注释的代码即可, 注释后面的代码为html to pdf
//            BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",
//                    BaseFont.EMBEDDED);
//            Font font = new Font(baseFont);
//            document.add(new Paragraph(content, font));

            ByteArrayInputStream in = new ByteArrayInputStream(content.getBytes());
            ByteArrayInputStream is = new ByteArrayInputStream("".getBytes());
            XMLWorkerHelper.getInstance().parseXHtml(writer, document, in,is,new PdfFont());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            document.close();
        }
    }

 /**
  * 中文字体支持
  */
static class PdfFont extends XMLWorkerFontProvider {

        @Override
        public Font getFont(String fontname, String encoding, boolean embedded,
 float size, int style, BaseColor color) {
            String font = fontname;
            if (font == null) {
                font = "宋体";
            }
            if (size <= 0) {//size<0 会使内容重叠在一体
                size = 10.5f;
            }
            return super.getFont(font, encoding, embedded, size, style, color);
        }

    }

/**
  * 事件处理类, 用于监听pdf页码增加时, 每页增加水印
  */
static class CustomEvent extends PdfPageEventHelper {

        private String waterMark;

        public CustomEvent(String waterMark) {
            this.waterMark = waterMark;
        }

        @Override
        public void onStartPage(PdfWriter writer, Document document) {
            try {
                // 加入水印
                PdfContentByte waterMar = writer.getDirectContentUnder();
                // 开始设置水印
                waterMar.beginText();
                // 设置水印透明度
                PdfGState gs = new PdfGState();
                // 设置填充字体不透明度为0.2f
                gs.setFillOpacity(0.1f);
                // 设置水印字体参数及大小
                BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",
                        BaseFont.EMBEDDED);
                waterMar.setFontAndSize(baseFont,60);
                // 设置透明度
                waterMar.setGState(gs);
                // 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度
                waterMar.showTextAligned(Element.ALIGN_CENTER, waterMark , 300, 500, 45);
                //结束设置
                waterMar.endText();
                waterMar.stroke();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

如此即可正常解析html标签和css样式,生产pdf文件。
需要注意的是, 正常在windows环境, 中文字体齐全, 支持较好, 生产得pdf一般没问题,
但是在Linux环境下, 没有中文字体库, 生产pdf后, 正文会不显示中文内容。
所以需要添加中文字体集, 解决办法参考:
https://blog.csdn.net/ieeso/article/details/81902005

相关文章

网友评论

      本文标题:Springboot 中集成itextpdf HTML转PDF并

      本文链接:https://www.haomeiwen.com/subject/uggbiqtx.html