【问题标题】:Icepdf special character rendering issueIcepdf 特殊字符渲染问题
【发布时间】:2016-03-10 08:23:40
【问题描述】:

我使用itext 库来创建 PDF 文件,因为它具有非常详细的 PDF 创建渲染功能。当用户单击按钮时,我会编写一个模板并每次都从 DB 中填充空白单元格。

我使用Icepdf 库向用户展示并获取创建的 pdf 文件的输出。

但我认为 Icepdf 存在一些字符编码问题。当 PDf 创建并由Icepdf 调用时,其中一个土耳其字符看起来像正方形。在link 可以看到土耳其语字符。所有字符均成功渲染,但图片中的第八个字符未成功渲染。

当我转到创建的 pdf 文件的文件路径(由 itext 库创建)并使用 Adob​​e Acrobat Reader 手动打开它时,所有字符都正确显示。但是如果以编程方式Icepdf 打开文件并显示给用户,图片中的第八个字符看起来是正方形。

我需要更改 Icepdf 的字符编码,但我还不能。阅读了很多关于字符和IcepdfFont 编码的文章,但我还没有成功。如果我解决了这个字符问题,我的应用程序就可以部署了。

生成的PDF文件可以下载here.

当我用 Adob​​e Acrobat 打开这个文件时,它看起来像这样:

当我以编程方式使用 IcePDF 打开文件时,它看起来像这样:

我还在 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); 
}

【问题讨论】:

  • 您是否嵌入了字体?那就是:您是否正确嵌入了它?你用的是哪种字体?向我们展示实际的 PDF(不是 PDF 的屏幕截图)。
  • 我在我的问题中添加了 IcePdf 查看器方法。我如何向您展示 PDF 本身?我应该将文件传输到任何免费的文件存储站点吗?
  • 大多数人都是这样做的:他们将文件放在 Dropbox、Google Drive 上……(最好是没有太多广告且没有任何恶意软件的服务),然后将文件公开,以便其他SO上的人可以下载它。
  • 文件添加到filedropper.com/hello_2
  • 您的代码没有在 PDF 中嵌入字体。这可以使用 acrobat 的“属性”->“字体”选项卡(您应该检查过)轻松验证。 Acrobat 有一些应用程序嵌入的字体,它会回退到,但任何只使用 PDF 中的内容的 PDF 查看器将无法呈现您没有嵌入字体的字符。您在这里要解决的问题不是“我的代码不起作用”,而是您需要查找如何正确嵌入您要使用的字体。

标签: java pdf fonts itext icepdf


【解决方案1】:

--- 已解决---

首先,感谢@Mike 'Pomax' Kamermans的路由器评论

在阅读了他/她的 cmets 后开始调查“我如何使用 iText 将特定字体文件嵌入 PDF” 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() 方法将文档显示在屏幕上,所有特殊字符都真实呈现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-05
    • 2012-11-08
    • 2023-04-05
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 2011-04-19
    相关资源
    最近更新 更多