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

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

10 ответов

Я обычно делаю что-то похожее на подход " Использование 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. фрейм, указывающий на ваш PDF...

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

Бонус Идея № 1 - Создать iframe и добавьте его на свою страницу в printTrigger(); так что PDF не загружается, пока пользователь не нажмет вашу кнопку "Печать", тогда javascript может атаковать! iframe и вызвать диалоговое окно печати.


Бонус Идея № 2 - Дополнительный кредит, если вы отключите свою кнопку "Печать" и дадите пользователю небольшую загрузочную вертушку или что-то после того, как он щелкнет по нему, чтобы они знали, что что-то происходит, вместо того, чтобы нажимать это повторно!

Да, ты можешь...

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

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

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

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

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

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

Я использую 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 теряется в этом преобразовании. Я не искал больше в этом.

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

<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...

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

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

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

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

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

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

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

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

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

креветка-печать

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

<input type="button" value="Print" onclick="document.getElementById('PDFtoPrint').focus(); document.getElementById('PDFtoPrint').contentWindow.print();">

Если вы встраиваете 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>

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

Другие вопросы по тегам