解决itext 将html转PDF时 中文无法显示的问题

实际上是因为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();: 这行代码刷新输出流,确保所有数据都被发送到客户端。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于使用iText7将HTML换为PDF解决中文乱码问题,我可以给你一些思路和代码示例。 首先,我们需要使用iText7的Core和pdfHTML模块,你可以在pom.xml中添加以下依赖: ```xml <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext7-core</artifactId> <version>7.1.16</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>html2pdf</artifactId> <version>3.0.2</version> </dependency> ``` 然后,我们需要使用pdfHTML模块提供的`HtmlConverter`类将HTML换为PDF。在换之前,我们需要设置一些PDF文档的属性,例如页边距和字体。 下面是一个简单的代码示例,可以将HTML字符串换为PDF文件并解决中文乱码问题: ```java import com.itextpdf.html2pdf.ConverterProperties; import com.itextpdf.html2pdf.HtmlConverter; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.kernel.font.PdfFont; import com.itextpdf.kernel.geom.PageSize; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfWriter; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class HtmlToPdfConverter { public static void main(String[] args) throws IOException { // HTML字符串 String html = "<html><head><meta charset='utf-8'></head><body><p>你好,世界!</p></body></html>"; // 输出文件 File outputFile = new File("output.pdf"); FileOutputStream outputStream = new FileOutputStream(outputFile); // 创建PDF文档 PdfWriter writer = new PdfWriter(outputStream); PdfDocument pdfDocument = new PdfDocument(writer); pdfDocument.setDefaultPageSize(PageSize.A4); // 设置字体 PdfFont font = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false); ConverterProperties converterProperties = new ConverterProperties(); converterProperties.setFontProvider((familyName, encoding, size, style, color) -> font); // 将HTML换为PDF HtmlConverter.convertToPdf(new ByteArrayInputStream(html.getBytes()), pdfDocument, converterProperties); // 关闭流 outputStream.close(); } } ``` 在上面的代码中,我们使用了`PdfFontFactory`来创建指定字体的PDF字体对象。这里使用了华文宋体字体和UniGB-UCS2-H编码,你可以根据自己的需求进行调整。 另外,需要注意的是,如果你的HTML中包含中文字符,一定要在`<head>`标签中设置`<meta charset='utf-8'>`,这样就可以正确处理中文字符了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值