有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

itext7 Java未显示特定字符SURGORATEPAIRSTRING

我正在使用iText7 7.1.1创建带有SurrogatePair字符串的表
当第一个代理TEPAIR字符为“U+2000B”时,它不显示
对于第二个和后续字符,将显示它
环境:java版本“1.7.0_45”

import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.io.font.PdfEncodings;
import java.io.File;

public class SimpleTable {
    public static final String DEST = "SimpleTable.pdf";

    public static void main(String[] args) throws Exception {
        File file = new File(DEST);
        new SimpleTable().manipulatePdf(DEST);
    }

    protected void manipulatePdf(String dest) throws Exception {
        PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));
        Document doc = new Document(pdfDoc);

        // UTF-8 encoding table and Unicode characters
        // http://www.utf8-chartable.com/unicode-utf8-table.pl?start=131072&unicodeinhtml=hex&htmlent=1
        byte[] bUtf16A = {(byte)0xd8, (byte)0x40, (byte)0xdc, (byte)0x0b}; // First-String  U+2000B
        byte[] bUtf16B = {(byte)0xd8, (byte)0x69, (byte)0xde, (byte)0xb2}; // Second-String U+2A6B2

        String strUtf16A = new String(bUtf16A, "UTF-16");
        String strUtf16B = new String(bUtf16B, "UTF-16");
        String strUtf16AB = strUtf16A + strUtf16B;
        String strUtf16BA = strUtf16B + strUtf16A;
        //PdfFont font = PdfFontFactory.createFont("C:/Windows/Fonts/msmincho.ttc,0", PdfEncodings.IDENTITY_H);
        PdfFont font = PdfFontFactory.createFont("C:/Windows/Fonts/meiryo.ttc,0", PdfEncodings.IDENTITY_H);

        Table table = new Table(4);
        for (int i = 0; i < 16; i++) {
            if (i < 4) {
                table.addCell(new Paragraph(strUtf16A).setFont(font).setFontSize(12)); // Not Display String
            } else if (i < 8) {
                table.addCell(new Paragraph(strUtf16B).setFont(font).setFontSize(12)); // Display String
            } else if (i < 12) {
                table.addCell(new Paragraph(strUtf16AB).setFont(font).setFontSize(12)); // Not Display First-String
            } else {
                table.addCell(new Paragraph(strUtf16BA).setFont(font).setFontSize(12)); // Display Strings
            }
        }
        doc.add(table);
        doc.close();
    }
}

共 (1) 个答案

  1. # 1 楼答案

    这显然是iText中的一个错误。它已经登录到内部缺陷跟踪系统,将在下一个版本中处理

    该字符被错误地修剪,这就是为什么它在生成的PDF中丢失的原因

    同时,作为一种解决方法,您可以在字符串的开头预先添加一个零宽度的连接符(U200d)。这将解决问题,但请记住,这是一种变通方法,在iText的未来版本中可能不起作用

    这条线的作用是:

    table.addCell(new Paragraph("\u200d" + strUtf16A).setFont(font).setFontSize(12));
    

    UPD该漏洞在iText 7.1.2版本中已修复