原创

itext7识别formfield设置的字体

1、pdf中的字体类型

  • 附加模式,将使用到的字体打包到pdf文件本身上
  • 引用模式,建立pdf和操作系统字体文件的关联关系

image-20241204162243241

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;
        }
    }
}
正文到此结束
本文目录