iText 8.0.5 Java生成PDF时法语变音字符显示异常求助
解决iText 8.0.5法语变音字符显示异常问题
针对你遇到的é、à、â、ç等法语变音字符显示异常(如défunt变成dfunt、d©funt或défunt),以下是经过验证的解决方案:
1. 正确配置字体嵌入与编码
iText 8中,直接使用"UTF-8"作为编码参数并不适配PDF字体规范,需改用PdfEncodings.IDENTITY_H(支持全Unicode字符的水平书写编码),同时必须显式设置字体嵌入策略,确保特殊字符的字形被嵌入到PDF中。
修改字体创建代码:
// 替换原字体创建代码 PdfFont font = PdfFontFactory.createFont( fontPath, PdfEncodings.IDENTITY_H, EmbeddingStrategy.FORCE_EMBEDDED );
2. 统一元素字体设置
你的代码中Text label仅设置了加粗但未指定字体,会继承iText默认字体(Helvetica不支持法语变音字符)。需为所有文本元素统一指定字体:
Text label = new Text("Nom défunt : ").setBold().setFont(font); Text value = new Text("MyValue").setFont(font); cell.add(new Paragraph().add(label).add(value).setFontSize(8));
3. 确保请求字符编码正确
如果文本内容来自HTTP请求,需先设置请求编码避免乱码:
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 添加这行确保请求参数编码正确 request.setCharacterEncoding("UTF-8"); // 原有代码... }
修改后的完整关键代码片段
public class EtiquettesServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); String fontPath = "E:/Tomcat 9.0/webapps/Thanact/calibri.ttf"; response.setContentType("application/pdf"); response.setHeader("Content-Disposition", "attachment; filename=etiquettes.pdf"); try { PdfWriter writer = new PdfWriter(response.getOutputStream(), new WriterProperties().setPdfVersion(PdfVersion.PDF_2_0)); PdfDocument pdfDoc = new PdfDocument(writer); Document document = new Document(pdfDoc); // 正确创建嵌入字体 PdfFont font = PdfFontFactory.createFont( fontPath, PdfEncodings.IDENTITY_H, EmbeddingStrategy.FORCE_EMBEDDED ); Table table = new Table(UnitValue.createPercentArray(4)).useAllAvailableWidth(); Cell cell = new Cell(); // 补充代码中缺失的cell实例化 // 为所有Text元素指定字体 Text label = new Text("Nom défunt : ").setBold().setFont(font); Text value = new Text("MyValue").setFont(font); cell.add(new Paragraph().add(label).add(value).setFontSize(8)); table.addCell(cell); document.add(table); document.close(); } catch (Exception e) { e.printStackTrace(); response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Erreur lors de la génération du PDF : " + e.getMessage()); System.out.println(e.getMessage()); } } }
额外验证点
- 确认
calibri.ttf文件路径正确,且字体文件未损坏(Calibri原生支持法语变音字符)。 - 若仍有乱码,检查字符串本身的编码:可通过
System.out.println(Arrays.toString("Nom défunt : ".getBytes("UTF-8")))验证字符字节是否正确。
内容的提问来源于stack exchange,提问作者Pandalex
相关产品推荐
相关产品推荐

