Принудительно открывать ссылки в новом окне - PullRequest
3 голосов
/ 03 марта 2011

На нашем веб-сайте есть встроенные PDF-файлы, и мы хотели бы убедиться, что когда пользователь щелкает ссылку внутри PDF-файла, он открывается в новой вкладке или окне.Мы не контролируем PDF-файлы, поэтому ничего не можем сделать с самими ссылками.

Можно ли каким-то образом перехватить запрос, например, с помощью onbeforeunload, и заставить новую страницу открыться в отдельном окне?

Ответы [ 4 ]

4 голосов
/ 03 марта 2011

Нет, извините, нет способа сделать это.

Это по замыслу.

Если бы это было возможно, это было бы серьезным нарушением безопасности.

1 голос
/ 08 октября 2014

Вы можете манипулировать ссылками внутри 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());
    }

Я получил большую часть кода из этого ответа: https://stackoverflow.com/a/8141831/596758

1 голос
/ 03 марта 2011

Проверьте этот другой вопрос SO. Это говорит о том, что на самом деле вы не можете сделать это без изменения программы чтения PDF. Извините!

0 голосов
/ 03 марта 2011

Может ли это быть интересно: JS, чтобы открыть PDF в новом окне ? Я предполагаю, что вы можете хотя бы добавить JavaScript на страницу. Вам не нужно изменять сами PDF-файлы, чтобы открывать их в новом окне, и даже если вы не сможете изменить сами URL-адреса, вы можете свободно открывать эти ссылки любым способом на своей странице. Или я совершенно не понимаю ваш вопрос? :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...