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 楼答案
这显然是iText中的一个错误。它已经登录到内部缺陷跟踪系统,将在下一个版本中处理
该字符被错误地修剪,这就是为什么它在生成的PDF中丢失的原因
同时,作为一种解决方法,您可以在字符串的开头预先添加一个零宽度的连接符(
U200d
)。这将解决问题,但请记住,这是一种变通方法,在iText的未来版本中可能不起作用这条线的作用是:
UPD该漏洞在iText 7.1.2版本中已修复