HTML转PDF——Itext

1.依赖

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

2.代码

package com.isoftstone.fasa.api.wechat.fault.pdf;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider;
import com.itextpdf.io.IOException;
import com.itextpdf.io.font.FontConstants;
import com.itextpdf.io.font.FontProgram;
import com.itextpdf.io.font.FontProgramFactory;
import com.itextpdf.io.util.ResourceUtil;
import com.itextpdf.io.util.StreamUtil;
import com.itextpdf.kernel.events.Event;
import com.itextpdf.kernel.events.IEventHandler;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.*;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.font.FontSelectorStrategy;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.VerticalAlignment;

import com.itextpdf.text.pdf.PdfGState;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Component;
import org.springframework.util.ResourceUtils;
import org.springframework.util.concurrent.ListenableFuture;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import javax.annotation.PostConstruct;
import java.awt.*;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

/**
 * PDF生成工具类<br>
 */
@Slf4j
@Component("PDFConverter")
public class PDFConverter {

    @Autowired
    private FontProperties fontProperties;

    private static Map<String, FontProgram> fontCache = new HashMap<>();

    private static DefaultFontProvider defaultFontProvider;

    @PostConstruct
    private void init() {
        for (Entry<String, String> entry : fontProperties.getAlias().entrySet()) {
            String directPath = StrUtil.concat(false, fontProperties.getPath(), entry.getValue());
            try {
                byte[] file = FileUtil.readBytes(ResourceUtils.getFile(directPath));
                FontProgram font = FontProgramFactory.createFont(file, false);
                fontCache.put(entry.getKey(), font);
            } catch (Throwable e) {
                log.error("[PDFConverter.init]", e);
                continue;
            }
        }
        defaultFontProvider = new DefaultFontProvider(false, false, true);
        for (FontProgram font : fontCache.values()) {
            defaultFontProvider.addFont(font);
        }
    }

    /**
     * 添加字体
     */
    @SneakyThrows
    public void addFont(String alias, String fileName) {
        fontCache.put(alias, FontProgramFactory.createFont(FileUtil.readBytes(ResourceUtils.getFile(StrUtil.concat(false, fontProperties.getPath(), fileName))),
                false));
    }

    /**
     * 获取所有的字体<br>
     */
    public Map<String, FontProgram> fonts() {
        return Collections.unmodifiableMap(fontCache);
    }

    /**
     * 将html内容转换为pdf
     */
    @Async
    @SneakyThrows
    public ListenableFuture<ByteArrayOutputStream> convert(String html) {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        ConverterProperties properties = new ConverterProperties();
        DefaultFontProvider defaultFontProvider = fontProvider();
        properties.setFontProvider(defaultFontProvider);
        PdfDocument pdf = new PdfDocument(new PdfWriter(stream));
        pdf.setDefaultPageSize(new PageSize(1000.0F,1050.0F));
//        pdf.addEventHandler(PdfDocumentEvent.INSERT_PAGE,new WatermarkingEventHandler());
        Document document = HtmlConverter.convertToDocument(html, pdf, properties);
        document.close();
        return new AsyncResult<>(stream);
    }

    private DefaultFontProvider fontProvider() {
        DefaultFontProvider defaultFontProvider = new DefaultFontProvider(true, true, false);
//        FontSelectorStrategy strategy = defaultFontProvider.getStrategy("english", Collections.EMPTY_LIST);
//        //选择中文字体
//        strategy.nextGlyphs();
        String[] SHIPPED_FONT_NAMES = new String[]{"simsun.ttc","Deng.ttf","Dengb.ttf"};
        String SHIPPED_FONT_RESOURCE_PATH  = "fonts/";
        for (String fontName : SHIPPED_FONT_NAMES) {
            try (InputStream stream = ResourceUtil.getResourceStream(SHIPPED_FONT_RESOURCE_PATH + fontName)) {
                byte[] fontProgramBytes = StreamUtil.inputStreamToArray(stream);
                defaultFontProvider.addFont(fontProgramBytes, null, null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        FontSelectorStrategy strategy = defaultFontProvider.getStrategy("中文", Collections.EMPTY_LIST);
        //选择字体
        strategy.nextGlyphs();
        return defaultFontProvider;
    }

    protected static class WatermarkingEventHandler implements IEventHandler {
        protected float x = 298f;
        protected float y = 421f;
        @Override
        public void handleEvent(Event event) {
            PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
            PdfDocument pdfDoc = docEvent.getDocument();
            PdfPage page = docEvent.getPage();
            PdfFont font = null;
            try {
                font = PdfFontFactory.createFont(FontConstants.HELVETICA_BOLD);
            } catch (IOException | java.io.IOException e) {
                e.printStackTrace();
            }
            PdfCanvas canvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), pdfDoc);
            new Canvas(canvas, pdfDoc, page.getPageSize())
                    .setFontSize(60)
                    .setFont(font)
                    .showTextAligned(new Paragraph("W A T E R M A R K"), x, y, pdfDoc.getPageNumber(page),
                            TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45);
        }
    }


}


版权声明:本文为qq_44952713原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。