How to create a PDF document from languages of Unicode char set regarding using third party Fonts

后端 未结 2 1494
走了就别回头了
走了就别回头了 2021-02-11 09:38

I\'m using PDFBox and iText to create a simple (just paragraphs) pdf document from various languages. Something like :

pdfBox:

private s         


        
相关标签:
2条回答
  • 2021-02-11 09:51

    You may find this answer helpful - it confirms that you can't do what you need with one of the standard type 1 fonts, as they're Latin1 only

    In theory, you just need to embed a suitable font into the document, which handles all your codepoints, and use that. However, there's at least one open bug with writing unicode strings, so there's a chance it might not work just yet... Try the latest pdfbox from svn trunk too though to see if it helps!

    0 讨论(0)
  • 2021-02-11 10:01

    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.

    0 讨论(0)
提交回复
热议问题