【问题标题】:PDFBox Open PDF file into new browser tabPDFBox 在新的浏览器选项卡中打开 PDF 文件
【发布时间】:2021-03-25 20:30:56
【问题描述】:

我正在使用 pdfbox 库 2.0 版本。我需要在新的浏览器选项卡(即打印视图)中打开 PDF。
就好像我们是从 iText 迁移到 PDFBox 一样,下面是 iText 的现有代码。

使用下面的代码,有 PDFAction 类来实现相同的。是的,

PdfAction action = new PdfAction(PdfAction.PRINTDIALOG);

并在文档上应用打印 Javascript,

copy.addJavaScript(action);

我需要与 PDFBox 等效的解决方案。

        Document document = new Document();
        try{
            outputStream=response.getOutputStream();
            // step 2
            PdfCopy copy = new PdfCopy(document, outputStream);
            
            // step 3
            document.open();
            // step 4
            PdfReader reader;
            int n;
            
            //add print dialog in Pdf Action to open file for preview. 
            PdfAction action = new PdfAction(PdfAction.PRINTDIALOG);
            
            // loop over the documents you want to concatenate
            Iterator i=mergepdfFileList.iterator();
            while(i.hasNext()){
                File f =new File((String)i.next());
                
                is=new FileInputStream(f);
                reader=new PdfReader(is);
                n = reader.getNumberOfPages();
                for (int page = 0; page < n; ) {
                    copy.addPage(copy.getImportedPage(reader, ++page));
                }
                copy.freeReader(reader);
                reader.close();
                is.close();
            }
            copy.addJavaScript(action);
            
            // step 5
            document.close();
            
        }catch(IOException io){
            
            throw io;
        }catch(DocumentException e){
            
            throw e;
        }catch(Exception e){
            
            throw e;
        }finally{           
            outputStream.close();
        }

我也尝试了以下参考,但找不到 PDDocument 类型的 print() 方法。

Reference Link

请指导我。

这是文件在浏览器选项卡中显示时的外观:

【问题讨论】:

标签: java pdfbox


【解决方案1】:

此代码复制了您的文件所具有的内容,即文档目录中名称字典中 JavaScript 条目中名称树中的 JavaScript 操作。 (“当打开文档时,将执行此名称树中的所有操作,定义 JavaScript 函数以供文档中的其他脚本使用” - PDF specification)可能有更简单的方法可以做到这一点,例如with an OpenAction.

PDActionJavaScript javascript = new PDActionJavaScript("this.print(true);\n");
PDDocumentCatalog documentCatalog = document.getDocumentCatalog();
PDDocumentNameDictionary names = new PDDocumentNameDictionary(documentCatalog, new COSDictionary());
PDJavascriptNameTreeNode javascriptNameTreeNode = new PDJavascriptNameTreeNode();
Map<String, PDActionJavaScript> map = new HashMap<>();
map.put("0000000000000000", javascript);
javascriptNameTreeNode.setNames(map);
names.setJavascript(javascriptNameTreeNode);
document.getDocumentCatalog().setNames(names);

【讨论】:

  • 感谢@Tilman Hausherr。这对我有帮助。
猜你喜欢
  • 2016-05-04
  • 2016-09-24
  • 2014-03-01
  • 2014-03-19
  • 2015-06-11
  • 1970-01-01
  • 2018-11-01
  • 2016-02-26
相关资源
最近更新 更多