Как изменить флажок «Экспорт стоимости существующего PDF» с помощью iText - PullRequest
0 голосов
/ 28 января 2019

Я нашел хороший пример, который показывает, как установить значение экспорта флажка (среди других свойств) для нового флажка здесь (см. Пример «CreateCheckBoxList»):

https://simpledotnetsolutions.wordpress.com/2012/11/01/itextsharp-creating-form-fields/

Однако мне нужно изменить значение экспорта для существующего флажка.Я попытался изменить приведенный выше пример несколькими различными способами, но ничего не получалось.

Просто для пояснения, на изображении ниже показано свойство флажка, которое я хочу программно изменить с помощью iText:

enter image description here

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

У меня просто было такое же требование и я нашел ваш пост.Поскольку я не нашел ничего связанного, я реализовал это сам.К сожалению, это на Java, но вы можете перевести его на C #.Помните, что:

  • Я сократил код для лучшей видимости - вы должны добавить свою собственную обработку ошибок и т. Д.
  • Я предполагаю, что флажок имеет два появления: (1) длянепроверенное состояние (/ Выкл.) и состояние для проверенного состояния (2), которое может быть свободно выбрано
  • Возможно, вам также придется изменить массив / Opt, если он существует

Итак, вот код:

[...]

case (AcroFields.FIELD_TYPE_CHECKBOX):

 PdfDictionary ap = item.getWidget(i).getAsDict(PdfName.AP);
 if (ap != null) {
    PdfDictionary normalAp = ap.getAsDict(PdfName.N);
    changeAppearanceStateNames(normalAp, "NewExportValue", "Check Box106");

    PdfDictionary downAp = ap.getAsDict(PdfName.D);
    changeAppearanceStateNames(downAp, "NewExportValue", "Check Box106"););

    PdfDictionary rolloverAp = ap.getAsDict(PdfName.R);
    changeAppearanceStateNames(rolloverAp, "NewExportValue", "Check Box106");
 }
break; [...]

private void changeAppearanceStateNames(PdfDictionary appearanceSubdictionary, String newValue, String fieldname) throws NotSpecCompliantException {
    if (appearanceSubdictionary != null) {
        if(appearanceSubdictionary.size()>2) throw Exception ...

        String appearanceSubDictionaryName=null;

        //detect name for the checked value
        for(Object key : appearanceSubdictionary.getKeys()) {
            String name = PdfName.decodeName(((PdfName)key).toString());

            if(!name.equals("Off")) {
                appearanceSubDictionaryName=name;
            }
        }

        //update it
        if(appearanceSubDictionaryName!=null) {
            PdfObject appearanceSubDictionaryValue = appearanceSubdictionary.get(new PdfName(appearanceSubDictionaryName));
            appearanceSubdictionary.remove(new PdfName(appearanceSubDictionaryName));
            appearanceSubdictionary.put(new PdfName(newValue),appearanceSubDictionaryValue);
        }
        //else {
            //theoretically create a new appearance here. Details can be seen in the #RadioCheckField
            //however since only the export value should be changed it is assumed that the actual appearance dictionary does already exists
        //}
    }
}
0 голосов
/ 29 января 2019
PdfReader reader = new PdfReader(@"C:\test.pdf");
AcroFields fields = reader.AcroFields;

int i = 0;
string checkboxExportValues = "Count\tName\tExport Value\r\n";

//loop all fields in the pdf    
foreach (KeyValuePair<string, AcroFields.Item> kpv in fields.Fields)
{
    string exportValue = "";
    switch (fields.GetFieldType(kpv.Key))
    {
        //if the field is a checkbox, get the field's name and export value
        case AcroFields.FIELD_TYPE_CHECKBOX:
            AcroFields checkbox = reader.AcroFields;
            String[] values = checkbox.GetAppearanceStates(kpv.Key);

            //get the last checkbox state, which represents a selected checkbox
            foreach (String value in values)
            {
                exportValue = value;
            }
            checkboxExportValues = checkboxExportValues + i + "\t" + kpv.Key + "\t" + exportValue + "\r\n";
        break;
   }
   i++;
}
reader.Close();
File.WriteAllText(@"C:\exportValues.txt", checkboxExportValues);

/*
Sample output:
Count    Name    Export Value
1    Check Box106    Yes
2    Check Box107    Yes
3    Check Box122    1
4    Check Box127    On
5    Check Box128    2
*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...