Как создать PDF документ из языков набора символов Unicode относительно использования сторонних шрифтов - PullRequest
1 голос
/ 31 мая 2011

Я использую PDFBox и iText , чтобы создать простой (только абзацы) 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();
}

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

Входные файлы кодируются в UTF-8 и некоторые языки набора символов Unicode, такие как русский алфавит и т. Д., Неправильно отображаются в pdf.Полагаю, шрифты в обеих библиотеках не поддерживают кодировку Unicode, и я не могу найти никакой документации о том, как добавлять и использовать сторонние шрифты.Может ли кто-нибудь помочь мне с примером?

Ответы [ 4 ]

5 голосов
/ 31 мая 2011

Если вы используете iText, у него неплохая поддержка.

В iText в действии (глава 2.2.2) вы можете прочитать больше.

Вы должны загрузить некоторые шрифты Unicode, такие как arialuni.ttf и сделать это так:

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

Однако, как говорит Гаграварр, он не работает из-за этой проблемы PDFBOX-903 . Даже с версией 1.6.0-SNAPSHOT. Может быть, багажник будет работать. Я предлагаю вам использовать iText. Там прекрасно работает.

1 голос
/ 31 мая 2011

Вы можете найти этот ответ полезным - это подтверждает, что вы не можете делать то, что вам нужно, с одним из стандартных шрифтов типа 1, так как они только Latin1

Теоретически, вам просто нужно вставить подходящий шрифт в документ, который обрабатывает все ваши кодовые точки, и использовать это. Тем не менее, есть хотя бы одна открытая ошибка с написанием строк в юникоде, так что есть вероятность, что она может пока не сработать ... Попробуйте последнюю версию pdfbox из ствола svn, хотя и посмотрите, поможет ли это!

0 голосов
/ 01 октября 2013

// использовать этот код. Иногда 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);
    }
}
0 голосов
/ 12 января 2012

В моем проекте я просто скопировал шрифт, который поддерживает 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));

Теперь вы можете использовать этот шрифт для отображения текста на разных языках.

...