Javascript 使用PDFBox 2.x在PDF上放置一个按钮

Javascript 使用PDFBox 2.x在PDF上放置一个按钮,javascript,java,button,pdfbox,acrofields,Javascript,Java,Button,Pdfbox,Acrofields,我希望有人能帮我解决用PdfBox 2.x创建的PDF上的按钮和文本字段的问题 我尝试在我的页面上放置一个按钮,该按钮使用Javascript函数在文本字段中设置日期。那很好 然后,我尝试将Textfield和按钮放在一个有多个页面的文档中,这样Textfield和按钮就会出现在每一页上,但这样,页面上的按钮只会将日期写入按钮所在页面上的Textfield,我单击了 从那以后,我收到了一个问题,第一页上的按钮对第一页上的文本字段做出了反应,但是第一页是唯一一个按钮做出反应的页面 然后我保存了4个

我希望有人能帮我解决用PdfBox 2.x创建的PDF上的按钮和文本字段的问题

我尝试在我的页面上放置一个按钮,该按钮使用Javascript函数在文本字段中设置日期。那很好

然后,我尝试将Textfield和按钮放在一个有多个页面的文档中,这样Textfield和按钮就会出现在每一页上,但这样,页面上的按钮只会将日期写入按钮所在页面上的Textfield,我单击了

从那以后,我收到了一个问题,第一页上的按钮对第一页上的文本字段做出了反应,但是第一页是唯一一个按钮做出反应的页面

然后我保存了4个文档,每个文档一页,每个文档都很好地工作。 但当最后我将4个文档合并为一个4页的文档时,我遇到了与以前相同的问题

谁能告诉我,这里有什么问题吗

谢谢 托马斯

以下是我的Java代码:

import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSFloat;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.cos.COSString;
import org.apache.pdfbox.io.MemoryUsageSetting;
import org.apache.pdfbox.multipdf.PDFMergerUtility;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.color.PDColor;
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
import org.apache.pdfbox.pdmodel.interactive.action.PDActionJavaScript;
import org.apache.pdfbox.pdmodel.interactive.action.PDAnnotationAdditionalActions;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceCharacteristicsDictionary;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream;
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
import org.apache.pdfbox.pdmodel.interactive.form.PDPushButton;
import org.apache.pdfbox.pdmodel.interactive.form.PDTextField;

public class ScriptButton {

public static void main(String[] args) throws IOException {

    List<PDDocument> aDocList = new ArrayList<PDDocument>();

    String destall = ".\\DS216J\\home\\01Privat\\Script_Button_all.pdf";
    DecimalFormat DFMM = new DecimalFormat("00");

    for (int i = 0; i < 4; i++) {

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

        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);

        PDAnnotationAdditionalActions buttonAction1 = null;
        PDActionJavaScript javascript = null;
        PDActionJavaScript tfJs = null;

        String iStr = DFMM.format(i);
        String dest = ".\\DS216J\\home\\01Privat\\Script_Button_" + iStr
                + ".pdf";

        PDFont font = PDType1Font.HELVETICA;
        PDResources resources = new PDResources();
        resources.put(COSName.getPDFName("Helvetica"), font);
        acroForm.setDefaultResources(resources);

        PDAppearanceStream pdAppearanceStream = new PDAppearanceStream(doc);
        pdAppearanceStream.setResources(resources);

        PDTextField textField = new PDTextField(acroForm);
        textField.setPartialName("SampleField-" + iStr);

        String defaultAppearance = "/Helv 24 Tf 0 0 0 rg";
        textField.setDefaultAppearance(defaultAppearance);

        textField.setMultiline(true);
        textField.setValue("Click to get Date");

        acroForm.getFields().add(textField);

        PDAnnotationWidget fieldwidget = textField.getWidgets().get(0);
        PDRectangle rect = new PDRectangle(50, 600, 300, 70);
        fieldwidget.setRectangle(rect);
        fieldwidget.setPage(page);

        PDAppearanceCharacteristicsDictionary fieldAppearance = new PDAppearanceCharacteristicsDictionary(
                new COSDictionary());
        fieldAppearance.setBorderColour(new PDColor(
                new float[] { 0, 0, 0 }, PDDeviceRGB.INSTANCE));
        fieldAppearance.setBackground(new PDColor(new float[] { 1, 1, 1 },
                PDDeviceRGB.INSTANCE));
        fieldwidget.setAppearanceCharacteristics(fieldAppearance);

        fieldwidget.setPrinted(true);

        page.getAnnotations().add(fieldwidget);

        COSDictionary cosDict1 = new COSDictionary();
        COSArray buttonRect1 = new COSArray();
        buttonRect1.add(new COSFloat(50));
        buttonRect1.add(new COSFloat(575));
        buttonRect1.add(new COSFloat(150));
        buttonRect1.add(new COSFloat(550));

        cosDict1.setItem(COSName.RECT, buttonRect1);
        cosDict1.setItem(COSName.FT, COSName.getPDFName("Btn")); // Field
                                                                    // Type
        cosDict1.setItem(COSName.TYPE, COSName.ANNOT);
        cosDict1.setItem(COSName.SUBTYPE, COSName.getPDFName("Widget"));
        cosDict1.setItem(COSName.T, new COSString("Datum anzeigen"));
        cosDict1.setItem(COSName.DA,
                new COSString("/F0 6 Tf 0 g 1 1 1 rg "));

        PDPushButton button1 = new PDPushButton(acroForm);
        javascript = new PDActionJavaScript("function date" + iStr
                + "() {var fld" + iStr + " = this.getField('SampleField-"
                + iStr + "'); fld" + iStr
                + ".value = util.printd('dd mmmm yyyy',new Date());}");

        doc.getDocumentCatalog().setOpenAction(javascript);

        tfJs = new PDActionJavaScript("date" + iStr + "();");
        buttonAction1 = new PDAnnotationAdditionalActions();

        buttonAction1.setU(tfJs);
        button1.getWidgets().get(0).setActions(buttonAction1);

        button1.getCOSObject().addAll(cosDict1);
        acroForm.getFields().add(button1);

        PDAnnotationWidget buttonWidget1 = button1.getWidgets().get(0);

        PDAppearanceCharacteristicsDictionary buttonFieldAppearance = 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);
        buttonFieldAppearance.setBorderColour(blue);
        buttonFieldAppearance.setBackground(blue);
        buttonFieldAppearance.setNormalCaption("Felder löschen");

        buttonWidget1.setAppearanceCharacteristics(buttonFieldAppearance);
        page.getAnnotations().add(buttonWidget1);

        File file = new File(dest);
        file.getParentFile().mkdirs();

        doc.save(dest);
        doc.close();

        aDocList.add(doc);
    }

    PDDocument aDocWithallPages = new PDDocument();
    PDFMergerUtility PDFmerger = new PDFMergerUtility();

    PDFmerger.setDestinationFileName(destall);

    int i = 0;
    for (Iterator<PDDocument> iterator = aDocList.iterator(); iterator
            .hasNext();) {
        iterator.next();

        String iStr = DFMM.format(i);
        File newFile = new File(".\\DS216J\\home\\01Privat\\Script_Button_"
                + iStr + ".pdf");
        PDFmerger.addSource(newFile);

        i = i + 1;
    }

    PDFmerger.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());

    aDocWithallPages.close();

}
导入java.io.File;
导入java.io.IOException;
导入java.text.DecimalFormat;
导入java.util.ArrayList;
导入java.util.Iterator;
导入java.util.List;
导入org.apache.pdfbox.cos.COSArray;
导入org.apache.pdfbox.cos.cosdirectionary;
导入org.apache.pdfbox.cos.COSFloat;
导入org.apache.pdfbox.cos.COSName;
导入org.apache.pdfbox.cos.coString;
导入org.apache.pdfbox.io.memoryUsage设置;
导入org.apache.pdfbox.multipdf.PDFMergerUtility;
导入org.apache.pdfbox.pdmodel.PDDocument;
导入org.apache.pdfbox.pdmodel.PDPage;
导入org.apache.pdfbox.pdmodel.PDResources;
导入org.apache.pdfbox.pdmodel.common.PDRectangle;
导入org.apache.pdfbox.pdmodel.font.PDFont;
导入org.apache.pdfbox.pdmodel.font.PDType1Font;
导入org.apache.pdfbox.pdmodel.graphics.color.PDColor;
导入org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
导入org.apache.pdfbox.pdmodel.interactive.action.PDActionJavaScript;
导入org.apache.pdfbox.pdmodel.interactive.action.PDAnnotationAdditionalActions;
导入org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget;
导入org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceCharacteristicsDictionary;
导入org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream;
导入org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
导入org.apache.pdfbox.pdmodel.interactive.form.pdputton;
导入org.apache.pdfbox.pdmodel.interactive.form.PDTextField;
公共类脚本按钮{
公共静态void main(字符串[]args)引发IOException{
List aDocList=new ArrayList();
字符串destall=“..\\DS216J\\home\\01Privat\\Script\u Button\u all.pdf”;
DecimalFormat DFMM=新的DecimalFormat(“00”);
对于(int i=0;i<4;i++){
PDDocument doc=新的PDDocument();
PDPage page=新PDPage();
文件添加页(第页);
COSDictionary acroFormDict=新的COSDictionary();
肢端肥大症
.setBoolean(COSName.getPDFName(“NeedAppearances”),true;
setItem(COSName.FIELDS,新的COSArray());
PDAcroForm acroForm=新的PDAcroForm(文档,acroFormDict);
doc.getDocumentCatalog().setAcroForm(acroForm);
PDAnnotationAdditionalActions按钮Naction1=null;
PDActionJavaScript=null;
PDActionJavaScript-tfJs=null;
字符串iStr=DFMM.format(i);
String dest=“.\\DS216J\\home\\01Privat\\Script\u按钮”+iStr
+“.pdf”;
PDFont font=PDType1Font.HELVETICA;
PDResources resources=新的PDResources();
resources.put(COSName.getPDFName(“Helvetica”),字体);
acroForm.setDefaultResources(资源);
PDAppearanceStream PDAppearanceStream=新的PDAppearanceStream(doc);
pdAppearanceStream.setResources(资源);
PDTextField textField=新的PDTextField(acroForm);
setPartialName(“SampleField-”+iStr);
字符串defaultAppearance=“/Helv 24 Tf 0 rg”;
textField.setDefaultAppearance(defaultAppearance);
textField.setMultiline(true);
setValue(“单击以获取日期”);
acroForm.getFields().add(textField);
PDAnnotationWidget fieldwidget=textField.getWidgets().get(0);
PDRectangle rect=新的PDRectangle(5060030070);
fieldwidget.setRectangle(rect);
fieldwidget.setPage(第页);
PDApparanceCharacteristicsDictionary字段外观=新PDApparanceCharacteristicsDictionary(
新的cosdirectionary());
现场外观。颜色(新PDC颜色)(
新的float[]{0,0,0},PDDeviceRGB.INSTANCE));
fieldAppearance.setBackground(新的PDColor(新的float[]{1,1,1},
PDDeviceRGB.INSTANCE));
fieldwidget.setAppearanceCharacteristics(fieldAppearance);
fieldwidget.setPrinted(true);
page.getAnnotations().add(fieldwidget);
COSDictionary cosDict1=新的COSDictionary();
COSArray buttonRect1=新建COSArray();
按钮rect1.add(新的COSFloat(50));
按钮rect1.add(新COSFloat(575));
按钮rect1.add(新的COSFloat(150));
按钮rect1.add(新的COSFloat(550));
cosDict1.setItem(COSName.RECT,buttonRect1);
cosDict1.setItem(COSName.FT,COSName.getPDFName(“Btn”));//字段
//类型
cosDict1.setItem(COSName.TYPE,COSName.ANNOT);
cosDict1.setItem(COSName.SUBTYPE,COSName.getPDFName(“小部件”);
cosDict1.setItem(COSName.T,新的COSString(“数据特征”));
cosDict1.setItem(COSName.DA,
新的陪串(“/F06TF0G11RG”);
PDButton button1=新的PDButton(acroForm);
javascript=新的PDActionJavaScript(“函数日期”+iStr
+“({var fld”+iStr+”=this.getField('SampleField-”
+iStr+“”);fld“+iStr
+.value=util.printd('dd-mmmm-yyyy',new-Date();}”);
public static void main(String[] args) throws IOException
{
    String dest = "SO52807807.pdf";

    Map<String, PDActionJavaScript> map = new HashMap<>();
    DecimalFormat DFMM = new DecimalFormat("00");

    try (PDDocument doc = new PDDocument())
    {
        PDDocumentNameDictionary documentNameDictionary = new PDDocumentNameDictionary(doc.getDocumentCatalog());
        PDJavascriptNameTreeNode javascriptNameTreeNode = new PDJavascriptNameTreeNode();
        documentNameDictionary.setJavascript(javascriptNameTreeNode);

        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);

        for (int i = 0; i < 4; i++)
        {
            PDPage page = new PDPage();
            doc.addPage(page);

            PDAnnotationAdditionalActions buttonAction1 = null;
            PDActionJavaScript javascript = null;
            PDActionJavaScript tfJs = null;

            String iStr = DFMM.format(i);

            PDFont font = PDType1Font.HELVETICA;
            PDResources resources = new PDResources();
            resources.put(COSName.getPDFName("Helv"), font);
            acroForm.setDefaultResources(resources);

            PDAppearanceStream pdAppearanceStream = new PDAppearanceStream(doc);
            pdAppearanceStream.setResources(resources);

            PDTextField textField = new PDTextField(acroForm);
            textField.setPartialName("SampleField-" + iStr);

            String defaultAppearance = "/Helv 24 Tf 0 0 0 rg";
            textField.setDefaultAppearance(defaultAppearance);

            textField.setMultiline(true);

            acroForm.getFields().add(textField);

            PDAnnotationWidget fieldwidget = textField.getWidgets().get(0);
            PDRectangle rect = new PDRectangle(50, 600, 300, 70);
            fieldwidget.setRectangle(rect);
            fieldwidget.setPage(page);

            textField.setValue("Click to get Date");

            PDAppearanceCharacteristicsDictionary fieldAppearance = new PDAppearanceCharacteristicsDictionary(
                    new COSDictionary());
            fieldAppearance.setBorderColour(new PDColor(
                    new float[]
                    {
                        0, 0, 0
                    }, PDDeviceRGB.INSTANCE));
            fieldAppearance.setBackground(new PDColor(new float[]
            {
                1, 1, 1
            },
                    PDDeviceRGB.INSTANCE));
            fieldwidget.setAppearanceCharacteristics(fieldAppearance);

            fieldwidget.setPrinted(true);

            page.getAnnotations().add(fieldwidget);

            COSDictionary cosDict1 = new COSDictionary();
            COSArray buttonRect1 = new COSArray();
            buttonRect1.add(new COSFloat(50));
            buttonRect1.add(new COSFloat(575));
            buttonRect1.add(new COSFloat(150));
            buttonRect1.add(new COSFloat(550));

            cosDict1.setItem(COSName.RECT, buttonRect1);
            cosDict1.setItem(COSName.FT, COSName.getPDFName("Btn")); // Field
            // Type
            cosDict1.setItem(COSName.TYPE, COSName.ANNOT);
            cosDict1.setItem(COSName.SUBTYPE, COSName.getPDFName("Widget"));
            cosDict1.setItem(COSName.T, new COSString("Datum anzeigen"));
            cosDict1.setItem(COSName.DA,
                    new COSString("/F0 6 Tf 0 g 1 1 1 rg "));

            PDPushButton button1 = new PDPushButton(acroForm);
            javascript = new PDActionJavaScript("function date" + iStr
                    + "() {var fld" + iStr + " = this.getField('SampleField-"
                    + iStr + "'); fld" + iStr
                    + ".value = util.printd('dd mmmm yyyy',new Date());}");

            //doc.getDocumentCatalog().setOpenAction(javascript);
            map.put("date" + iStr, javascript);

            tfJs = new PDActionJavaScript("date" + iStr + "();");
            buttonAction1 = new PDAnnotationAdditionalActions();

            buttonAction1.setU(tfJs);
            button1.getWidgets().get(0).setActions(buttonAction1);

            button1.getCOSObject().addAll(cosDict1);
            acroForm.getFields().add(button1);

            PDAnnotationWidget buttonWidget1 = button1.getWidgets().get(0);

            PDAppearanceCharacteristicsDictionary buttonFieldAppearance = 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);
            buttonFieldAppearance.setBorderColour(blue);
            buttonFieldAppearance.setBackground(blue);
            buttonFieldAppearance.setNormalCaption("Felder löschen");

            buttonWidget1.setAppearanceCharacteristics(buttonFieldAppearance);
            page.getAnnotations().add(buttonWidget1);

        }
        javascriptNameTreeNode.setNames(map);
        doc.getDocumentCatalog().setNames(documentNameDictionary);
        File file = new File(dest);
        file.getParentFile().mkdirs();
        doc.save(dest);
    }
}