Java编写PDF - 不支持字体

时间:2013-09-05 02:24:00

标签: java pdf fonts itext pdf-writer

以下是使用 Java 撰写 PDF 的代码。

代码

public class PDFTest {    

    public static void main(String args[]) {
        Document document = new Document(PageSize.A4, 50, 50, 50, 50);       

        try {
            File file = new File("C://test//itext-test.pdf");
            FileOutputStream fileout = new FileOutputStream(file);            
            PdfWriter.getInstance(document, fileout);
            document.addAuthor("Me");
            document.addTitle("My iText Test");
            document.open();
            Chunk chunk = new Chunk("iText Test");
            Paragraph paragraph = new Paragraph();
            String test = "și";
            String test1 = "şi";
            if (test.equalsIgnoreCase(test1)) {
               // System.out.println("equal ignore case true");
                paragraph.add(test + " New Font equal with Old Font");
            } else {
              //  System.out.println("equal ignore case X true");
                paragraph.add(test1 + " New Font Not equal with Old Font");
            }
            paragraph.setAlignment(Element.ALIGN_CENTER);
            document.add(paragraph);          
            document.close();
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }
}

当我使用罗马尼亚语测试时,我发现创建的PDF中缺少 "ș" 。 文件如下所示: Error

非常感谢有关此问题的任何建议或参考链接。

**EDITED**
我使用下面的unicode示例,输出仍然相同。 "ș" 仍然缺失。

Code

static String RESULT = "C://test/itext-unicode4.pdf";
    static String FONT = "C://Users//PenangIT//Desktop//Arial Unicode.ttf";
    public static void main(String args[])
    {
        try
        {
            Document doc = new Document();
            PdfWriter.getInstance(doc, new FileOutputStream(RESULT));
            doc.open();
            BaseFont bf;
            bf = BaseFont.createFont(FONT,BaseFont.IDENTITY_H,BaseFont.EMBEDDED);
            doc.add(new Paragraph("Font : "+bf.getPostscriptFontName()+" with encoding: "+bf.getEncoding()));
            doc.add(new Paragraph(" TESTING "));
            doc.add(new Paragraph(" TESTING 1 și "));
            doc.add(new Paragraph(" TESTING 2 şi "));
            doc.add(Chunk.NEWLINE);
            doc.close();

        }
        catch(Exception ex)
        {            
        }

输出看起来像这样 enter image description here
编码也一样。 "ș" 仍然缺失。

1 个答案:

答案 0 :(得分:1)

请查看此PDF:encoding_example.pdf(*)

它包含默认字体Helvetica中不存在的各种字符(这是您正在使用的默认字体,因为您没有定义任何其他字体)。

EncodingExample源代码中,我们使用带有特定编码的arialbd.ttf,从而在PDF中使用简单字体。在UnicodeExample来源中,我们使用IDENTITY_H作为编码,从而导致在PDF中使用复合字体。

我已经调整了你的代码,因为我发现你不理解我的答案:

BaseFont bf = BaseFont.createFont(FONT,BaseFont.IDENTITY_H,BaseFont.EMBEDDED);
doc.add(new Paragraph(" TESTING 1 și ", new Font(bf, 12)));
doc.add(new Paragraph(" TESTING 2 \u015Fi ", new Font(bf, 12)));

你看到了区别吗?在您的代码中,您创建了bf,但您没有在任何地方使用该对象。

(*)注意:pdf.js无法解释某些字形,因为pdf.js不支持带特殊编码的简单字体;这些glypgh在Adobe Reader和Chrome PDF查看器中正确显示。如果您想要安全,请使用复合字体,因为pdf.js可以正确呈现这些字形:unicode_example.pdf