解决iText7输出pdf没有中文字符问题

背景

遇到个需求需要用Java导出PDF文件,权衡之下选择了iText,Java操作pdf的各个开源库之间的对比可以参考https://blog.csdn.net/u012397189/article/details/80196974
然后就是在pom文件中引包,网上很多都用iText5,这里我用新版的iText7

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext7-core</artifactId>
            <version>7.1.17</version>
        </dependency>

这里附上iText7的官方文档中文翻译
https://github.com/iTextCN/itext7-in-mandarin

问题:

网上的教程大多采用这种写法,使用iText自带的中文jar包,但是结果是输出都是乱码。

PdfFont pdfFont = PdfFontFactory.createFont("STSongStd-Light", PdfEncodings.IDENTITY_H);
PdfWriter writer = new PdfWriter("./pdfTest.pdf");
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);
Paragraph paragraph = new Paragraph();
paragraph.setFont(pdfFont).setFontSize(12);
paragraph.add("这是一段测试文字!");
document.add(paragraph);
document.close();

还有一个致命的问题是如果输出中文的省略号或者中文汉字“凉”,会直接报空指针。

解决:

我在网上尝试了很多解决方案,大多数是iText5的,有人说是iTextAsain包的版本要兼容,但是我尝试更改版本号后还是不行。某些方法能够输出中文,但是又会因为某些中文字符报空指针,始终不够完美,也不够简单。
这里提供一种最简单的方法解决问题,直接使用第三方的字体。

pom文件,只引入这个就够了

<dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext7-core</artifactId>
        <version>7.1.17</version>
</dependency>

Java文件

        PdfFont pdfFont = PdfFontFactory.createFont("src/main/resources/fonts/Songti.ttc,1", PdfEncodings.IDENTITY_H);

        //有问题
        PdfFont pdfFont2 = PdfFontFactory.createFont("src/main/resources/fonts/simhei.ttf", PdfEncodings.UTF8);

        //自带的全是乱码,而且中文省略号和中文"凉"字会直接报空指针
        PdfFont pdfFont3 = PdfFontFactory.createFont("STSongStd-Light", PdfEncodings.IDENTITY_H);

        PdfWriter writer = new PdfWriter("./SongtipdfTest.pdf");
        PdfDocument pdf = new PdfDocument(writer);
        Document document = new Document(pdf);
        Paragraph paragraph = new Paragraph();
        paragraph.setFont(pdfFont).setFontSize(12);
        paragraph.add(str);
        document.add(paragraph);
        document.close();

第一种用的是Mac系统自带的Songti字体文件,注意要有后面的,1。这个很坑,我也是看了源码才发现要加这个
第二种用的是windows系统自带的字体文件,但是还是有问题。
第三种用的是iText自带的,感觉完全不可用。

iText使用中文字体的三种方式参考https://www.cnblogs.com/whalesea/p/11752086.html

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,关于使用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'>`,这样就可以正确处理中文字符了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值