【发布时间】:2016-03-10 08:23:40
【问题描述】:
我使用itext 库来创建 PDF 文件,因为它具有非常详细的 PDF 创建渲染功能。当用户单击按钮时,我会编写一个模板并每次都从 DB 中填充空白单元格。
我使用Icepdf 库向用户展示并获取创建的 pdf 文件的输出。
但我认为 Icepdf 存在一些字符编码问题。当 PDf 创建并由Icepdf 调用时,其中一个土耳其字符看起来像正方形。在link 可以看到土耳其语字符。所有字符均成功渲染,但图片中的第八个字符未成功渲染。
当我转到创建的 pdf 文件的文件路径(由 itext 库创建)并使用 Adobe Acrobat Reader 手动打开它时,所有字符都正确显示。但是如果以编程方式Icepdf 打开文件并显示给用户,图片中的第八个字符看起来是正方形。
我需要更改 Icepdf 的字符编码,但我还不能。阅读了很多关于字符和Icepdf 的Font 编码的文章,但我还没有成功。如果我解决了这个字符问题,我的应用程序就可以部署了。
生成的PDF文件可以下载here.
当我用 Adobe 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上的人可以下载它。
-
您的代码没有在 PDF 中嵌入字体。这可以使用 acrobat 的“属性”->“字体”选项卡(您应该检查过)轻松验证。 Acrobat 有一些应用程序嵌入的字体,它会回退到,但任何只使用 PDF 中的内容的 PDF 查看器将无法呈现您没有嵌入字体的字符。您在这里要解决的问题不是“我的代码不起作用”,而是您需要查找如何正确嵌入您要使用的字体。
标签: java pdf fonts itext icepdf