POM
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>kernel</artifactId>
<version>7.1.14</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>html2pdf</artifactId>
<version>3.0.3</version>
</dependency>
PdfUtil
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider;
import com.itextpdf.io.font.FontProgram;
import com.itextpdf.io.font.FontProgramFactory;
import com.itextpdf.kernel.counter.event.IMetaInfo;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.DocumentProperties;
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.layout.Canvas;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.font.FontProvider;
import com.itextpdf.layout.property.TextAlignment;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
/**
* PDF 工具
*/
public final class PdfUtil {
private static class HtmlMetaInfo implements IMetaInfo {
private static final long serialVersionUID = -295587336698550627L;
}
private static ConverterProperties converter_properties;
/**
* 转换配置
* @return
* @throws Exception
*/
private static ConverterProperties get_converter_properties() throws Exception {
if (null != converter_properties){
return converter_properties;
}
FontProgram font_song = FontProgramFactory.createFont("/opt/font/SIMSUN.TTC,0");
FontProgram font_song_blod = FontProgramFactory.createFont("/opt/font/SIMSUN_BLOD.OTF");
FontProvider fontProvider = new DefaultFontProvider();
fontProvider.addFont(font_song);
fontProvider.addFont(font_song_blod);
ConverterProperties converter_properties = new ConverterProperties();
converter_properties.setFontProvider(fontProvider);
converter_properties.setCharset("UTF-8");
PdfUtil.converter_properties = converter_properties;
return converter_properties;
}
/**
* 返回PDF文件 BYTE
* @param html_str
* @return
* @throws Exception
*/
public static byte[] html_to_pdf(String html_str) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter pdf_writer = new PdfWriter(baos);
DocumentProperties doc_properties = new DocumentProperties()
.setEventCountingMetaInfo(new HtmlMetaInfo());
PdfDocument pdf_doc = new PdfDocument(pdf_writer,doc_properties);
Document doc = HtmlConverter.convertToDocument(html_str, pdf_doc, get_converter_properties());
flag_pdf_index(pdf_doc);
doc.close();
return baos.toByteArray();
}
/**
* 转换后保存到指定位置 不做文件目录创建
* @param html_str
* @param save_path
* @throws Exception
*/
public static void html_to_pdf(String html_str,String save_path) throws Exception {
OutputStream out = new FileOutputStream(save_path);
out.write(html_to_pdf(html_str));
out.flush();
out.close();
}
/**
* 标记页码
* @param pdf_doc
*/
private static void flag_pdf_index(PdfDocument pdf_doc){
int num = pdf_doc.getNumberOfPages();
int index = 1;
PdfFont font = pdf_doc.getDefaultFont();
PdfPage page = null;
Rectangle page_size = null;
PdfCanvas pdf_canvas = null;
Canvas canvas = null;
Paragraph p = null;
float x = 0;
float y = 0;
while (index <= num){
page = pdf_doc.getPage(index);
page_size = page.getPageSize();
pdf_canvas = new PdfCanvas(page.getLastContentStream(), page.getResources(), pdf_doc);
canvas = new Canvas(pdf_canvas, page_size);
p = new Paragraph().add(index + " / " + num)
.setFont(font)
.setFontSize(8)
.setMarginTop(10f);
x = (page_size.getLeft() + page_size.getRight()) / 2;
y = page_size.getBottom() + 15;
canvas.showTextAligned(p, x, y,TextAlignment.CENTER);
pdf_canvas.release();
index++;
}
}
}
test
@Test
public void t2() throws Exception {
String html = "<h1>O(∩_∩)O哈哈~</h1>";
String path = "/opt/test.pdf";
PdfUtil.html_to_pdf(html,path);
}
linux 需要上传文件字体文件支持中文(宋体),上传到 /opt/font
字体文件