Java 为什么jlabel中的阿拉伯文文本(jlabel在jpanel中)不显示在带有jpanel.print(Graphics2D)的pdf中?
为什么jlabel中的阿拉伯文文本(jlabel在jpanel中)不显示在带有jpanel.print(Graphics2D)的pdf中?法语文本显示得很好!有关更多信息,请参见图片,谢谢:Java 为什么jlabel中的阿拉伯文文本(jlabel在jpanel中)不显示在带有jpanel.print(Graphics2D)的pdf中?,java,itext,jpanel,jlabel,arabic,Java,Itext,Jpanel,Jlabel,Arabic,为什么jlabel中的阿拉伯文文本(jlabel在jpanel中)不显示在带有jpanel.print(Graphics2D)的pdf中?法语文本显示得很好!有关更多信息,请参见图片,谢谢: public class PaneltopdfView extends FrameView { private javax.swing.JButton jButton1; private javax.swing.JLabel jLabel1; private javax.swing
public class PaneltopdfView extends FrameView {
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JPanel jPanel1;
private javax.swing.JTextField jTextField1;
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
Desktop desktop = Desktop.getDesktop();
jTextField1.setBackground( jPanel1.getBackground());
// print the panel to pdf
Document document = new Document();
try {
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("test.pdf"));
document.open();
PdfContentByte contentByte = writer.getDirectContent();
PdfTemplate template = contentByte.createTemplate(500, 500);
Graphics2D g2 = template.createGraphics(500, 500);
jPanel1.print(g2);
g2.dispose();
contentByte.addTemplate(template, 30, 300);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (document.isOpen()) {
document.close();
} // TODO add your handling code here:
}
File file = new File("test.pdf");
if (file.exists()) {
try {
desktop.open(file);
} catch (IOException ex) {
// Logger.getLogger(CalculerAbsIndiv.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
问题可能是字体/编码问题
- 首先,并非每种字体都有可能的字符。如果您选择一种字体(如Helvetica)并要求其生成阿拉伯语文本,则该字体将不起作用 显示的字符(实际像素信息)称为字形。与字符关联的代码(ASCII、unicode)是 称为代码点 每当iText遇到一个代码点 所选字体中没有可用的字形信息,它将 只需跳过该字符。如果您使用了错误的字体,您将 从未见过任何字符 第二,如果你使用阿拉伯语,考虑使用ITXEX7和PDFrAgScript。阿拉伯语(以及其他几种语言)具有所谓的opentype功能。或者,简单地说,他们需要的不仅仅是简单的“查找glyph,将glyph放在这里”。例如,阿拉伯语有复杂的规则来控制字形顺序和连字 pdfCalligraph知道各种脚本的所有这些规则,并且无需您的任何努力即可应用它们
- 首先,并非每种字体都有可能的字符。如果您选择一种字体(如Helvetica)并要求其生成阿拉伯语文本,则该字体将不起作用 显示的字符(实际像素信息)称为字形。与字符关联的代码(ASCII、unicode)是 称为代码点 每当iText遇到一个代码点 所选字体中没有可用的字形信息,它将 只需跳过该字符。如果您使用了错误的字体,您将 从未见过任何字符 第二,如果你使用阿拉伯语,考虑使用ITXEX7和PDFrAgScript。阿拉伯语(以及其他几种语言)具有所谓的opentype功能。或者,简单地说,他们需要的不仅仅是简单的“查找glyph,将glyph放在这里”。例如,阿拉伯语有复杂的规则来控制字形顺序和连字 pdfCalligraph知道各种脚本的所有这些规则,并且无需您的任何努力即可应用它们
- 谢谢大家,我可以通过将我的jpanel转换为图像来解决这个问题:
BufferedImage image = new BufferedImage(jPanel1.getWidth(),jPanel1.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = image.createGraphics();
jPanel1.paint(g2);
try{
ImageIO.write(image, "jpg", new File("test.jpg"));
} catch (Exception e) {
e.printStackTrace();
}谢谢大家,我可以通过将我的jpanel转换为图像来解决这个问题:
BufferedImage image = new BufferedImage(jPanel1.getWidth(),jPanel1.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = image.createGraphics();
jPanel1.paint(g2);
try{
ImageIO.write(image, "jpg", new File("test.jpg"));
} catch (Exception e) {
e.printStackTrace();
}字体是否为unicode?如果使用
绘制
而不是打印
,会发生什么情况?它不起作用:结果相同!:jLabel1.setFont(新字体(“SimSun”,Font.PLAIN,12));油漆:它不起作用:同样的结果!字体是否为unicode?如果使用paint
而不是print
,会发生什么情况?它不起作用:结果相同!:jLabel1.setFont(新字体(“SimSun”,Font.PLAIN,12));油漆:它不起作用:同样的结果!请注意,PdfGraphics2D
在iText 7中不再可用。请举例说明iText 7(面板到pdf)?请注意,PdfGraphics2D
在iText 7中不再可用。请举例说明iText 7(面板到pdf)?