Icepdf特殊字符渲染问题
Icepdf special character rendering issue
我使用 itext
库来创建 PDF 文件,因为它有非常详细的 PDF 创建渲染函数。当用户单击按钮时,我每次都会编写一个模板并从数据库中填充空白单元格。
然后我使用 Icepdf
库向用户展示并获取创建的 pdf 文件的输出。
但我认为 Icepdf 有一些字符编码问题。当 PDf 由 Icepdf
创建和调用时,其中一个土耳其字符看起来像正方形。在此 link 可以看到土耳其语字符。所有字符均已成功渲染,但图片中的第八个字符未成功渲染。
当我转到创建的 pdf 文件(由 itext
库创建)的文件路径并使用 Adobe Acrobat Reader 手动打开它时,所有字符都正确显示。但是如果以编程方式 Icepdf
打开文件并显示给用户,图片中的第八个字符看起来是正方形。
我需要更改 Icepdf 的字符编码,但我现在还不能。阅读了许多关于 Icepdf
的字符和 Font
编码的文章,但我还没有成功。如果我解决了这个字符问题,我的应用程序就可以部署了。
生成的PDF文件可以下载here。
当我用 Adobe Acrobat 打开这个文件时,它看起来像这样:
当我以编程方式使用 IcePDF 打开文件时,它看起来像这样:
我也在 Whosebug 上阅读了一些关于此的问题和答案,但其中 none 已被接受 answer/help。
用于创建文件路径的代码:
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);
}
--- 已解决 ---
首先,感谢路由器对 @Mike 'Pomax' Kamermans
的评论
阅读 him/her 评论后开始调查“我如何使用 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()
方法将文档带到屏幕上,所有特殊字符都真实呈现。
我使用 itext
库来创建 PDF 文件,因为它有非常详细的 PDF 创建渲染函数。当用户单击按钮时,我每次都会编写一个模板并从数据库中填充空白单元格。
然后我使用 Icepdf
库向用户展示并获取创建的 pdf 文件的输出。
但我认为 Icepdf 有一些字符编码问题。当 PDf 由 Icepdf
创建和调用时,其中一个土耳其字符看起来像正方形。在此 link 可以看到土耳其语字符。所有字符均已成功渲染,但图片中的第八个字符未成功渲染。
当我转到创建的 pdf 文件(由 itext
库创建)的文件路径并使用 Adobe Acrobat Reader 手动打开它时,所有字符都正确显示。但是如果以编程方式 Icepdf
打开文件并显示给用户,图片中的第八个字符看起来是正方形。
我需要更改 Icepdf 的字符编码,但我现在还不能。阅读了许多关于 Icepdf
的字符和 Font
编码的文章,但我还没有成功。如果我解决了这个字符问题,我的应用程序就可以部署了。
生成的PDF文件可以下载here。
当我用 Adobe Acrobat 打开这个文件时,它看起来像这样:
当我以编程方式使用 IcePDF 打开文件时,它看起来像这样:
我也在 Whosebug 上阅读了一些关于此的问题和答案,但其中 none 已被接受 answer/help。
用于创建文件路径的代码:
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);
}
--- 已解决 ---
首先,感谢路由器对 @Mike 'Pomax' Kamermans
阅读 him/her 评论后开始调查“我如何使用 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()
方法将文档带到屏幕上,所有特殊字符都真实呈现。