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版权协议,转载请附上原文出处链接和本声明。