2015-12-05 154 views
2

我使用itext庫來創建PDF文件,因爲PDF創建具有非常詳細的渲染功能。當用戶點擊按鈕時,我會寫一個模板並每次填寫DB中的空白單元格。Icepdf特殊字符渲染問題

比我用Icepdf庫顯示給用戶和輸出創建的PDF文件。

但Icepdf有一些字符編碼問題,我認爲。當PDf創建並由Icepdf調用時,土耳其人的一個字符看起來像方塊。在這link可以看到土耳其字符。所有字符都成功呈現,但圖片中的第八個字符不是。

當我去創建的pdf文件的文件路徑(由itext庫創建),並用Adobe Acrobat Reader手動打開所有字符顯示正確。但是,如果編程Icepdf打開文件並顯示給用戶,圖片中的第八個字符看起來像方塊。

我需要改變Icepdf的字符編碼,但我還不能。閱讀很多關於字符的文章和Font編碼的Icepdf,但我還沒有成功。如果我解決了這個問題,我的應用程序就可以部署了。

生成的PDF文件可以下載here

當我打開這個文件與Acrobat它看起來像這樣:

Adobe View

當我打開與IcePDF文件programaticly它看起來像THI:

IcePdf View

此外,我在Stackoverflow上閱讀一些關於這個問題和答案,但他們都沒有一個接受的答案/幫助。

代碼用於創建文件路徑:

File fUrl = new File(CreateAndViewPdf 
        .class 
        .getProtectionDomain() 
        .getCodeSource() 
        .getLocation() 
        .getPath() 
      ); 

String path = fUrl 
       .toString() 
       .substring(0,fUrl.toString().lastIndexOf(File.separator)) 
       .replace("%20", " ") + "\\hello.pdf"; 

代碼爲createPdf()方法:

public void createPdf()throws DocumentException, IOException { 
    BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, "ISO-8859-9", BaseFont.EMBEDDED); 
    Document document = new Document(PageSize.A5); 
    PdfWriter.getInstance(document, new FileOutputStream(path)); 
    document.setMargins(10, 10, 10, 10); 
    document.setMarginMirroring(true); 
    document.open(); 

    Font font = new Font(bf); 
    PdfPCell cell; 
    PdfPTable table = new PdfPTable(2); 

    font = new Font(bf); 
    font.setSize(15); 
    font.setStyle("bold"); 
    cell = new PdfPCell(new Phrase("Sender\n"+"Information", font)); 
    cell.setPaddingBottom(7); 
    cell.setHorizontalAlignment(Element.ALIGN_CENTER); 
    cell.setVerticalAlignment(Element.ALIGN_MIDDLE); 
    table.addCell(cell); 

    font = new Font(bf); 
    font.setSize(12); 
    font.setStyle("normal"); 
    cell = new PdfPCell(new Phrase("â ç ğ ı İ î ö ş ü û\n\n"+"Â Ç Ğ I İ Î Ö Ş Ü Û",font)); 
    cell.setPaddingBottom(7); 
    cell.setVerticalAlignment(Element.ALIGN_MIDDLE); 
    cell.setHorizontalAlignment(Element.ALIGN_CENTER); 
    table.addCell(cell); 

    table.setWidths(new int[]{50,200}); 
    table.setWidthPercentage(100); 
    table.setSpacingAfter(10); 
    table.setSpacingBefore(10); 

    document.add(table); 
    document.close(); 
} 

代碼爲viewPdf()方法:

public void viewPdf(String fileP)throws IOException, InterruptedException { 
    String filePath = fileP; 
    SwingController controller = new SwingController(); 
    SwingViewBuilder factory = new SwingViewBuilder(controller); 
    JPanel viewerComponentPanel = factory.buildViewerPanel(); 
    controller.getDocumentViewController().setAnnotationCallback(
     new org.icepdf.ri.common.MyAnnotationCallback(
       controller.getDocumentViewController())); 
    Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); 
    CreateAndViewPdf.this.getContentPane().add(viewerComponentPanel); 
    CreateAndViewPdf.this.setSize(new Dimension(screen.width/2,screen.height)); 
    CreateAndViewPdf.this.setLocationRelativeTo(null); 
    controller.openDocument(filePath); 
} 
+0

您是否嵌入了字體?那就是:你是否正確地嵌入了它?你使用哪種字體?向我們展示實際的PDF(不是PDF的屏幕截圖)。 –

+0

我在我的問題中添加了IcePdf查看器方法。我如何向您展示PDF本身?我應該將文件傳輸到任何免費的文件存儲網站? –

+0

這就是大多數人的做法:他們將文件放在Dropbox,Google Drive,...(最好是沒有太多廣告且沒有任何惡意軟件的服務),並且公開該文件,以便其他人可以下載它。 –

回答

1

---解決---

首先,感謝您對@Mike 'Pomax' Kamermans

路由器評論閱讀後,他/她的評論開始調查「我怎麼能spesific字體文件嵌入到PDF的iText與」 1-2天后,我發現就像下面的解決方案;

轉到Windows Control Panel\Appearance and Personalization\Fonts並將times.ttf(它測試了所有特殊字符支持的字體)文件複製到我的Java應用程序resources容器。

比我在我的createPDF方法的頂部添加下面的行。

Font fontBase = FontFactory.getFont("/resources/times.ttf", 
            BaseFont.IDENTITY_H, 
            BaseFont.EMBEDDED, 
            0.8f, Font.NORMAL, 
            BaseColor.BLACK); 
BaseFont bf = fontBase.getBaseFont(); 

在此之後,viewPdf()方法獲取文檔與所有特殊字符忠實地呈現畫面。