Получить значение экспорта флажка с помощью iTextSharp - PullRequest
8 голосов
/ 20 декабря 2010

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

Заранее спасибо!

Я попытался реализовать решение ниже в C # и получил следующий код:

 public string GetCheckBoxExportValue(AcroFields pdfDocument, string checkBoxFieldName)
    {
        AcroFields.Item item = pdfDocument.GetFieldItem(checkBoxFieldName);
        if (item.values.Count > 0)
        {
            PdfDictionary valueDict = item.GetValue(0);

            PdfDictionary appearanceDict = valueDict.GetAsDict(PdfName.AP);

            // if there's an appearance dict at all, one key will be "Off", and the other
            // will be the export value... there should only be two.
            if (appearanceDict != null)
            {


                foreach (PdfName curKey in appearanceDict.Keys)
                {
                    if (!PdfName.OFF.Equals(curKey))
                    {
                        return curKey.ToString(); // string will have a leading '/' character
                    }
                }
            }

            // if that doesn't work, there might be an /AS key, whose value is a name with 
            // the export value, again with a leading '/'
            PdfName curVal = valueDict.GetAsName(PdfName.AS);
            if (curVal != null)
            {
                return curVal.ToString();
            }

        }
        //return null if you get this far
            return null;

    }

Это просто возвращает "/ D" каждый раз. Я не уверен, должен ли подход быть другим в C # или я просто что-то упускаю.

Ответы [ 4 ]

12 голосов
/ 21 декабря 2010

Хорошо, вам нужно проверить низкоуровневые объекты PDF на соответствующие значения. Вы можете посмотреть указанные значения в PDF Reference (глава 12: Интерактивные функции, раздел 7: Интерактивные формы).

В частности (и на Java):

AcroFields.Item item = acroFields.getFieldItem(fldName);
PdfDictionary valueDict = item.getValue(0);

PdfDictionary appearanceDict = valueDict .getAsDict(PdfName.AP);

if (appearanceDict != null) {
  PdfDictionary normalAppearances = appearanceDict.getAsDict(PdfName.N);
  // /D is for the "down" appearances.

  // if there are normal appearances, one key will be "Off", and the other
  // will be the export value... there should only be two.
  if (normalAppearances != null) {
    Set<PdfName> keys = normalAppearances .getKeys();
    for (PdfName curKey : keys) {
      if (!PdfName.OFF.equals(curKey)) {
        return curKey.toString(); // string will have a leading '/' character
      }
    }
  }


}
// if that doesn't work, there might be an /AS key, whose value is a name with 
// the export value, again with a leading '/'
PdfName curVal = valueDict.getAsName(PdfName.AS);
if (curVal != null) {
  return curVal.toString();
}

Что-то в этом роде. Применяются обычные положения «Я только что написал это в поле ввода», но это должно быть хорошо. Я пишу большое количество низкоуровневого кода iText.

5 голосов
/ 21 февраля 2013

Лучший способ установить флажок:

    void SetCB(AcroFields fields, string F)
    {
        try
        {
            fields.SetField(F, fields.GetFieldItem(F).GetValue(0).GetAsDict(PdfName.AP).GetAsDict(PdfName.N).Keys.Single().ToString().TrimStart('/'));
        } catch { }
    }

ошибка: последовательность содержит более одного элемента

например:

       PdfReader reader = new PdfReader("c:\\qqq\\fl100Y2.pdf");// formFile);
        using (PdfStamper stamper = new PdfStamper(reader, new FileStream("c:\\qqq\\fl100Ynew.pdf", FileMode.Create)))
        {
            AcroFields fields = stamper.AcroFields;

            bool set = fields.SetFieldProperty("FillText156", "textsize", 10.0f, null);
            SetCB(fields, "CheckBox24");
            SetCB(fields, "CheckBox24by");
             fields.SetField("FillText156", "John Doe");
            // flatten form fields and close document
            stamper.FormFlattening = true;
            stamper.Close();
        }
0 голосов
/ 25 марта 2016

Я не смог получить ответ Марк, чтобы он работал на меня, потому что AppearanceDict всегда был нулевым.Вот метод, который я написал, который работает для элементов управления CheckBox и RadioButton в формах, с которыми я имею дело.

private static string GetAnswerValue(AcroFields.Item f, int i)
{
    var widg = f.GetWidget(i);
    if (widg == null)
        return null;
    var ap = widg.GetAsDict(PdfName.AP);
    if (ap == null)
        return null;

    //PdfName.D also seems to work
    var d = ap.GetAsDict(PdfName.N);
    if (d == null)
        return null;
    var e = d.Keys.FirstOrDefault(n => !n.Equals(PdfName.OFF));
    if (e == null)
        return null;
    return e.ToString().Substring(1);
}
0 голосов
/ 11 февраля 2014

Это был последний метод, который я использовал, чтобы заставить его работать на основе других:

    public string GetCheckBoxExportValue(AcroFields fields, string cbFieldName)
    {
        AcroFields.Item item = fields.GetFieldItem(cbFieldName);
        if (item.values.Count > 0)
        {
            PdfDictionary valueDict = item.values[0] as PdfDictionary;
            PdfDictionary appDict = valueDict.GetAsDict(PdfName.AP);

            if (appDict != null)
            {
                PdfDictionary normalApp = appDict.GetAsDict(PdfName.N);

                foreach (PdfName curKey in normalApp.Keys)
                {
                    if (!PdfName.OFF.Equals(curKey))
                    {
                        // string will have a leading '/' character
                        return curKey.ToString(); 
                    }
                }
            }

            PdfName curVal = valueDict.GetAsName(PdfName.AS);
            if (curVal != null)
            {
                return curVal.ToString();
            }

        }

        return null;
    }
...