Можно ли открыть диалоговое окно печати PDF-файла с помощью Javascript?
Я знаю, как открыть веб-страницу в новом окне и добавить javascript, чтобы всплыло диалоговое окно печати. Есть ли способ сделать подобное с файлом PDF?
10 ответов
Я обычно делаю что-то похожее на подход " Использование JavaScript для печати PDF (eHow.com)", используя iframe
,
функция для размещения триггера печати...
function printTrigger(elementId) { var getMyFrame = document.getElementById(elementId); getMyFrame.focus(); getMyFrame.contentWindow.print(); }
кнопка, чтобы дать пользователю доступ...
(
onClick
наa
или жеbutton
или жеinput
или как пожелаешь)<input type="button" value="Print" onclick="printTrigger('iFramePdf');" />
фрейм, указывающий на ваш PDF...
<iframe id="iFramePdf" src="myPdfUrl.pdf" style="display:none;"></iframe>
Бонус Идея № 1 - Создать iframe
и добавьте его на свою страницу в printTrigger();
так что PDF не загружается, пока пользователь не нажмет вашу кнопку "Печать", тогда javascript может атаковать! iframe и вызвать диалоговое окно печати.
Бонус Идея № 2 - Дополнительный кредит, если вы отключите свою кнопку "Печать" и дадите пользователю небольшую загрузочную вертушку или что-то после того, как он щелкнет по нему, чтобы они знали, что что-то происходит, вместо того, чтобы нажимать это повторно!
Да, ты можешь...
PDF-файлы имеют поддержку Javascript. Мне нужно было иметь возможность автоматической печати при создании PDF-файла, сгенерированного PHP, и я мог использовать FPDF, чтобы заставить его работать:
Просто выяснили, как это сделать в самом 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, который велел читателю вернуться на страницу, с которой был создан запрос. Затем я прикрепил это действие к первому именованному действию, используя его поле "Далее". С расположением содержимого, установленным на "встроенный", это делает так, что когда пользователь нажимает на ссылку для печати:
- Он открывает Adobe Reader в той же вкладке и загружает файл
- Сразу показывает диалог печати
- Как только диалоговое окно "Печать" закрывается (нажимают ли они "ОК" или "Отмена"), вкладка браузера возвращается к веб-странице.
Я смог сделать все эти изменения в 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>
Надеюсь, это поможет.