1

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

本文:

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 charset をサポートしていないと思います。また、サードパーティのフォントを追加して使用する方法に関するドキュメントが見つかりません。誰かが例を手伝ってくれませんか?

4

4 に答える 4

5

If you are using iText, it has quite good support.

In iText in Action (chapter 2.2.2) you can read more.

You have to download some unicode Fonts like arialuni.ttf and do it like this :

    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 fonts work for me, so far I checked it support for

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

and only PDF in Romanian language wasn't created properly...

With PDFBox it's almost the same:

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

However as Gagravarr says, it doesn't work because of this issue PDFBOX-903 . Even with 1.6.0-SNAPSHOT version. Maybe trunk will work. I suggest you to use iText. It works there perfectly.

于 2011-05-31T11:05:52.140 に答える
1

この回答が役立つ場合があります-Latin1のみであるため、標準のタイプ1フォントの1つでは必要なことを実行できないことが確認されています

理論的には、すべてのコードポイントを処理する適切なフォントをドキュメントに埋め込み、それを使用するだけで済みます。ただし、Unicode 文字列の書き込みに関して未解決のバグが少なくとも1 つあるため、まだ機能しない可能性があります... svn トランクの最新の pdfbox も試して、役立つかどうかを確認してください!

于 2011-05-31T09:34:48.813 に答える
0

// このコードを使用してください。 setfont() が Paragraph で機能しない場合があります

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 に答える
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 に答える