1

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

pdf框

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();
}

正文

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));
    }
}

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

4

4 回答 4

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));
        }
    }

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

BG, ES, CS, DA, DE, ET, EL, EN, FR, IT, LV, LT, HU, MT, NL, PL, PT, RO, SK, SL, FI, SV

并且只有罗马尼亚语的 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();
}

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

于 2011-05-31T11:05:52.140 回答
1

您可能会发现此答案很有帮助 - 它确认您无法使用其中一种标准类型 1 字体做您需要的事情,因为它们只是 Latin1

理论上,您只需要在文档中嵌入合适的字体,它会处理您的所有代码点,然后使用它。但是,编写 unicode 字符串时至少存在一个未解决的错误,因此它可能还不能正常工作……试试 svn trunk 的最新 pdfbox,看看它是否有帮助!

于 2011-05-31T09:34:48.813 回答
0

在我的项目中,我只是将支持 UTF8(或您想要的任何语言)的字体复制到一个目录(或者您可以使用 Windows 字体路径)并添加一些代码,它看起来像这样

BaseFont baseFont = BaseFont.createFont("c:\\a.ttf", BaseFont.IDENTITY_H,true);
Font font = new Font(baseFont);
document.add(new Paragraph("Not English Text",font));

现在,您可以使用此字体以各种语言显示您的文本。

于 2012-01-12T14:46:11.847 回答
0

//使用此代码。有时 setfont() 不适用于段落

try
{

    FileOutputStream out=new FileOutputStream(name);

    Document doc=new Document();

    PdfWriter.getInstance(doc, out);

    doc.open();

    Font f=new Font(FontFamily.TIMES_ROMAN,50.0f,Font.UNDERLINE,BaseColor.RED);
    Paragraph p=new Paragraph("New PdF",f);

    p.setAlignment(Paragraph.ALIGN_CENTER);

    doc.add(p);
    doc.close();
    }
    catch(Exception e)
    {
        System.out.println(e);
    }
}
于 2013-10-01T07:09:46.253 回答