PDFBox 字段值在展平后无法显示

Posted

技术标签:

【中文标题】PDFBox 字段值在展平后无法显示【英文标题】:PDFBox field value cannot display after flatten 【发布时间】:2021-06-30 07:29:14 【问题描述】:

我有一个由 LiberOffice Draw 4.1.0.4 创建的 PDF 表单。

表单包含文本字段、复选框和单选按钮

在我为字段设置值并使用PDFBox(2.0.21)展平表单后,字段值无法显示

我认为这可能是该字段注释的外观问题,但我不知道如何使其正确

Test PDF

import org.apache.commons.lang3.StringUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
import org.apache.pdfbox.pdmodel.interactive.form.PDField;
import org.apache.pdfbox.pdmodel.interactive.form.PDTextField;

import java.io.File;

public class PdfGenerationTest 
    public static void main( String[] args ) throws Exception
        testFillValue();
    
    
    public static void testFillValue() throws Exception
        PDDocument pdDocument = PDDocument.load(new File("C:\\temp\\test.pdf"));
        
        PDAcroForm acroForm = pdDocument.getDocumentCatalog().getAcroForm();
        
        String defaultAppearance = "/Helv 12 Tf 0 0 1 rg";
        
        for(PDField field : acroForm.getFields()) 
            if (field instanceof PDTextField) 
                PDTextField textField = (PDTextField) field;
                textField.setActions(null);             
                textField.setDefaultAppearance(defaultAppearance);
            
        
        
        setFormValue(acroForm, "TextBox", "testvalue");
        setFormValue(acroForm, "radioBtn", "Yes");
        setFormValue(acroForm, "chkBox", "Yes");
        acroForm.refreshAppearances();
        acroForm.flatten();
        
        pdDocument.save("C:\\temp\\test_filled.pdf");
        pdDocument.close();
    
    
    private static void setFormValue(PDAcroForm acroForm, String key, String value) throws Exception 
        PDField f = acroForm.getField(key);        
        if (f != null) 
            if (value != null && StringUtils.isNotEmpty(value.trim())) 
                f.setValue(value);
            
        
    

【问题讨论】:

请用 2.0.24 重试 与头部版本按预期工作;更新确实就足够了。 用 2.0.24 重试并成功。谢谢 【参考方案1】:

PDAcroForm.flaten 在使用 pdfbox 2.0.24 后对我有用

<dependencies>
<dependency>
<groupId>org.apache.pdfbox</groupId>
   <artifactId>pdfbox</artifactId>
   <version>2.0.24</version>
</dependency>
<dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>fontbox</artifactId>
        <version>2.0.24</version>
</dependency>
<dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>pdfbox-examples</artifactId>
        <version>2.0.24</version>
</dependency>
</dependencies>

【讨论】:

我怀疑你需要 pdfbox-examples。

以上是关于PDFBox 字段值在展平后无法显示的主要内容,如果未能解决你的问题,请参考以下文章

PDFBOX Flatten Acro-form 导致文本从原始位置移位

使用 PDFBOX 生成的 PDF 中未正确显示已保存的文本字段值

Apache PDFBox 删除字符之间的空格

选择下拉菜单后,动态输入字段无法正确显示

无法访问 json 对象属性和值在 rails 视图中显示为未定义

将 ORDER BY 语句添加到查询而不展平结果会导致“无法查询重复字段的叉积”