【问题标题】:Get the current page in PDF Java Web获取 PDF Java Web 中的当前页面
【发布时间】:2014-06-26 08:54:18
【问题描述】:

我需要从我的 Web 应用程序中读取当前页码。我有:

 <iframe id="myPdf" src="C:\test.pdf#page=5" style="width: 650px; height: 550px;" />

在第 5 页打开 PDF,用户可以导航到另一个页面。然后,当用户点击按钮/链接时,我需要以 PDF 格式获取页面的当前索引。

我的用户使用 Acrobat Reader,我无法使用非 Adob​​e 的插件。我可以使用 Javascript/Java 代码。

谢谢 塔米

【问题讨论】:

    标签: java javascript pdf


    【解决方案1】:

    我发现我可以使用 iText(免费软件)将 JavaScript 注入 pdf 文件, PDF 中的 JS 向 html 中的容器发送消息。 该消息包含当前页面,并且在每次页面更改时传递给容器。

    我使用 pdfobject.js pdfobject.min.js 创建捕获消息的 PDFJS 对象。

    将 JS 注入 PDF 的 Java 代码:

    public String mAddJS()
    {
        InputStream vbReaderFile = null;
    
        try
        {
            vbReaderFile = new FileInputStream("C:\\test.pdf");
            PdfReader myReader = new PdfReader( vbReaderFile ); // throws IOException
            PdfStamper myStamper = new PdfStamper( myReader, new FileOutputStream("C:\\outTest.pdf") ); // throws IOE, DocumentException
            // add a page-open script, 1 is the first page, not zero0
            PdfAction jsAction = PdfAction.javaScript ("app.alert('Think again next time!');", myStamper.getWriter());
            int pageNum = myReader.getNumberOfPages();
            for(int i=1 ; i<pageNum ; i++ )
            {
                 jsAction = PdfAction.javaScript (
                         "this.disclosed=true;" +
                         "if(this.hostContainer){" +
                         "var names = new Array();names[0]=" + i + ";" +
                         "try{this.hostContainer.postMessage(names);}" +
                         "catch(e){app.alert(e.message); }"+
                         "}", myStamper.getWriter());
    
                 myStamper.setPageAction( PdfWriter.PAGE_OPEN, jsAction, i); 
    
            }
    
            myStamper.close(); // write everything out, throws DocumentException, IOE
            vPath = "C:\\outTest.pdf";
    
        //  JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(), "mChangePDF('C:\\outTest.pdf');");
    
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    
    }
    

    html页面:

     <h:body >
             <ice:form id="myForm">
              <object id="myPDFObj" type="application/pdf" data="test.pdf#page=3" 
                height="550px" width="650px"></object>
    
                <br/><ice:commandButton onclick="test();" value="test" ></ice:commandButton>
    
                <ice:commandButton action="#{pDFTest.mAddJS}" value="JAVA" partialSubmit="false"></ice:commandButton>
    
                 <div id="myDivPdf">
                  </div>
            </ice:form> 
    </h:body>
    

    html上的JS:

      <script type="text/javascript">
    
         var PDF1;
         var PDF2;
    
         window.onload = function(evt)
         {
             createPDF();
    
             createMessageHandler();
         }
    

    函数 createPDF(){

     PDF1 = new PDFObject({
          url: "test.pdf#page=3",
          id: "myPDFObj",
          width: "500px",
          height: "300px"
        });
     PDF2 = PDF1.embed("myForm:myDivPdf");
    

    };

    function createMessageHandler() { 
        var PDFObject = document.getElementById("myPDFObj"); 
        if(PDFObject==null)
            alert('e1');
        PDFObject.messageHandler = { 
            onMessage: function(msg) { 
            //  alert('app');
                alert( msg[0]);
                }, 
            onError: function(error, msg) { 
                alert('error.message'); 
            } 
        } 
    } 
    
    
    
    </script>
    

    【讨论】:

    • 谢谢!好主意,到目前为止,它在 IE 中的 chrome 和 FF 中非常适合我,但我也尝试让它在 FF 和 Chrome 中运行,就像这里的最后一条评论建议没有成功stackoverflow.com/questions/21871623/…
    • 如果我没记错的话 IE 以不同的方式读取 pdf 文件。所以IE在adobeReader插件中的JS功能是不一样的。
    猜你喜欢
    • 1970-01-01
    • 2016-05-16
    • 2011-05-07
    • 2012-12-04
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    相关资源
    最近更新 更多