Javascript 强制链接在新窗口中打开

Javascript 强制链接在新窗口中打开,javascript,pdf,hyperlink,Javascript,Pdf,Hyperlink,在我们的网站中,我们嵌入了PDF,我们希望确保当用户单击PDF中的链接时,它会在新的选项卡或窗口中打开。我们无法控制PDF,因此我们无法对链接本身做任何事情 是否可以以某种方式(例如使用onbeforeunload)截获请求,并强制在单独的窗口中打开新页面?这是否有意义:?我假设您至少可以向页面添加JavaScript。为了在新窗口中打开PDF,您不必修改PDF本身,即使您可能无法修改url本身,您也可以在页面上以任何方式自由打开这些链接。还是我完全误解了你的问题?:) 不,对不起,没有办法 这

在我们的网站中,我们嵌入了PDF,我们希望确保当用户单击PDF中的链接时,它会在新的选项卡或窗口中打开。我们无法控制PDF,因此我们无法对链接本身做任何事情


是否可以以某种方式(例如使用onbeforeunload)截获请求,并强制在单独的窗口中打开新页面?

这是否有意义:?我假设您至少可以向页面添加JavaScript。为了在新窗口中打开PDF,您不必修改PDF本身,即使您可能无法修改url本身,您也可以在页面上以任何方式自由打开这些链接。还是我完全误解了你的问题?:)

不,对不起,没有办法

这是故意的

如果可能的话,这将是一个重大的安全漏洞。

根据,如果不修改PDF阅读器,您实际上无法做到这一点。对不起

我想如果不换Acrobat Reader你就做不到这一点。。。我建议。。。其他一些不使用“单一文档”用户界面的PDF阅读器。[]使用选项卡,可以显示多个PDF文档


您可以操纵PDF文档中的链接,以运行javascript在新窗口/选项卡中打开链接。下面是我如何使用
C#
iTextSharp

    public static MemoryStream OpenLinksInNewWindow(MemoryStream mySource)
    {
        PdfReader myReader = new PdfReader(mySource);

        int intPageCount = myReader.NumberOfPages;

        PdfDictionary myPageDictionary = default(PdfDictionary);
        PdfArray myLinks = default(PdfArray);

        //Loop through each page
        for (int i = 1; i <= intPageCount; i++)
        {
            //Get the current page
            myPageDictionary = myReader.GetPageN(i);

            //Get all of the annotations for the current page
            myLinks = myPageDictionary.GetAsArray(PdfName.ANNOTS);

            //Make sure we have something
            if ((myLinks == null) || (myLinks.Length == 0))
                continue;

            //Loop through each annotation

            foreach (PdfObject myLink in myLinks.ArrayList)
            {
                //Convert the itext-specific object as a generic PDF object
                PdfDictionary myLinkDictionary = (PdfDictionary)PdfReader.GetPdfObject(myLink);

                //Make sure this annotation has a link
                if (!myLinkDictionary.Get(PdfName.SUBTYPE).Equals(PdfName.LINK))
                    continue;

                //Make sure this annotation has an ACTION
                if (myLinkDictionary.Get(PdfName.A) == null)
                    continue;

                //Get the ACTION for the current annotation
                PdfDictionary myLinkAction = (PdfDictionary)myLinkDictionary.Get(PdfName.A);

                //Test if it is a URI action
                if (myLinkAction.Get(PdfName.S).Equals(PdfName.URI))
                {
                    //Replace the link to run a javascript function instead
                    myLinkAction.Remove(PdfName.F);
                    myLinkAction.Remove(PdfName.WIN);
                    myLinkAction.Put(PdfName.S, PdfName.JAVASCRIPT);
                    myLinkAction.Put(PdfName.JS, new PdfString(String.Format("OpenLink('{0}');", myLinkAction.Get(PdfName.URI))));
                }
            }
        }


        //Next we create a new document add import each page from the reader above
        MemoryStream myMemoryStream = new MemoryStream();

        using (Document myDocument = new Document())
        {
            using (PdfCopy myWriter = new PdfCopy(myDocument, myMemoryStream))
            {
                myDocument.Open();
                for (int i = 1; i <= myReader.NumberOfPages; i++)
                {
                    myWriter.AddPage(myWriter.GetImportedPage(myReader, i));
                }

                // Insert JavaScript function to open link
                string jsText = "function OpenLink(uri) { app.launchURL(uri, true); }";                 
                PdfAction js = PdfAction.JavaScript(jsText, myWriter);
                myWriter.AddJavaScript(js);

                myDocument.Close();
            }
        }                      

        return new MemoryStream(myMemoryStream.GetBuffer());
    }
publicstaticmemorystream openlinkwwindow(MemoryStream mySource)
{
PdfReader myReader=新的PdfReader(mySource);
int intPageCount=myReader.NumberOfPages;
PdfDictionary myPageDictionary=默认值(PdfDictionary);
PdfArray myLinks=默认值(PdfArray);
//循环浏览每一页

对于(int i=1;i),这不是我想要的。PDF嵌入在网页中,不应该在其他窗口中打开。相反,如果PDF中有链接,用户单击它,则目标URL应该在单独的窗口中打开。@taral,啊,现在我明白了。感谢您澄清这个小小的误解(如我缺乏阅读理解能力)