1、需求背景:
项目里导出会议记录时有一个富文本框内容也需要导出到PDF文件中,但是自己之前没有实现过这类功能,而且我们项目里面内网开发,也不能随便百度,找maven依赖也很麻烦
2、实现技术:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>8.0.4</version>
<type>pom</type>
</dependency>
<!-- https://mvnrepository.com/artifact/com.itextpdf/html2pdf -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>html2pdf</artifactId>
<version>5.0.4</version>
<exclusions>
<exclusion>
<groupId>com.itextpdf</groupId>
<artifactId>layout</artifactId>
</exclusion>
</exclusions>
</dependency>
3、代码解析:
实际上导出PDF的代码前人已经帮我们弄好了,我们找到对应版本的依赖引入直接用即可,不过用法有很多种,有导出本地文件的,导出流文件的等等;这里以导出到document对象为例,
难点1:
要求itext7-core依赖版本要html2pdf的依赖版本相一致
难点2:
代码是实现上要灵活运用,富文本转换的方法有很多,用自己需要的即可,不然可能会导致后续内容无法导出到PDF中,我就碰到了这个问题,中间弄了好久
4、代码实现
这里由于隐私问题直接去部分实现代码
// HtmlToPdfManualParsing.handleHtmlContent(document, meetingAttendanceRecord,fileUrl);
String richText = addPrefixToImageSrc(meetingAttendanceRecord, fileUrl);
ConverterProperties converterProperties = new ConverterProperties();
FontProvider fontProvider = new FontProvider();
// 将字体添加到字体提供器中,"SimSun" 是字体名称,在HTML中可通过这个名称来引用该字体
fontProvider.addFont(filePath);
// 设置转换器属性的字体提供器
converterProperties.setFontProvider(fontProvider);
// Document convertToDocument = HtmlConverter.convertToDocument(richText, pdf, converterProperties);
List<IElement> iElementList = HtmlConverter.convertToElements(richText, converterProperties);
// 遍历元素列表,根据元素类型添加到Document中
for (IElement element : iElementList) {
if (element instanceof Paragraph) {
Paragraph paragraph = (Paragraph) element;
List<IElement> children = paragraph.getChildren();
for (IElement iElement : children) {
if (iElement instanceof Image) {
Image image = (Image) iElement;
image.setWidth(260).setHeight(130).setTextAlignment(com.itextpdf.layout.properties.TextAlignment.CENTER);
document.add(image);
} else {
document.add(new Paragraph(((Text) iElement).getText()));
}
}
// document.add(paragraph);
} else if (element instanceof Image) {
Image image = (Image) element;
image.setWidth(260).setHeight(130).setTextAlignment(com.itextpdf.layout.properties.TextAlignment.CENTER);
document.add(image);
} else if (element instanceof Table) {
document.add((Table) element);
} else if (element instanceof Text) {
document.add(new Paragraph((Text) element));
} else if (element instanceof com.itextpdf.layout.element.List) {
// 如果是列表元素,直接添加到Document中
document.add((com.itextpdf.layout.element.List) element);
}else {
// 对于其他未知类型元素,添加到默认Paragraph中(可根据实际完善处理)
Paragraph defaultParagraph = new Paragraph();
defaultParagraph.add((Text) element);
}
}