itext7识别formfield设置的字体
1、pdf中的字体类型
- 附加模式,将使用到的字体打包到pdf文件本身上
- 引用模式,建立pdf和操作系统字体文件的关联关系
2、itext默认getFont的逻辑
formField.getFont()
这个方法有个缺陷,就是只能识别出来当前field的字体必须是附件模式的字体,否则会被降级为默认的字体Helvetica
3、如何获取引用模式设定的字体
核心是通过控件的DA属性去获取对应的设定字体
package net.gzcx.pdf;
import com.itextpdf.forms.PdfAcroForm;
import com.itextpdf.forms.fields.PdfFormField;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfName;
import com.itextpdf.kernel.pdf.PdfObject;
import com.itextpdf.kernel.pdf.PdfReader;
import java.io.IOException;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 功能说明:获取当前指定文档的设定的字体
*
* @author
* @since 2024-12-04 15:54
*/
public class GetFromFieldFont {
public static void main(String[] args) throws IOException {
String fileStr = "C:\\Users\\fengqingyang\\Desktop\\hezuo.pdf";
String fieldKey = "platform";
String pdfFormFieldFont = getPDFFormFieldFont(fileStr, fieldKey);
String fontName = getFontName(pdfFormFieldFont);
System.out.println(String.format("当前的字体是%s", fontName));
}
/**
* 获取指定pdf上指定fieldKey设定的字体
*
* @param pdfFile
* @param fieldKey
* @return
*/
private static String getPDFFormFieldFont(String pdfFile, String fieldKey) throws IOException {
PdfDocument pdfDocument = null;
PdfAcroForm acroForm = null;
try {
pdfDocument = new PdfDocument(new PdfReader(pdfFile));
acroForm = PdfAcroForm.getAcroForm(pdfDocument, false);
Map<String, PdfFormField> formFields = acroForm.getFormFields();
if (formFields == null || formFields.isEmpty()) {
return null;
}
PdfFormField pdfFormField = formFields.get(fieldKey);
if (pdfFormField == null) {
return null;
}
PdfObject pdfObject = pdfFormField.getPdfObject().get(PdfName.DA);
if (pdfObject == null) {
return null;
}
return pdfObject.toString();
} finally {
if (acroForm != null) {
acroForm.release();
}
if (pdfDocument != null) {
pdfDocument.close();
}
}
}
/**
* 示例 /KaiTi 10.5 Tf 0 g
*
* @param pdfFontInfo
* @return
*/
private static String getFontName(String pdfFontInfo) {
// 正则表达式匹配 / 和空格之间的部分
Pattern pattern = Pattern.compile("/([a-zA-Z0-9]+)");
Matcher matcher = pattern.matcher(pdfFontInfo);
if (matcher.find()) {
// 提取匹配的字体名称
String fontName = matcher.group(1);
return fontName;
} else {
return null;
}
}
}
正文到此结束