PDFBox 中有一种方法可以访问 PDRadioButton 或 PDCheckBox 的可能选项吗?

huangapple go评论68阅读模式
英文:

Is there a way to access the possible options of a PDRadioButton or PDCheckBox in Pdfbox?

问题

我目前正在研究PDFBox,并尝试通过枚举PDF文档中的所有PDFields来以编程方式确定字段的可能值。在另一个帖子中,有用户推荐了一个解决方案,使用acroForm.getField("字段名称").getOnValues(),但是类PDField中没有定义"getOnValues()"方法,这个方法是由acroForm.getField(string)调用的。是否有一种方法可以访问实际的值,从而设置一个(例如)随机值?

我的当前尝试主要围绕尝试访问getOnValues()方法,该方法仅在PDButton中定义。我尝试加载了一个政府文件的PDF文件,其中有许多带有各自名称和值的字段,并尝试随机选择一个值,但是该类和方法似乎不允许访问PDButton的可能值。

public static void main(String args[]) throws IOException {
              
    // 创建PDF文档对象
    PDDocument document = new PDDocument();
    
    File file = new File("government_form.pdf");
    PDDocument formular = PDDocument.load(file);
    PDDocumentCatalog pdCatalog = formular.getDocumentCatalog();
    PDAcroForm pdAcroForm = pdCatalog.getAcroForm();
    
    // 获取表单中的所有字段
    List<PDField> fields = pdAcroForm.getFields();
    System.out.println(fields.size() + " 在表单中找到顶级字段");
    
    for (PDField field : fields) {
        if (!(field instanceof PDNonTerminalField)) {
            switch (field.getClass().getName()) {
                case "org.apache.pdfbox.pdmodel.interactive.form.PDCheckBox":
                    String fieldname = field.getPartialName();
                    Set<String> OnValues = new HashSet<String>();
                    // 这里缺少了获取PDCheckBox的值的代码
                    PDCheckBox Checkbox = new PDCheckBox(pdAcroForm);
            }
        }
    }
    
    formular.save("C:/PdfBox_Examples/Formular_ausgefüllt.pdf");
    formular.close();
}

请注意,在代码中有一部分缺少获取PDCheckBox的值的代码,你需要根据文档的要求来获取可能的值。

英文:

I am currently looking into pdfbox and trying to programmaticaly determine the possible values of fields while enumerating through all the PDFields in a pdf document. In another post a user recommended a solution with acroForm.getField("Nameoffield").getOnValues() but the method "getOnValues()" is not defined in the class PDField, which is called by acroForm.getField(string). Is there a way to access the actual values and therefore set a (for example) random value?

My current tries revolved around trying to access said getOnValues() method, which is defined only for PDButton. I tried loading a pdf file of a government document, which has many fields with respective names and values, and tried to randomly select one of the values, yet the class and methods don't seem to allow accessing the possible values of a PDButton.

public static void main (String args[]) throws IOException {
                       
              // Creating PDF document object 
              PDDocument document = new PDDocument();
                      
              File file = new File(&quot;government_form.pdf&quot;);
              PDDocument formular = PDDocument.load(file);
              PDDocumentCatalog pdCatalog = formular.getDocumentCatalog();
              PDAcroForm pdAcroForm = pdCatalog.getAcroForm();
                      
              // get all fields in form
              List&lt;PDField&gt; fields = pdAcroForm.getFields();
              System.out.println(fields.size() + &quot; top-level fields were found on the form&quot;);
                      
              for (PDField field : fields) {
                    if (!(field instanceof PDNonTerminalField)) {
                         switch (field.getClass().getName()){
                         case &quot;org.apache.pdfbox.pdmodel.interactive.form.PDCheckBox&quot;:
                             String fieldname = field.getPartialName();
                             Set&lt;String&gt; OnValues = new HashSet&lt;String&gt;();
                             (PDCheckBox)field.getOnValues();
                              PDCheckBox Checkbox = new PDCheckBox(pdAcroForm);
                          }
                              
                     }
                          
               }
   
               formular.save(&quot;C:/PdfBox_Examples/Formular_ausgef&#252;llt.pdf&quot;);
               formular.close();
        }

答案1

得分: 1

以下是翻译的代码部分:

这个对我有用

public static void main(String[] args) throws IOException
{
    PDDocument doc = PDDocument.load(new URL("https://www.sozialversicherung.at/cdscontent/load?contentid=10008.638102&version=1487847004").openStream());
    PDDocumentCatalog pdCatalog = doc.getDocumentCatalog();
    PDAcroForm pdAcroForm = pdCatalog.getAcroForm();

    for (PDField field : pdAcroForm.getFieldTree())
    {
        if (field instanceof PDButton)
        {
            Set<String> onValues = ((PDButton) field).getOnValues();
            System.out.println(field.getFullyQualifiedName() + ": " + onValues);
        }
    }
}

输出:

Geschlecht Antragsteller/in: [weiblich, männlich, inter/divers]
postanweisung: [Ja]
geschlecht 2. Elternteil: [weiblich, männlich, inter/divers]
Famlienstand Antragsteller/in: [verheiratet/in eingetragener Partnerschaft lebend, Lebensgemeinschaft, alleinstehend]
familienstand 2. Elternteil: [verheiratet/in eingetragener Partnerschaft lebend, Lebensgemeinschaft, alleinstehend]
Weitere Wohnadressen Antragsteller: [ja, nein]
weitere Wohnadressen 2. Elternteil: [ja, nein]
kaiserschnitt: [ja, nein]
Kinder: [ehelich, unehelich]
Wahlkinder: [Ja]
Pflegekinder: [Ja]
Mehrlingsgeburt: [Auswahl1, Auswahl2, Auswahl3, Auswahl4]
Obsorge kind: [ja, Auswahl4]
obsorge mehrlling1: [Auswahl1, Auswahl2, Auswahl3, Auswahl4, Auswahl5]
obsorge mehrlling2: [Auswahl1, Auswahl2, Auswahl3, Auswahl4, Auswahl5]
obsorge mehrlling3: [Auswahl1, Auswahl2, Auswahl3, Auswahl4, Auswahl5]
Systemwahl: [Auswahl1, Auswahl2, Auswahl3]
5a Dauer von: [ja]
5b Variante: [Auswahl1, Auswahl2, Auswahl3]
5b dauer von: [ja]
5a Dauer bis: [ja]
5b dauer bis: [Auswahl1, Auswahl2]
5c System früher gewählt bis: [Auswahl1, Auswahl2]
gemeinsamer Wohnsitz: [ja, nein]
6 weitere angaben: [ja, Auswahl2]
berufsgruppe: [Angestellte/r, Selbständige/r, Schüler/in, Arbeitslosengeldbezieher/in, Arbeiter/in, Vertragsbedienstete/r , Bauer/Bäuerin, Student/in, Hausfrau/Hausmann, Beamter/Beamtin, Notstandshilfebezieher/in, Freie/r Dienstnehmer/in]
7e ausländische leistung 2. Elternteil: [ja, nein]
einkünfte: [ja, nein]
einkünfte4: [ja, nein]
einkünfte1: [ja, nein]
einkünfte2: [ja, nein]
einkünfte3: [ja, nein]
einkünfte5: [ja, nein]
einkünfte6: [ja, nein]
einkünfte7: [ja, nein]
7a unselbständig antragsteller: [ja, nein]
7a unselbständig 2. elternteil: [ja, nein]
7a karenz antragsteller: [ja, nein]
7b landwirschaftliche tätigkeit antragsteller: [ja, nein]
7b gewerbe ruhend antragsteller: [ja, nein]
7c alv Antragsteller: [ja, nein]
7d pension antragsteller: [ja, nein]
7e ausländische leistung antragsteller: [ja, nein]
7a karenz 2. Elternteil: [ja, nein]
7b landwirschaftliche tätigkeit 2. elternteil: [ja, nein]
7b gewerbe ruhend 2. Elternteil: [ja, nein]
7c alv 2. Elternteil: [Auswahl1, Auswahl2]
7d pension 2. Elternteil: [ja, nein]
8 erinnerung: [ja, nein]
8 einverstanden: [ja, nein]

我还可以像这样更改字段:

pdAcroForm.getField("Geschlecht Antragsteller/in").setValue("inter/divers");
pdAcroForm.getField("geschlecht 2. Elternteil").setValue("inter/divers");

保存后,在Adobe Reader中字段看起来像这样:

PDFBox 中有一种方法可以访问 PDRadioButton 或 PDCheckBox 的可能选项吗?


<details>
<summary>英文:</summary>

This one works for me:

    public static void main(String[] args) throws IOException
    {
        PDDocument doc = PDDocument.load(new URL(&quot;https://www.sozialversicherung.at/cdscontent/load?contentid=10008.638102&amp;version=1487847004&quot;).openStream());
        PDDocumentCatalog pdCatalog = doc.getDocumentCatalog();
        PDAcroForm pdAcroForm = pdCatalog.getAcroForm();

        for (PDField field : pdAcroForm.getFieldTree())
        {
            if (field instanceof PDButton)
            {
                Set&lt;String&gt; onValues = ((PDButton) field).getOnValues();
                System.out.println(field.getFullyQualifiedName() + &quot;: &quot; + onValues);
            }
        }
    }

output:

	Geschlecht Antragsteller/in: [weiblich, m&#228;nnlich, inter/divers]
	postanweisung: [Ja]
	geschlecht 2. Elternteil: [weiblich, m&#228;nnlich, inter/divers]
	Famlienstand Antragsteller/in: [verheiratet/in eingetragener Partnerschaft lebend, Lebensgemeinschaft, alleinstehend]
	familienstand 2. Elternteil: [verheiratet/in eingetragener Partnerschaft lebend, Lebensgemeinschaft, alleinstehend]
	Weitere Wohnadressen Antragsteller: [ja, nein]
	weitere Wohnadressen 2. Elternteil: [ja, nein]
	kaiserschnitt: [ja, nein]
	Kinder: [ehelich, unehelich]
	Wahlkinder: [Ja]
	Pflegekinder: [Ja]
	Mehrlingsgeburt: [Auswahl1, Auswahl2, Auswahl3, Auswahl4]
	Obsorge kind: [ja, Auswahl4]
	obsorge mehrlling1: [Auswahl1, Auswahl2, Auswahl3, Auswahl4, Auswahl5]
	obsorge mehrlling2: [Auswahl1, Auswahl2, Auswahl3, Auswahl4, Auswahl5]
	obsorge mehrlling3: [Auswahl1, Auswahl2, Auswahl3, Auswahl4, Auswahl5]
	Systemwahl: [Auswahl1, Auswahl2, Auswahl3]
	5a Dauer von: [ja]
	5b Variante: [Auswahl1, Auswahl2, Auswahl3]
	5b dauer von: [ja]
	5a Dauer bis: [ja]
	5b dauer bis: [Auswahl1, Auswahl2]
	5c System fr&#252;her gew&#228;hlt bis: [Auswahl1, Auswahl2]
	gemeinsamer Wohnsitz: [ja, nein]
	6 weitere angaben: [ja, Auswahl2]
	berufsgruppe: [Angestellte/r, Selbst&#228;ndige/r, Sch&#252;ler/in, Arbeitslosengeldbezieher/in, Arbeiter/in, Vertragsbedienstete/r , Bauer/B&#228;uerin, Student/in, Hausfrau/Hausmann, Beamter/Beamtin, Notstandshilfebezieher/in, Freie/r Dienstnehmer/in]
	7e ausl&#228;ndische leistung 2. Elternteil: [ja, nein]
	eink&#252;nfte: [ja, nein]
	eink&#252;nfte4: [ja, nein]
	eink&#252;nfte1: [ja, nein]
	eink&#252;nfte2: [ja, nein]
	eink&#252;nfte3: [ja, nein]
	eink&#252;nfte5: [ja, nein]
	eink&#252;nfte6: [ja, nein]
	eink&#252;nfte7: [ja, nein]
	7a unselbst&#228;ndig antragsteller: [ja, nein]
	7a unselbst&#228;ndig 2. elternteil: [ja, nein]
	7a karenz antragsteller: [ja, nein]
	7b landwirschaftliche t&#228;tigkeit antragsteller: [ja, nein]
	7b gewerbe ruhend antragsteller: [ja, nein]
	7c alv Antragsteller: [ja, nein]
	7d pension antragsteller: [ja, nein]
	7e ausl&#228;ndische leistung antragsteller: [ja, nein]
	7a karenz 2. Elternteil: [ja, nein]
	7b landwirschaftliche t&#228;tigkeit 2. elternteil: [ja, nein]
	7b gewerbe ruhend 2. Elternteil: [ja, nein]
	7c alv 2. Elternteil: [Auswahl1, Auswahl2]
	7d pension 2. Elternteil: [ja, nein]
	8 erinnerung: [ja, nein]
	8 einverstanden: [ja, nein]

and I&#39;m also able to change the fields like this:

    pdAcroForm.getField(&quot;Geschlecht Antragsteller/in&quot;).setValue(&quot;inter/divers&quot;);
    pdAcroForm.getField(&quot;geschlecht 2. Elternteil&quot;).setValue(&quot;inter/divers&quot;);

after saving, the fields look like this in Adobe Reader:

[![enter image description here][1]][1]


  [1]: https://i.stack.imgur.com/UULpd.png

</details>



huangapple
  • 本文由 发表于 2023年4月4日 17:57:10
  • 转载请务必保留本文链接:https://go.coder-hub.com/75928005.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定