英文:
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("government_form.pdf");
PDDocument formular = PDDocument.load(file);
PDDocumentCatalog pdCatalog = formular.getDocumentCatalog();
PDAcroForm pdAcroForm = pdCatalog.getAcroForm();
// get all fields in form
List<PDField> fields = pdAcroForm.getFields();
System.out.println(fields.size() + " top-level fields were found on the form");
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)field.getOnValues();
PDCheckBox Checkbox = new PDCheckBox(pdAcroForm);
}
}
}
formular.save("C:/PdfBox_Examples/Formular_ausgefüllt.pdf");
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中字段看起来像这样:
<details>
<summary>英文:</summary>
This one works for me:
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);
}
}
}
output:
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]
and I'm also able to change the fields like this:
pdAcroForm.getField("Geschlecht Antragsteller/in").setValue("inter/divers");
pdAcroForm.getField("geschlecht 2. Elternteil").setValue("inter/divers");
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>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论