当前位置: 首页 > 面试题库 >

如何使用Java iText检查所有使用的字体是否已嵌入PDF?

茅炯
2023-03-14
问题内容

如何使用Java和iText检查PDF文件中使用的所有字体是否已嵌入文件中?我有一些现有的PDF文档,并且我想确认它们 使用嵌入式字体。

这将需要检查是否未使用PDF标准字体,并且是否将其他使用的字体嵌入文件中。


问题答案:

看一下iText in Action中的ListUsedFonts示例。

http://itextpdf.com/examples/iia.php?id=287

看起来这将打印出pdf中使用的字体以及嵌入的字体。

/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */

package part4.chapter16;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Set;
import java.util.TreeSet;

import part3.chapter11.FontTypes;

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfDictionary;
import com.itextpdf.text.pdf.PdfName;
import com.itextpdf.text.pdf.PdfReader;

public class ListUsedFonts {

    /** The resulting PDF file. */
    public static String RESULT
        = "results/part4/chapter16/fonts.txt";

    /**
     * Creates a Set containing information about the fonts in the src PDF file.
     * @param src the path to a PDF file
     * @throws IOException
     */
    public Set<String> listFonts(String src) throws IOException {
        Set<String> set = new TreeSet<String>();
        PdfReader reader = new PdfReader(src);
        PdfDictionary resources;
        for (int k = 1; k <= reader.getNumberOfPages(); ++k) {
            resources = reader.getPageN(k).getAsDict(PdfName.RESOURCES);
            processResource(set, resources);
        }
        reader.close();
        return set;
    }

    /**
     * Extracts the font names from page or XObject resources.
     * @param set the set with the font names
     * @param resources the resources dictionary
     */
    public static void processResource(Set<String> set, PdfDictionary resource) {
        if (resource == null)
            return;
        PdfDictionary xobjects = resource.getAsDict(PdfName.XOBJECT);
        if (xobjects != null) {
            for (PdfName key : xobjects.getKeys()) {
                processResource(set, xobjects.getAsDict(key));
            }
        }
        PdfDictionary fonts = resource.getAsDict(PdfName.FONT);
        if (fonts == null)
            return;
        PdfDictionary font;
        for (PdfName key : fonts.getKeys()) {
            font = fonts.getAsDict(key);
            String name = font.getAsName(PdfName.BASEFONT).toString();
            if (name.length() > 8 && name.charAt(7) == '+') {
                name = String.format("%s subset (%s)", name.substring(8), name.substring(1, 7));
            }
            else {
                name = name.substring(1);
                PdfDictionary desc = font.getAsDict(PdfName.FONTDESCRIPTOR);
                if (desc == null)
                    name += " nofontdescriptor";
                else if (desc.get(PdfName.FONTFILE) != null)
                    name += " (Type 1) embedded";
                else if (desc.get(PdfName.FONTFILE2) != null)
                    name += " (TrueType) embedded";
                else if (desc.get(PdfName.FONTFILE3) != null)
                    name += " (" + font.getAsName(PdfName.SUBTYPE).toString().substring(1) + ") embedded";
            }
            set.add(name);
        }
    }

    /**
     * Main method.
     *
     * @param    args    no arguments needed
     * @throws DocumentException 
     * @throws IOException
     */
    public static void main(String[] args) throws IOException, DocumentException {
        new FontTypes().createPdf(FontTypes.RESULT);
        Set<String> set = new ListUsedFonts().listFonts(FontTypes.RESULT);
        PrintWriter out = new PrintWriter(new FileOutputStream(RESULT));
        for (String fontname : set)
            out.println(fontname);
        out.flush();
        out.close();
    }
}


 类似资料:
  • 该PDF文件已经包含一个名为“Lato(embedded)”的嵌入式字体,编码:ANSI。 如何创建一个PDFFont对象,使我和可以使用它来绘制额外的段落?

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

  • 问题内容: 我想通过JS动态插入一些HTML内容和一些CSS url。 我有3个以上的CSS文件。我希望在将内容插入页面之前先下载它们。 有没有办法找出上述文件是否已下载? 这是应该如何工作的: 下载css文件; 下载所有css文件后显示HTML; 插入HTML后开始加载JS文件; 加载所有JS文件后触发回调; 问题答案: 您可以使用YepNope.js,YepNope允许您构建异步条件测试以查看

  • 我想检查一个对象的所有字段是否为null,或者是否使用Java 8。尝试了这里提到的不同方法,但我希望使用Java 8特性来完成。 例如: 我只想在id和name不为NULL时将person添加到列表中。因为这个人有10多个字段,所以我不想对每个字段进行空检查并添加到列表中。在这里,我从DB操作的ResultSet设置这些字段。

  • 一个类似于Iterator中的的方法,在异常抛出和布尔返回行为中(尽管没有与的约定)。 示例: 目标是在客户端代码调用此方法而不消耗流的情况下早期失败。 一个可接受的答案也可以是“没有解决方案存在”,并有充分的理由说明为什么规范不能添加这样的方法(如果有充分的理由的话)。看起来JDK流通常在其终端方法的开头有以下代码段: 因此,对于这些流,实现这样的方法似乎并不困难。

  • 问题很简单。我想限制来自不同机器/浏览器的相同登录的用户访问:只有一个实时用户会话是可能的。 库用于用户认证和管理。 当然,这可以使用简单的同步化地图等来完成。但问题是:是否为此制定了特殊机制? 这个问题的另一个变体:如何检索使用< code>apache shiro登录系统的所有主题的列表? UPD: 澄清我的问题。我的愿望是有一些这样的代码(我知道,没有这样的类异常,但这个想法必须更干净):