我已经使用Adobe Illustrator创建了一个PDF文件,并已使用itext7 pdfreader将其加载到内存中。
该PDF文件已经包含一个名为“ Lato(Embedded)”的嵌入式字体,编码为:Ansi。
如何从中创建PDFFont对象,以便我可以使用它来绘制其他段落?
答案 0 :(得分:0)
首先请注意,只有当子集包含编写文本所需的所有字形,或者字体完全嵌入到PDF中时,您才能编写带有这种样式的其他段落。
以下解决方案适用于以下情况:要查找的字体用于在文档中任何页面的内容流中至少写入一个字形(包括嵌套的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
(将PdfReader
和PdfWriter
都传递给构造函数)。
PdfDocument pdfDocument = new PdfDocument(new PdfReader(inFile), new PdfWriter(outFile));
然后,您可以通过以下方式获取字体(确保结果不为null):
PdfFont font = FontFinder.findFont(pdfDocument, "Lato");
之后,您可以使用该font
实例绘制任何内容,例如通过将其传递给setFont
,Paragraph
等的Div
方法。