实际上是因为itext默认字体不能正确显示中文,所以需要添加字体
如果是使用插入paragraphs给document的方法,那么可以使用:
BaseFont base = BaseFont.createFont
("classpath:/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font = new Font(base,30,Font.NORMAL);
//...
String data = ".....";
Paragraph dataParagraph = new Paragraph(data, font);
其中记得将simsun.ttc换成实际存放在fonts文件夹下的字体文件,这个方法虽然不错,但是存在一个问题,必须要打包成jar包才能使用,开发环境的话,则可以使用系统字体文件,将路径改为系统文件的绝对路径即可。
但有一个新的问题,如果是直接把html模板转化成PDF时,并没有创建paragraphs进行插入,这个时候就无法设置字体。
通过尝试目前没有在itext5版本找到合适的方法,但在itext7中有解决方案:
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.layout.font.FontProvider;
添加好依赖包后,可以按照这种方式创建document:
try {
// 创建一个输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStream outputStream = response.getOutputStream(); // 初始化 outputStream
ConverterProperties converterProperties = new ConverterProperties();
FontProvider fontProvider = new FontProvider();
fontProvider.addFont("fonts/your-font");
converterProperties.setFontProvider(fontProvider);
HtmlConverter.convertToPdf(replacedHtml, baos, converterProperties);
// 将PDF输出到浏览器
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "inline; filename=output.pdf");
baos.writeTo(outputStream);
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
把your-font替换成实际的字体文件,这样可以将html转为PDF时,嵌入字体文件,而后面的代码则是实现了在浏览器中直接下载PDF。
其中
response.setContentType("application/pdf");
: 这行代码设置了响应的内容类型为PDF文件,告诉浏览器接收到的是一个PDF文件。
response.setHeader("Content-Disposition", "inline; filename=output.pdf");
: 这行代码设置了响应头的Content-Disposition字段,指定了文件在浏览器中的显示方式。其中,"inline"表示在浏览器中直接打开,"filename=output.pdf"表示浏览器下载时显示的文件名为output.pdf。baos.writeTo(outputStream);
: 这行代码将PDF文件的内容写入到一个字节数组输出流(ByteArrayOutputStream)中。
outputStream.flush();
: 这行代码刷新输出流,确保所有数据都被发送到客户端。