当前位置: 首页 > 面试题库 >

PDFBox按钮执行JavaScript以关闭文档

鲜于子琪
2023-03-14
问题内容

我的用例是在pdf页面上有一个类似的按钮(确实是将它们添加到现有页面上,但是现在我只想看到它可以在任何东西上工作)。

----------
-  Back  -
----------

它所做的只是关闭当前的pdf页面。想法是打开多个选项卡,每个选项卡都是一个pdf,然后当您单击“后退”按钮时,它将关闭当前pdf,然后将其聚焦到上一个pdf。到目前为止,这是我一直在尝试使用的。

        // Create a new empty document
        try {
            PDDocument document = new PDDocument();

            // Create a new blank page and add it to the document
            PDPage blankPage = new PDPage();
            document.addPage( blankPage );

            PDBorderStyleDictionary borderULine = new PDBorderStyleDictionary();
            borderULine.setStyle(PDBorderStyleDictionary.STYLE_UNDERLINE);
            PDColor green = new PDColor(new float[] { 0, 1, 0 }, PDDeviceRGB.INSTANCE);
//            PDAnnotationTextMarkup txtMark = new PDAnnotationTextMarkup(PDAnnotationTextMarkup.SUB_TYPE_HIGHLIGHT);

//            textWidth = (font.getStringWidth("Click Here") / 1000) * 18;
            PDAnnotationLink txtLink = new PDAnnotationLink();
            txtLink.setBorderStyle(borderULine);

            // add an action
//            PDActionURI action = new PDActionURI();
//            action.setURI("www.google.com");
            PDActionJavaScript action = new PDActionJavaScript("this.closeDoc()");
            txtLink.setAction(action);
            txtLink.setContents("HI");
            txtLink.setColor(green);

            PDRectangle position = new PDRectangle();
            position.setLowerLeftX(10);
            position.setLowerLeftY(20);
            position.setUpperRightX(100);
            position.setUpperRightY(40);
            txtLink.setRectangle(position);
            txtLink.setInvisible(false);
            blankPage.getAnnotations().add(txtLink);

            // Save the newly created document
            document.save("C:\\Users\\jsmith\\Desktop\\demo\\BlankPage.pdf");
            document.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

而且我似乎看不到pdf页面上的任何内容(它全是白色),我确实获得了至少至少可以转到新页面而不是javascript的以下代码,但是它仍然不可见。我只是能够将鼠标悬停在左下方,并注意到我可以单击链接。

            PDActionURI action = new PDActionURI();
            action.setURI("www.google.com");

问题答案:

改进的答案,如OP自己的评论中所述,并且还包括后续问题的答案。

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

COSDictionary acroFormDict = new COSDictionary();
PDAcroForm acroForm = new PDAcroForm(doc, acroFormDict);
doc.getDocumentCatalog().setAcroForm(acroForm);
acroForm.setFields(new ArrayList<>());

PDPushButton button = new PDPushButton(acroForm);
button.setPartialName("Btn1");

PDActionJavaScript actionJavaScript = new PDActionJavaScript("this.closeDoc();");
PDAnnotationAdditionalActions additionalActions = new PDAnnotationAdditionalActions();
additionalActions.setU(actionJavaScript);

// widget
PDAnnotationWidget widget = button.getWidgets().get(0);
widget.setActions(additionalActions);
widget.setRectangle(new PDRectangle(100, 700, 100, 50));

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

// Create appearance
PDAppearanceDictionary appearanceDictionary = new PDAppearanceDictionary();
PDAppearanceStream appearanceStream = new PDAppearanceStream(doc);
appearanceStream.setResources(new PDResources());
try (PDPageContentStream cs = new PDPageContentStream(doc, appearanceStream))
{
    PDRectangle bbox = new PDRectangle(widget.getRectangle().getWidth(), widget.getRectangle().getHeight());
    appearanceStream.setBBox(bbox);
    cs.setNonStrokingColor(0, 0, 0); // black
    cs.addRect(bbox.getLowerLeftX() + 0.5f, bbox.getLowerLeftY() + 0.5f, bbox.getWidth() - 1, bbox.getHeight() - 1);
    cs.stroke();

    // put some useful text
    cs.setFont(PDType1Font.HELVETICA, 20);
    cs.beginText();
    cs.newLineAtOffset(20, 20);
    cs.showText("Close");
    cs.endText();
}
appearanceDictionary.setNormalAppearance(appearanceStream);
widget.setAppearance(appearanceDictionary);

page.getAnnotations().add(widget);

acroForm.getFields().add(button);

doc.save("..../Button.pdf");
doc.close();


 类似资料:
  • 我有一个Jframe窗口,里面有一个按钮。通过单击该按钮,它将打开一个新的JFrame窗口。但是当我关闭这个窗口时,它会自动用按钮关闭第一个Jframe窗口。当我关闭第二个Jframe窗口时,如何防止第一个Jframe窗口关闭?

  • 嗨,我有一个jFrame,我想问问用户,当单击close按钮时,他是否确定要关闭jFrame: 当他从jpanel弹出窗口中选择“否”按钮时,我该如何撤消关闭操作?

  • 如何让我的动作监听器单击按钮并将按钮文本显示到文本区域? 在actionlistener之后初始化,因此当我尝试定义

  • 问题内容: 你好, 我正在使用Java Swing,并且想在单击按钮时关闭一个窗口。我不知道使用动作侦听器作为执行此操作的最佳方法,但是目前我正在编译错误,因此它一定是不正确的。 这是我的代码: 我遇到的问题是列出的最后一个类,它实际上只是关闭当前窗口,因此再次显示主菜单屏幕。我需要在该类中创建的静态引用。但是将其更改为静态是无效的修饰符吗? 我该如何解决? 问题答案: 试试这个 并发送一个实例给

  • 我有一个Jframe(美因茨), 它有一个按钮(showDialog), 当用户单击该按钮时, jdialog (Dialogz) 将显示, 那个jdialog有一个按钮 如何从该按钮关闭jdialog(在jdialog内部)? 我可以在创建对话框的实例后更改对话框的模式吗? 我需要阻止jdialog的所有者 我试着。。。 非常感谢你的任何帮助

  • 我有一个JFrame调用一个新的JDialog,这个JDialog有一个关闭它的按钮。 当JDialog关闭时,JFrame应该重新绘制。但是当我用按钮关闭JDialog时,什么也不会发生,当我用经典的“X”按钮关闭时,就不会发生这种情况。 这是来自JFrame的windowListener: 这里是JDialog中关闭JDialog的按钮的代码: 就像我说的,监听器中的JFrame需要在JDia