如何使用Unicode字符集的语言创建有关使用第三方字体的PDF文档

lis*_*sak 1 java fonts itext pdfbox

我正在使用PDFBoxiText从各种语言创建一个简单(只是段落)的pdf文档.就像是 :

pdfBox:

private static void createPdfBoxDocument(File from, File to) {
    PDDocument document = null;
    try {
        document = new TextToPDF().createPDFFromText(new FileReader(from));
        document.save(new FileOutputStream(to));
    } finally {
        if (document != null)
            document.close();
    }
}

private void createPdfBoxDoc() throws IOException, FileNotFoundException, COSVisitorException {
    PDDocument document = new PDDocument();
    PDPage page = new PDPage();
    document.addPage(page);
    PDPageContentStream contentStream = new PDPageContentStream(document, page);

    PDType1Font font = PDType1Font.TIMES_ROMAN;
    contentStream.setFont(font, 12);
    contentStream.beginText();
    contentStream.moveTextPositionByAmount(100, 400);
    contentStream.drawString("š");
    contentStream.endText();
    contentStream.close();
    document.save("test.pdf");
    document.close();
}
Run Code Online (Sandbox Code Playgroud)

itext:

private static Font blackFont = new Font(Font.FontFamily.COURIER, 12, Font.NORMAL, BaseColor.BLACK);

private static void createITextDocument(File from, File to) {
    Document document = new Document();
    PdfWriter.getInstance(document, new FileOutputStream(to));
    document.open();
    addContent(document, getParagraphs(from));
    document.close();
}

private static void addContent(Document document, List<String> paragraphs) { 

    for (int i = 0; i < paragraphs.size(); i++) {
        document.add(new Paragraph(paragraphs.get(i), blackFont));
    }
}
Run Code Online (Sandbox Code Playgroud)

输入文件以UTF-8编码,并且某些Unicode字符集的语言(如俄语字母等)在pdf中无法正确呈现.两个库中的字体不支持我认为的Unicode字符集,我找不到有关如何添加和使用第三方字体的任何文档.可以请任何人帮我一个例子吗?

lis*_*sak 5

如果你使用iText,它有很好的支持.

在iText in Action(第2.2.2章)中,您可以阅读更多内容.

你必须下载一些像arialuni.ttf这样的unicode字体并按照下面这样做:

    public static File fontFile = new File("fonts/arialuni.ttf");

    public static void createITextDocument(File from, File to) throws DocumentException, IOException {

        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(to));
        document.open();
        writer.getAcroForm().setNeedAppearances(true);
        BaseFont unicode = BaseFont.createFont(fontFile.getAbsolutePath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

        FontSelector fs = new FontSelector();
        fs.addFont(new Font(unicode));

        addContent(document, getParagraphs(from), fs);
        document.close();
    }

    private static void addContent(Document document, List<String> paragraphs, FontSelector fs) throws DocumentException { 

        for (int i = 0; i < paragraphs.size(); i++) {
            Phrase phrase = fs.process(paragraphs.get(i));
            document.add(new Paragraph(phrase));
        }
    }
Run Code Online (Sandbox Code Playgroud)

arialuni.ttf字体对我有用,到目前为止我检查了它的支持

BG, ES, CS, DA, DE, ET, EL, EN, FR, IT, LV, LT, HU, MT, NL, PL, PT, RO, SK, SL, FI, SV
Run Code Online (Sandbox Code Playgroud)

并且只有罗马尼亚语的PDF没有正确创建...

使用PDFBox它几乎是一样的:

private void createPdfBoxDoc() throws IOException, FileNotFoundException, COSVisitorException {
    PDDocument document = new PDDocument();
    PDPage page = new PDPage();
    document.addPage(page);
    PDPageContentStream contentStream = new PDPageContentStream(document, page);

    PDFont font = PDTrueTypeFont.loadTTF(document, "fonts/arialuni.ttf");
    contentStream.setFont(font, 12);
    contentStream.beginText();
    contentStream.moveTextPositionByAmount(100, 400);
    contentStream.drawString("š");
    contentStream.endText();
    contentStream.close();
    document.save("test.pdf");
    document.close();
}
Run Code Online (Sandbox Code Playgroud)

然而正如Gagravarr所说,由于这个问题PDFBOX-903,它不起作用.即使有1.6.0-SNAPSHOT版本.也许干线会起作用.我建议你使用iText.它完美地在那里工作.