【发布时间】:2011-02-16 16:28:37
【问题描述】:
如何确定 pdf 文档中文字的字体系列和字体大小?我们实际上是在尝试使用 iText 以编程方式生成 pdf 文档,但我们不确定如何找出需要生成的原始文档的字体系列和字体大小。文档属性似乎不包含此信息
【问题讨论】:
-
该问题的解决方案tex.stackexchange.com/q/1401/164050 对我也很有用。
如何确定 pdf 文档中文字的字体系列和字体大小?我们实际上是在尝试使用 iText 以编程方式生成 pdf 文档,但我们不确定如何找出需要生成的原始文档的字体系列和字体大小。文档属性似乎不包含此信息
【问题讨论】:
字体存储在目录中(我想在字体类型的子目录中)。如果您将 pdf 作为文本文件打开,您应该能够找到目录条目(它们分别以“>”开头和结尾。
在一个简单的 pdf 文件中,我发现了以下内容:
<</Type/Font/BaseFont/Helvetica-Bold/Subtype/Type1/Encoding/WinAnsiEncoding>>
因此搜索前缀应该对您有所帮助(在某些 pdf 文件中, 组件,但 '/Type /Font' 应该没问题)。
当然,这是一个手动过程,而您可能更喜欢自动过程。
另一方面,我们有时使用identifont 或what the font 来查找给我们带来问题的不常见字体(徽标字体)。
问候 纪尧姆
编辑:以下代码将查找页面中的所有字体。简而言之,您在每个页面的字典中搜索子字典“资源”,然后搜索子字典“字体”。后面的每个条目都是一个字体字典,描述一种字体。
PdfReader reader = new PdfReader(
new FileInputStream(new File("file.pdf")));
int nbmax = reader.getNumberOfPages();
System.out.println("nb pages " + nbmax);
for (int i = 1; i <= nbmax; i++) {
System.out.println("----------------------------------------");
System.out.println("Page " + i);
PdfDictionary dico = reader.getPageN(i);
PdfDictionary ressource = dico.getAsDict(PdfName.RESOURCES);
PdfDictionary font = ressource.getAsDict(PdfName.FONT);
// we got the page fonts
Set keys = font.getKeys();
Iterator it = keys.iterator();
while (it.hasNext()) {
PdfName name = (PdfName) it.next();
PdfDictionary fontdict = font.getAsDict(name);
PdfObject typeFont = fontdict.getDirectObject(PdfName.SUBTYPE);
PdfObject baseFont = fontdict.getDirectObject(PdfName.BASEFONT);
System.out.println(baseFont.toString());
}
}
名称(以下代码中的变量“名称”)是文本中用于更改字体的名称。在 PDF 中,您必须在文本旁边找到它。下面的数字是尺寸。以这里为例,它是 12 号的。(对不起,这部分仍然没有代码)。
BT
/F13 12 Tf
288 720 Td
the text to find Tj
ET
【讨论】:
根据 PDF 的不同,如果没有概述,您可以在 Adobe Illustrator 中打开它,双击文本并选择其中一些以查看它的字体系列、大小、等等
如果文本有轮廓,则使用 PATRY 建议的在线工具之一找出字体。
祝你好运
【讨论】:
如果您有 Adobe Acrobat,您可以看到里面的字体并检查对象和文本流。我在http://pdf.jpedal.org/java-pdf-blog/bid/10479/Viewing-PDF-objects写了一篇关于此的博客文章
【讨论】: