2015-08-27 5 views
7

Я хочу создать кнопку в PDFBOX, то есть подтвердить или сбросить кнопку, которая вызовет некоторую функцию встроенного javascript в PDF.Как создать кнопку в PDF BOX?

Как создать такую ​​кнопку в PDFBOX?

Я пробовал следующий код с фрагментом PDPushButton, но теперь он работает правильно. Здесь, когда я нажимаю на область кнопки, отображается значок метки метки и переключается на каждый щелчок. Также граница не отображается. Вместо этого я хочу отобразить обычную кнопку с меткой и границей вокруг нее.

Я использую pdfbox версию 1.8.10.

PDDocument doc = new PDDocument(); 
PDPage page = new PDPage(); 
doc.addPage(page);    

PDAcroForm acroForm = new PDAcroForm(doc); 
     doc.getDocumentCatalog().setAcroForm(acroForm); 

     PDActionJavaScript javascript = new PDActionJavaScript("function validate(index){ app.alert(index); }"); 
     doc.getDocumentCatalog().setOpenAction(javascript); 

COSDictionary cosDict = new COSDictionary(); 
      COSArray rect = new COSArray(); 
      rect.add(new COSFloat(100)); 
      rect.add(new COSFloat(10)); 
      rect.add(new COSFloat(200)); 
      rect.add(new COSFloat(60)); 

      cosDict.setItem(COSName.RECT, rect); 
      cosDict.setItem(COSName.FT, COSName.getPDFName("Btn")); // Field Type 
      cosDict.setItem(COSName.TYPE, COSName.ANNOT); 
      cosDict.setItem(COSName.SUBTYPE, COSName.getPDFName("Widget")); 
      cosDict.setItem(COSName.T, new COSString("My Btn")); 
      cosDict.setItem(COSName.V, new COSString("Validate")); 
      cosDict.setItem(COSName.DA, new COSString("/Helv 7 Tf 0 g")); 

      PDPushButton button = new PDPushButton(acroForm, cosDict); 
      button.setValue("Validate Button"); 

      PDActionJavaScript tfJs = new PDActionJavaScript("validate("+index+");"); 
      PDAnnotationAdditionalActions tfAction = new PDAnnotationAdditionalActions(); 
      tfAction.setU(tfJs); 
      button.getWidget().setActions(tfAction); 

      PDGamma colourBlack = new PDGamma(); 
      PDAppearanceCharacteristicsDictionary fieldAppearance = 
        new PDAppearanceCharacteristicsDictionary(cosDict); 
      fieldAppearance.setBorderColour(colourBlack); 
      button.getWidget().setAppearanceCharacteristics(fieldAppearance); 

      page.getAnnotations().add(button.getWidget()); 

      acroForm.getFields().add(button); 
+0

Я пробовал с PDPushButton, но я не могу установить значение текста кнопки здесь, также когда я нажал на кнопку галочки отметки кнопки. –

+0

Я предлагаю вам включить свой комментарий в вопрос (вы можете редактировать), а также включить код, который вы сделали. И укажите, какую версию вы используете. (Надеюсь, 1.8.10 или 2.0). Обратите внимание, что вызов не является новым PDPushButton, но PDFieldFactory.createField(), и это несколько сложно. –

+1

Я ничего не вижу, хотя я нашел, где он (ваш код не работает самостоятельно, документы и страницы отсутствуют). Добавьте это в свой код: cosDict.setInt (COSName.FF, 65536); это флаг для кнопки. –

ответ

5

Следующий код генерирует правильную кнопку с границами, а также правильно выполняет функцию javascript. Только проблема заключается в настройке проверки метки на кнопке. Если у кого-то есть решение, просьба указать ваши отзывы.

PDDocument doc = new PDDocument(); 
     PDPage page = new PDPage(); 
     doc.addPage(page); 

     COSDictionary acroFormDict = new COSDictionary(); 
     acroFormDict.setBoolean(COSName.getPDFName("NeedAppearances"), true); 
     acroFormDict.setItem(COSName.getPDFName("Fields"), new COSArray()); 

     PDAcroForm acroForm = new PDAcroForm(doc, acroFormDict); 
     doc.getDocumentCatalog().setAcroForm(acroForm); 

     PDActionJavaScript javascript = new PDActionJavaScript("function validate(index){ app.alert(index); }"); 
     doc.getDocumentCatalog().setOpenAction(javascript); 

     COSDictionary cosDict = new COSDictionary(); 
     COSArray rect = new COSArray(); 
     rect.add(new COSFloat(100)); 
     rect.add(new COSFloat(10)); 
     rect.add(new COSFloat(200)); 
     rect.add(new COSFloat(60)); 


     cosDict.setItem(COSName.RECT, rect); 
     cosDict.setItem(COSName.FT, COSName.getPDFName("Btn")); // Field Type 
     cosDict.setItem(COSName.TYPE, COSName.ANNOT); 
     cosDict.setItem(COSName.SUBTYPE, COSName.getPDFName("Widget")); 
     cosDict.setItem(COSName.T, new COSString("Btn"+1)); 
     cosDict.setItem(COSName.V, new COSString("Validate")); 
     cosDict.setItem(COSName.DA, new COSString("/Helv 7 Tf 0 g")); 
     cosDict.setInt(COSName.FF, 65536); 

     PDPushButton button = new PDPushButton(acroForm, cosDict); 
     button.setValue("Validate Button"); 

     PDActionJavaScript tfJs = new PDActionJavaScript("validate("+1+");"); 
     PDAnnotationAdditionalActions tfAction = new PDAnnotationAdditionalActions(); 
     tfAction.setU(tfJs); 
     button.getWidget().setActions(tfAction); 

     PDGamma colourBlack = new PDGamma(); 
     PDAppearanceCharacteristicsDictionary fieldAppearance = 
       new PDAppearanceCharacteristicsDictionary(new COSDictionary()); 
     fieldAppearance.setBorderColour(colourBlack); 
     button.getWidget().setAppearanceCharacteristics(fieldAppearance); 

     page.getAnnotations().add(button.getWidget()); 

     acroForm.getFields().add(button); 

     doc.save("/path"); 
     doc.close(); 
+1

Причина недостающего текста (вероятно) в том, что нет потока внешнего вида. Это поток, как поток контента страницы, но используется для объекта формы. Лучше всего сравнить файл с другим PDF-файлом с такой кнопкой (например, файл https://issues.apache.org/jira/browse/PDFBOX-2203) в PDFDebugger. Поле находится в объекте 51, поток внешнего вида находится в объекте 52. –

+0

"12.7.4.2.2 Кнопки Поле кнопки должно иметь тип поля Btn и флаг Pushbutton (см. Таблицу 226), установленный в единицу. кнопки не сохраняет постоянного значения, он не должен использовать записи V и DV в полевом словаре (см. таблицу 220). " –

+0

@ Тилман, я проверил образец pdf для кнопки на [issues.apache.org/jira/browse/PDFBOX-2203](http://issues.apache.org/jira/browse/PDFBOX-2203). После dubugging этого PDF, я обнаружил, что он внутренне использует тип поля Tx для текстового поля вместо Btn для Button. И после изменения кода в соответствии с этим, решение работает. –

2

Вот решение «Как установить заголовок для PDPushButton в PDFBox 2.0.0»

Для значения заголовка нужно показать для pushbutton, вы нужно вызвать setNormalCaption("captionStr") в PDAppearanceCharacteristicsDictionary.
Вот код для кнопки быстрого запуска Значение с изменением цвета текста:

PDDocument doc = new PDDocument(); 
    PDPage page = new PDPage(); 
    doc.addPage(page); 

    try { 
     COSDictionary acroFormDict = new COSDictionary(); 
     acroFormDict.setBoolean(COSName.getPDFName("NeedAppearances"), true); 
     acroFormDict.setItem(COSName.FIELDS, new COSArray()); 

     PDAcroForm acroForm = new PDAcroForm(doc, acroFormDict); 
     doc.getDocumentCatalog().setAcroForm(acroForm); 

     PDActionJavaScript javascript = new PDActionJavaScript(
       "function validate(index){ app.alert(index); }"); 
     doc.getDocumentCatalog().setOpenAction(javascript); 

     COSDictionary cosDict = new COSDictionary(); 
     COSArray rect = new COSArray(); 
     rect.add(new COSFloat(50)); 
     rect.add(new COSFloat(775)); 
     rect.add(new COSFloat(100)); 
     rect.add(new COSFloat(750)); 
     cosDict.setItem(COSName.RECT, rect); 
     cosDict.setItem(COSName.FT, COSName.getPDFName("Btn")); 
     cosDict.setItem(COSName.TYPE, COSName.ANNOT); 
     cosDict.setItem(COSName.SUBTYPE, COSName.getPDFName("Widget")); 
     cosDict.setItem(COSName.T, new COSString("ClickMe")); 
     //cosDict.setItem(COSName.V, new COSString("Click Me")); 
     cosDict.setItem(COSName.DA, new COSString("/F0 6 Tf 0 g 1 1 1 rg ")); 

     PDPushButton button = new PDPushButton(acroForm); 

     PDActionJavaScript tfJs = new PDActionJavaScript("validate("+1+");"); 
     PDAnnotationAdditionalActions tfAction = new PDAnnotationAdditionalActions(); 
     tfAction.setU(tfJs); 
     button.getWidgets().get(0).setActions(tfAction); 

    // button.setReadOnly(true); 
     button.getCOSObject().addAll(cosDict); 
     acroForm.getFields().add(button); 

     PDAnnotationWidget widget = button.getWidgets().get(0); 

     PDAppearanceCharacteristicsDictionary fieldAppearance = 
       new PDAppearanceCharacteristicsDictionary(new COSDictionary()); 
     COSArray borderColorArray = new COSArray(); 
     borderColorArray.add(new COSFloat((float) (141f/255f))); 
     borderColorArray.add(new COSFloat((float) (179f/255f))); 
     borderColorArray.add(new COSFloat((float) (226f/255f))); 
     PDColor blue = new PDColor(borderColorArray, PDDeviceRGB.INSTANCE); 
     fieldAppearance.setBorderColour(blue); 
     fieldAppearance.setBackground(blue); 
     fieldAppearance.setNormalCaption("Click Me"); 

     widget.setAppearanceCharacteristics(fieldAppearance); 
     page.getAnnotations().add(widget); 


     File file = new File("/path"); 
     System.out.println("File created"); 
     FileOutputStream fOut = new FileOutputStream(file); 
     doc.save(fOut); 
     doc.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Здесь:

cosDict.setItem(COSName.V, new COSString("Click Me")); 

И здесь:

button.setValue("Click Me"); 

не будет работать.

Для этого вам нужно добавить строку ниже:

fieldAppearance.setNormalCaption("Click Me"); 

вышеописанный пример является решением для PDFBox2.0.
В PDFBox 1.8.11, я думаю, это также сработает. :)