当前位置: 首页 > 知识库问答 >
问题:

查找并使用已嵌入的字体?

汪阳飇
2023-03-14

该PDF文件已经包含一个名为“Lato(embedded)”的嵌入式字体,编码:ANSI。

如何创建一个PDFFont对象,使我和可以使用它来绘制额外的段落?

共有1个答案

松阳泽
2023-03-14

首先,请注意,只有当子集包含书写文本所需的所有字形,或者字体完全嵌入到PDF中时,您才能使用这样的fond来编写额外的段落。

下面的解决方案适用于以下情况:在文档(包括嵌套XObjects)的任何页面的内容流中使用您要查找的字体来编写至少一个字形,以及在文档中没有具有类似名称的其他字体。

下面是一个小的实用程序类,它可以帮助您从文档中提取所需的字体:

private static class FontFinder implements IEventListener {
    private PdfFont suitableFont;
    private String nameToLookFor;

    private FontFinder(String nameToLookFor) {
        this.nameToLookFor = nameToLookFor;
    }

    public static PdfFont findFont(PdfDocument pdfDocument, String fontName) {
        FontFinder finder = new FontFinder(fontName);
        PdfCanvasProcessor processor = new PdfCanvasProcessor(finder);
        for (int i = 1; i <= pdfDocument.getNumberOfPages(); i++) {
            processor.processPageContent(pdfDocument.getPage(i));
        }
        return finder.suitableFont;
    }

    @Override
    public void eventOccurred(IEventData data, EventType type) {
        if (data instanceof TextRenderInfo) {
            PdfFont curFont = ((TextRenderInfo) data).getFont();
            String fontName = curFont.getFontProgram().getFontNames().getFontName();
            if (fontName != null && fontName.contains(nameToLookFor)) {
                suitableFont = curFont;
            }
        }
    }

    @Override
    public Set<EventType> getSupportedEvents() {
        return new HashSet<>(Arrays.asList(EventType.RENDER_TEXT));
    }
}

您需要以戳记模式打开pdfdocument(将pdfreaderpdfwriter传递给构造函数)。

PdfDocument pdfDocument = new PdfDocument(new PdfReader(inFile), new PdfWriter(outFile));

然后,您可以通过以下方式获取字体(确保结果不为null):

PdfFont font = FontFinder.findFont(pdfDocument, "Lato");

之后,您可以使用font实例绘制任何内容,例如将其传递给paragedivsetfont方法,等等。

 类似资料:
  • 问题内容: 如何使用Java和iText检查PDF文件中使用的所有字体是否已嵌入文件中?我有一些现有的PDF文档,并且我想确认它们 仅 使用嵌入式字体。 这将需要检查是否未使用PDF标准字体,并且是否将其他使用的字体嵌入文件中。 问题答案: 看一下iText in Action中的ListUsedFonts示例。 http://itextpdf.com/examples/iia.php?id=28

  • 请,我想知道从pdf中提取的字体是否嵌入,如何使用PDFBox实现这一点?

  • 问题内容: 我正在为旧应用程序编写测试,该应用程序的主文档中包含一个iFrame,然后在其中包含另一个iFrame。因此,层次结构为: 这是我的代码(我正在使用C#) 问题是,我无法达到第二级iFrame,即contentIFrame 有任何想法吗? 问题答案: 我目前正在类似的网站上进行测试。(主文档中的嵌套iframe) 似乎您没有使用Api中提供的 帧切换方法 。这可能是问题所在。 这是我在

  • 问题内容: 我使用此代码从Jhonny的Question中的json 对象中找到了所需的部分 数据样本 查找功能 像这样使用: 此代码是从源代码中选择匹配的片段。但是我想要的是用新值更新源对象并检索更新的源对象。 我想要类似的东西 我的密码 如果我给定但如果我将代码更改为未定义的更新,则此方法有效。 为什么呢? 问题答案: 您忘记在嵌套调用中传递newValue

  • 我正在使用嵌入式Jetty 9.2,并试图设置一个需要通过JNDI访问的Oracle数据源。我相信我已经正确地设置了这个,但是它不起作用,尽管花了一天的大部分时间在网上搜索。有人能帮忙吗? 以下是我的启动代码: 这是我的jetty-env.xml(在我的战争的WEB-INF目录中): 这是我的web.xml参考资料: 我得到两个错误。当我启动服务器时,我得到 JAVAlang.IllegalSta

  • 所以我有下面的问题。我收到一个文件,其中包含一组字体。这些字体没有嵌入到文件中。下面是一个简单的例子: 我希望将这些字体嵌入到中,这样它们就可以自包含并且始终可用。但事情似乎没那么简单。我正在使用进行处理。 我已经阅读并尝试了以下问题/答案: null