Распечатать PDF-файл на веб-сайте

Я несколько дней искал решение этой проблемы.

Описание: у меня есть веб-сайт, который динамически загружает PDF-файл через iFrame. PDF-файл сохраняется на сервере, и пользователь веб-сайта может просматривать PDF-файл на веб-сайте.

Проблема: добавьте на веб-сайт кнопку «Печать», которая распечатывает файл PDF, который был создан динамически и сохранен на сервере.

Это вообще возможно? Я также смотрю на кроссбраузерную реализацию, чтобы усугубить ситуацию. Я пробовал n вариантов JS из Интернета, но ни один из них, похоже, не работает. Кажется, я не могу распечатать PDF-файл так же, как он выглядит. Короче говоря, я пытаюсь имитировать кнопку печати, которая появляется в PDF-файле при его загрузке. Есть ли возможность передать PDF-документ с сервера в диалоговое окно печати?


person steve mais    schedule 17.07.2013    source источник
comment
Если у вас есть PDF-файл, уже сохраненный на сервере и выглядящий так, как вы хотите, вы можете предоставить обычную ссылку на него, которая приведет пользователя к PDF-файлу. Оттуда его было бы легко распечатать. Однако, если вы надеетесь на решение «один щелчок и он выходит из принтера», плохая новость в том, что его нет. Связано: stackoverflow.com/questions/5627035/   -  person lostphilosopher    schedule 18.07.2013
comment
Полагаю, вы уже определили, что это (javascriptkit.com/howto/newtech2.shtml) у вас не работает?   -  person lostphilosopher    schedule 18.07.2013
comment
›Есть ли возможность передать PDF-документ с сервера в диалоговое окно печати? ... конечно, нет, не больше, чем вы хотите, чтобы кто-то еще мог слепо отправлять что-то на вашу машину и что-то делать.   -  person Kevin Brown    schedule 18.07.2013
comment
@lost philosopher - window.print печатает всю веб-страницу вместе с пустым iframe.   -  person steve mais    schedule 18.07.2013


Ответы (2)


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

person yms    schedule 23.07.2013
comment
Спасибо yms. В итоге я сделал нечто подобное. - person steve mais; 29.07.2013
comment
Примечание. Я обнаружил, что почти невозможно отобразить диалоговое окно печати из PDF-файла, встроенного в iFrame, внутри веб-страницы. Мое решение состояло в том, чтобы открыть другое окно, содержащее только PDF-файл, когда пользователь нажимает кнопку «Печать». Помогла следующая ссылка - stackoverflow.com / questions / 270674 / - person steve mais; 30.07.2013
comment
@steve mais, возможно, тебе стоит написать новый ответ на свой вопрос со всеми подробностями того, что ты сделал. Это может помочь другим, столкнувшимся с той же проблемой. - person yms; 30.07.2013

Описание: у меня есть веб-сайт, который динамически загружает PDF-файл через iFrame. PDF-файл сохраняется на сервере, и пользователь веб-сайта может просматривать PDF-файл на веб-сайте.

Проблема: добавьте на веб-сайт кнопку «Печать», которая распечатывает файл PDF, который был создан динамически и сохранен на сервере.

Решение: я не смог найти точного решения этой проблемы, но вот как я решил проблему -

  1. Создайте «Печать» в соответствии с требованиями и перенаправьте его на другую страницу, содержащую только PDF.
  2. Скопируйте предыдущий PDF-файл и создайте новый PDF-файл с помощью JS - this.print (), чтобы при его открытии диалоговое окно печати отображалось непосредственно для пользователя.

На новой странице -

    if ("Location of PDF " != null)
        {
            sPdf = "Location of PDF ";
            PdfReader pReader = new PdfReader(sPdf);
            Document document = new Document
                (pReader.GetPageSizeWithRotation(ApplicationConstants.INDEX_ONE));
            int n = pReader.NumberOfPages;
            FileStream fs = new FileStream
                ("New PDF location",
                FileMode.Create, FileAccess.Write);
            PdfCopy copy = new PdfCopy(document, fs);
            // Write to pdf 
            document.Open();
            for (int i = ApplicationConstants.INDEX_ONE; i <= n; i++)
            {
                PdfImportedPage page = copy.GetImportedPage(pReader, i);
                copy.AddPage(page);
            }
            copy.AddJavaScript("this.print(true);", true);
            document.Close();
            pReader.Close();

            inStr = File.OpenRead("New PDF location");
            while ((bytecnt = inStr.Read
                (buffer, ApplicationConstants.INDEX_ZERO, buffer.Length))
                > ApplicationConstants.INDEX_ZERO)
            {
                if (Context.Response.IsClientConnected)
                {
                    Context.Response.ContentType = "application/PDF";
                    Context.Response.OutputStream.Write(buffer, 
                        ApplicationConstants.INDEX_ZERO, buffer.Length);
                    Context.Response.Flush();
                }
            } 
        }

Обратите внимание, что я использую itextsharp для вставки сценария JS в новый PDF-файл. Надеюсь, это поможет кому-то другому. Я пытаюсь найти другое решение без использования itextsharp или любой другой библиотеки DLL, но это нужно сделать на данный момент.

person steve mais    schedule 01.08.2013