Можно ли открыть диалоговое окно печати PDF-файла с помощью Javascript? - PullRequest
42 голосов
/ 27 марта 2009

Я знаю, как открыть веб-страницу в новом окне и добавить javascript, чтобы всплыло диалоговое окно печати. Есть ли способ сделать подобное с файлом PDF?

Ответы [ 10 ]

33 голосов
/ 22 марта 2010

Да, вы можете ...

PDF-файлы имеют поддержку Javascript. Мне нужно было иметь возможность автоматической печати при создании PDF-файла, сгенерированного PHP, и я мог использовать FPDF, чтобы заставить его работать:

http://www.fpdf.org/en/script/script36.php

30 голосов
/ 15 мая 2011

Я обычно делаю что-то похожее на подход, заданный Как использовать JavaScript для печати PDF (eHow.com) , используя iframe.

  1. функция для размещения триггера печати ...

    function printTrigger(elementId) {
        var getMyFrame = document.getElementById(elementId);
        getMyFrame.focus();
        getMyFrame.contentWindow.print();
    }
    
  2. кнопка для предоставления пользователю доступа ...

    (onClick на a или button или input или как вам угодно)

    <input type="button" value="Print" onclick="printTrigger('iFramePdf');" />
    
  3. iframe, указывающий на ваш PDF ...

    <iframe id="iFramePdf" src="myPdfUrl.pdf" style="display:none;"></iframe>
    

Bonus Idea # 1 - Создайте iframe и добавьте его на свою страницу в printTrigger();, чтобы PDF-файл не загружался до тех пор, пока пользователь не нажмет вашу кнопку «Печать», а затем JavaScript может атаковать! iframe и вызвать диалоговое окно печати. ​​


Bonus Idea # 2 - Дополнительный кредит, если вы отключите свою кнопку «Печать» и дадите пользователю небольшую загрузочную вертушку или что-то после того, как он щелкнет по ней, чтобы он знал, что что-то происходит, вместо того, чтобы щелкать по нему несколько раз!

13 голосов
/ 24 марта 2011

Просто выяснил, как это сделать в самом PDF-файле - если у вас есть acrobat pro, перейдите на вкладку своих страниц, щелкните правой кнопкой мыши по миниатюре для первой страницы и выберите свойства страницы. Нажмите на вкладку действий в верхней части окна и под триггером выберите страницу открыть. Под действием выберите «запустить JavaScript». Затем в окне JavaScript введите следующее:

this.print({bUI: false, bSilent: true, bShrinkToFit: true});

При этом ваш документ будет распечатан без диалога с принтером по умолчанию на вашем аппарате. Если вы хотите диалоговое окно печати, просто измените bUI на true, bSilent на false и, при необходимости, удалите параметр сжатия для соответствия.

Автопечать PDF!

9 голосов
/ 03 июля 2012

Я использую named action вместо javascript, потому что javascript часто отключен, а если нет, выдает предупреждение.

Мое веб-приложение создает файл postscript, который затем преобразуется с помощью ghostscript в pdf. Я хочу, чтобы он печатался автоматически, потому что пользователь уже нажал на печать внутри моего приложения. С информацией о названных действиях от @DSimon выше, я исследовал, как решить эту проблему. Все сводится к вставке строки /Type /Action /S /Named /N /Print в нужном месте в PDF.

Я думал о написании небольшой утилиты, но она должна проанализировать pdf-файл, чтобы найти корневой узел, вставить /OpenAction со ссылкой на объект с действием и пересчитать смещения байтов в xref.

Но потом я узнал о pdfmark , который является расширением постскриптума для выражения в синтаксисе постскриптама идиом, которые преобразуются в pdf дистиллятором Adobes или ghostscript.

Поскольку я уже использую ghostscript, все, что мне нужно сделать, это добавить следующее в конец моего файла postscript:

%AUTOPRINT
[ /_objdef {PrintAction} /type /dict /OBJ pdfmark
[ {PrintAction} << /Type /Action /S /Named /N /Print >> /PUT pdfmark
[ {Catalog} << /OpenAction {PrintAction} >> /PUT pdfmark

и ghostscript создаст действие, свяжет его и рассчитает смещения внешних ссылок. (В постскриптуме % - это комментарий, а PrintAction - мое имя для объекта)

Глядя на PDF, я вижу, что он создал это:

1 0 obj
<</Type /Catalog /Pages 3 0 R
/OpenAction  9 0 R
/Metadata 10 0 R
>>
endobj

9 0 obj
<</S/Named
/Type/Action
/N/Print>>endobj

1 0 - это объект 1, редакция 0, а 9 0 - это объект 9, редакция 0. В pdf-трейлере говорится, что это объект 1, который является корневым узлом. Как вы можете видеть, есть ссылка от объекта 1 /OpenAction на запуск объекта 9 ревизии 0.

С помощью ghostscript можно конвертировать pdf в postscript (pdf2ps), добавлять текст выше и конвертировать его обратно в pdf с помощью ps2pdf. Следует отметить, что мета-информация о PDF теряется в этом преобразовании. Я не искал больше в этом.

7 голосов
/ 01 июня 2010

Пример кода встраивания:

<object type="application/pdf" data="example.pdf" width="100%" height="100%" id="examplePDF" name="examplePDF"><param name='src' value='example.pdf'/></object>

<script>
   examplePDF.printWithDialog();
</script>

Возможно, придется дурачиться с идентификаторами / именами. Использование Adobe Reader ...

4 голосов
/ 04 ноября 2011

Если вы знаете, как структурированы файлы PDF (или хотите потратить немного времени на чтение спецификации), вы можете сделать это следующим образом.

Используйте именованное действие «Печать» в поле OpenAction объекта Каталога; действие «Печать» недокументировано, но Acrobat Reader и большинство других крупных читателей это понимают. Хорошим преимуществом этого подхода является то, что вы не получаете никаких предупреждений JavaScript. Подробности смотрите здесь: http://www.gnostice.com/nl_article.asp?id=157

Чтобы сделать его еще более ярким, я добавил второй URI-код Action, указывающий читателю вернуться на страницу, с которой был создан запрос. Затем я прикрепил это действие к первому именованному действию, используя его поле «Далее». С расположением содержимого, установленным на «встроенный», это делает так, чтобы, когда пользователь нажимает на ссылку для печати:

  1. Он открывает Adobe Reader на той же вкладке и загружает файл
  2. Он сразу показывает диалоговое окно печати
  3. Как только диалоговое окно «Печать» закрывается (нажимают ли они «ОК» или «отмена»), вкладка браузера возвращается на веб-страницу

Мне удалось достаточно легко выполнить все эти изменения в Ruby, используя только модули File и IO; Я открыл PDF-файл, сгенерированный с помощью внешнего инструмента, после внешней ссылки к существующему разделу Каталога, затем добавил новый раздел в PDF с обновленным объектом Каталога, содержащим мою специальную строку OpenAction, а также новые объекты Action.

Из-за дополнительных функций ревизии PDF вам не нужно вносить какие-либо изменения в существующие данные, просто добавьте дополнительный раздел в конец.

3 голосов
/ 14 сентября 2011

Почему бы не использовать опцию меню Действия, чтобы установить это?

Выполните следующие действия. Если у вас есть Acrobat Pro, перейдите на вкладку своих страниц, щелкните правой кнопкой мыши эскиз первой страницы и выберите «Свойства страницы». Нажмите на вкладку действий в верхней части окна и под триггером выберите страницу открыть. Под действием выбора выберите «Выполнить пункт меню» . Нажмите кнопку «Добавить», затем выберите «Файл»> «Печать» и нажмите «ОК». Нажмите OK еще раз и сохраните PDF.

2 голосов
/ 29 мая 2012

Если вы используете гем prawn для Ruby on Rails для генерации PDF, вы можете использовать следующий дополнительный гем для активации диалога печати:

креветка-принт

0 голосов
/ 20 октября 2016

Другое решение:

<input type="button" value="Print" onclick="document.getElementById('PDFtoPrint').focus(); document.getElementById('PDFtoPrint').contentWindow.print();">
0 голосов
/ 11 мая 2009

, если вы встраиваете pdf в свою веб-страницу и ссылаетесь на идентификатор объекта, вы сможете это сделать.

например. в вашем HTML:

<object ID="examplePDF" type="application/pdf" data="example.pdf" width="500" height="500">

в вашем javascript:

<script>

var pdf = document.getElementById("examplePDF");

pdf.print();

</script>

Надеюсь, это поможет.

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