JAVA利用itext5实现富文本生成pdf

本文介绍如何利用itext5 Java库将富文本转换为PDF文档,分享了作者在研究过程中遇到的问题及解决方法,并提供完整源码,适合需要此功能的开发者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近有个需求,富文本框输入内容生成模板,然后填充内容生成pdf,网上的也看了真是坑爹,大都是连用都不能用的小demo。花了两天时间研究了一下itext5的api,踩了不少坑,为了后来人能少走点弯路,特献上源码,废话不多说,上图!

成品图啦~~

 

当然这是源码啦~~

 

/**
 * @author kkw
 * @date 2019/9/28
 */
public class PDFBuilder extends PdfPageEventHelper {

    /**
     * 页眉
     */
    public String header = "";

    /**
     * 文档字体大小,页脚页眉最好和文本大小一致
     */
    public int presentFontSize = 12;

    /**
     * 文档页面大小,最好前面传入,否则默认为A4纸张
     */
    public Rectangle pageSize = PageSize.A4;

    // 模板
    public PdfTemplate total;


    public BaseFont bf = null;


    /**
     * 利用基础字体生成的字体对象,一般用于生成中文文字
     */
    public Font fontDetail = null;

    //logo
    public static final String IMAGEPATH = "我是图片.png";

///-------------------------------我是分界线---------------------------------------//
    /**
     * leftHeader
     */
    private Phrase leftHeader;
    private Phrase rigntHeader;

    static final int marginX = 90;
    static final int marginY = 140;

    public static PdfTemplate tpl;

    private static BaseFont baseFont;
    /**
     * 生成下划线空白占位符
     */
    private static String Blank;
    /**
     * 页眉字体
     */
    public static Font font;
    /**
     * 下划线字体
     */
    private static Phrase blankPhrase;

    public PDFBuilder(String[] header) {
        this.leftHeader = new Phrase(header[0], PDFBuilder.font);
        this.rigntHeader = new Phrase(header[1], PDFBuilder.font);
    }

    static {
        try {
           
下面是一个使用iText7将富文本HTML转换为PDF并添加动态页数和水印的示例: ```java import com.itextpdf.html2pdf.ConverterProperties; import com.itextpdf.html2pdf.HtmlConverter; import com.itextpdf.kernel.colors.ColorConstants; import com.itextpdf.kernel.font.PdfFont; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.kernel.geom.Rectangle; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfPage; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.canvas.PdfCanvas; import com.itextpdf.kernel.pdf.xobject.PdfFormXObject; import java.io.File; import java.io.IOException; public class RichHtmlToPdfConverter { public static void main(String[] args) throws IOException { String html = "<html><body><h1>Hello, World!</h1></body></html>"; String pdfPath = "output.pdf"; PdfWriter writer = new PdfWriter(pdfPath); PdfDocument pdfDoc = new PdfDocument(writer); pdfDoc.setDefaultPageSize(new Rectangle(PageSize.A4.getLeft(), PageSize.A4.getBottom(), PageSize.A4.getRight(), PageSize.A4.getTop())); PdfFont font = PdfFontFactory.createFont("path/to/font.ttf", PdfEncodings.IDENTITY_H, true); int pageNum = 1; ConverterProperties props = new ConverterProperties(); HtmlConverter.convertToPdf(html, pdfDoc, props); int n = pdfDoc.getNumberOfPages(); for (int i = 2; i <= n; i++) { PdfPage page = pdfDoc.getPage(i); PdfCanvas canvas = new PdfCanvas(page); canvas.beginText() .setFontAndSize(font, 12) .moveText(pdfDoc.getDefaultPageSize().getRight() - 72, 36) .showText(String.format("Page %d", pageNum)) .endText(); pageNum++; } PdfFormXObject watermark = new PdfFormXObject(new Rectangle(0, 0, 100, 100)); PdfCanvas canvas = new PdfCanvas(watermark, pdfDoc); canvas.setFillColor(ColorConstants.LIGHT_GRAY); canvas.setStrokeColor(ColorConstants.LIGHT_GRAY); canvas.rectangle(0, 0, 100, 100); canvas.fill(); canvas.beginText() .setFontAndSize(font, 24) .moveText(20, 50) .showText("Confidential") .endText(); pageNum = 1; for (int i = 1; i <= n; i++) { PdfPage page = pdfDoc.getPage(i); canvas = new PdfCanvas(page); canvas.addXObject(watermark, 0, 0); canvas.beginText() .setFontAndSize(font, 12) .moveText(pdfDoc.getDefaultPageSize().getRight() - 72, 36) .showText(String.format("Page %d", pageNum)) .endText(); pageNum++; } pdfDoc.close(); } } ``` 在上面的示例中,我们首先创建一个PdfWriter和PdfDocument对象,然后设置默认页面大小为A4纸张大小。然后使用iText7的HtmlConverter将富文本HTML字符串转换为PDF文档。在转换HTML字符串为PDF文档后,我们使用循环遍历文档中的每个页面,并在每个页面的右下角添加动态页码。最后,我们创建一个PdfFormXObject对象,添加水印文本“Confidential”,并将其添加到每个页面中。 请注意,上面的示例中的代码片段是未经测试的,仅供参考。您需要根据您自己的需求进行修改和调整。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值