如何测试我的字体是不是在 pdf 中正确呈现?

Posted

技术标签:

【中文标题】如何测试我的字体是不是在 pdf 中正确呈现?【英文标题】:How can I test if my font is rendered correctly in pdf?如何测试我的字体是否在 pdf 中正确呈现? 【发布时间】:2016-05-09 18:03:03 【问题描述】:

在jasper报表中使用不同字体时,需要使用font-extensions。

但是,如果字体未正确呈现,有没有一种方法可以测试 pdf 是否支持该字体,以便我可以了解问题是否与我的字体扩展或我的.ttf 字体?

从 jasper 报告导出为 pdf 时字体的不正确呈现是一个常见问题示例 Jasper Reports PDF doesn't export cyrillic values,如清单点 1 所示,使用字体扩展并不总是足够的,字体还需要由pdf生成库并能够呈现实际字符。这就是为什么我决定通过这个 Q-A 风格的问题,以便未来的用户在点击清单 1 时可以参考如何快速测试字体。

【问题讨论】:

【参考方案1】:

由于 jasper 报告使用 itext 库,因此测试您的字体是否会在 pdf 中正确呈现的最简单方法是直接使用 itext 进行测试。

示例程序*,改编自iText: Chapter 11: Choosing the right font

import java.io.FileOutputStream;
import java.io.IOException;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.ColumnText;
import com.lowagie.text.pdf.PdfWriter;

public class FontTest 

    /** The resulting PDF file. */
    public static final String RESULT = "fontTest.pdf";
    /** the text to render. */
    public static final String TEST = "Test to render this text with the turkish lira character \u20BA";

    public void createPdf(String filename) throws IOException, DocumentException 
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
        document.open();
        BaseFont bf = BaseFont.createFont(
            "pathToMyFont/myFont.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font font = new Font(bf, 20);
        ColumnText column = new ColumnText(writer.getDirectContent());
        column.setSimpleColumn(36, 730, 569, 36);
        column.addElement(new Paragraph(TEST, font));
        column.go();
        document.close();
    

    public static void main(String[] args) throws IOException, DocumentException 
        new FontTest().createPdf(RESULT);
    

一些注释(见示例):

要呈现特殊字符,请使用它的编码值示例 \u20BA 避免文件编码类型问题。 考虑始终使用 Unicode 编码,这是推荐的方法 在较新的 PDF 标准(PDF/A、PDF/UA)中,您可以混合使用 不同的编码类型,唯一的缺点是稍微 更大的文件大小。

结论:

如果您的字体在“fontTest.pdf”中正确呈现,则您有一个 jasper 报告中的字体扩展存在问题。

如果您的字体在“fontTest.pdf”中未正确呈现,则有 在 jasper 报告中您无能为力,您需要找到另一种字体。


*最新的 jasper-reports 发行版使用特殊版本 itext-2.1.7,此版本中的导入为 com.lowagie.text,如果您使用更高版本,则导入为 com.itextpdf.text,如改编示例中所示。

【讨论】:

对于可能阅读此源代码示例的任何人,如果您想节省访问原始源代码提供的链接的时间,类的正确包是 com.itextpdf.text.*(有也是一个 com.lowagie.text.*)。 @madtyn 谢谢,我添加了导入,注意 jasper-reports 使用的是 itext-2.1.7 的特殊版本,使用最新 jasper-report 分发的正确导入是 com.lowagie.text,但确实如此归属于后面的 itext 代码。 顺便说一句,我理解如果出现了前面的文字,而最后的土耳其字符没有出现,我应该得到另一种字体,不是吗?我在哪里得到它? 互联网(谷歌有一些庞大的字体,几乎可以渲染所有语言),您是否尝试过与 jasper 报告“DejaVu Sans”等一起分发的字体?,请检查您是否已对土耳其字符进行编码(请参阅注意) @madtyn 例如google.com/get/noto,但在我知道 dejavu-serif 呈现土耳其里拉的事实之前,我会尝试使用 jasper-reports 字体(参见 maven 发行版),谷歌字体是巨大的

以上是关于如何测试我的字体是不是在 pdf 中正确呈现?的主要内容,如果未能解决你的问题,请参考以下文章

使用 react-testing-library 时如何测试组件是不是使用正确的道具呈现?

打印到 PDF:文本呈现不正确

Dompdf-Laravel Unicode 字符无法正确呈现

在 PHP 中创建 code128 条形码,使用字体而不是将其呈现为图像

字体(Myanmar3)无法在 iText 中正确呈现

如何在页面呈现期间测试是不是存在 JSF 导航案例