Я знаю, как открыть веб-страницу в новом окне и добавить javascript, чтобы появилось диалоговое окно печати. Есть ли способ сделать подобное с PDF файлом?
Можно ли открыть диалог печати PDF файлов с помощью Javascript?
Ответ 1
Да, вы можете...
У PDF файлов есть поддержка Javascript. Мне нужно было иметь возможности автоматической печати при создании PHP файла PDF, и я смог использовать FPDF, чтобы заставить его работать:
Ответ 2
Я обычно делаю что-то похожее на подход, описанный Как использовать JavaScript для печати в формате PDF (eHow.com), используя iframe
.
-
функция размещения триггера печати...
function printTrigger(elementId) { var getMyFrame = document.getElementById(elementId); getMyFrame.focus(); getMyFrame.contentWindow.print(); }
-
кнопка для доступа пользователя...
(a
onClick
наa
илиbutton
илиinput
или все, что вы пожелаете)<input type="button" value="Print" onclick="printTrigger('iFramePdf');" />
-
iframe, указывающий на ваш PDF...
<iframe id="iFramePdf" src="myPdfUrl.pdf" style="display:none;"></iframe>
Идея Bonus Idea # 1. Создайте iframe
и добавьте ее на свою страницу в printTrigger();
, чтобы PDF файл не был загружен, пока пользователь не нажмет кнопку "Печать", затем javascript может атаковать! iframe и вызвать диалог печати.
Бонусная идея № 2 - Дополнительный кредит, если вы отключите кнопку "Печать" и дадите пользователю немного загрузочного счетчика или что-то после их нажатия, чтобы они знали что-то в процессе, а не щелкали это неоднократно!
Ответ 3
Просто выяснилось, как это сделать в самом PDF файле - если у вас есть acrobat pro, перейдите на вкладку "Страницы", щелкните правой кнопкой мыши на миниатюре для первой страницы и щелкните свойства страницы. Перейдите на вкладку действий в верхней части окна и в окне выбора триггера выберите страницу. В рамках действия select выберите "запустить javascript". Затем в окне javascript введите следующее:
this.print({bUI: false, bSilent: true, bShrinkToFit: true});
Это напечатает ваш документ без диалога с принтером по умолчанию на вашем компьютере. Если вы хотите диалог печати, просто измените bUI на true, bSilent на false и, возможно, удалите параметр shrink to fit.
Авто-печать PDF!
Ответ 4
Я использую named action
вместо javascript, потому что javascript часто отключается, и если он не дает предупреждения.
Мое веб-приложение создает файл postscript, который затем преобразуется с ghostscript в pdf. Я хочу, чтобы он печатался автоматически, поскольку пользователь уже нажал на печать внутри моего приложения. С информацией о названных действиях от @DSimon выше, я исследовал, как это решить. Все это сводится к вставке строки /Type /Action /S /Named /N /Print
в нужное место в pdf.
Я подумывал написать небольшую утилиту, но он должен разобрать pdf, чтобы найти корень node, вставить /OpenAction
с ссылкой на объект с действием и пересчитать байты-смещения в xref.
Но потом я узнал о pdfmark, который является расширением для postscript, чтобы выразить в синтаксисе postscript, идиомы, которые были преобразованы в pdf с помощью Distiller 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 создадут действие, свяжут его и посчитают смещения xref. (В postscript %
есть комментарий, а 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, который является корнем node. Как вы можете видеть, существует ссылка от объекта 1, /OpenAction
для запуска ревизии объекта 9.
С помощью ghostscript можно преобразовать pdf в постскриптум (pdf2ps), добавить текст выше и преобразовать его обратно в pdf с помощью ps2pdf
. Следует отметить, что в этом преобразовании теряется метаинформация о pdf. Я больше не искал этого.
Ответ 5
Вставить код примера:
<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...
Ответ 6
Если вы знаете, как PDF файлы структурированы (или готовы потратить немного времени на чтение спецификации), вы можете сделать это таким образом.
Использовать Именованное действие "Печать" в поле OpenAction объекта Catalog; действие "Печать" недокументировано, но Acrobat Reader и большинство других основных читателей это понимают. Хорошим преимуществом такого подхода является то, что вы не получаете никаких предупреждений JavaScript. Подробнее см. Здесь: http://www.gnostice.com/nl_article.asp?id=157
Чтобы сделать его еще более сильным, я добавил второе действие, URI, направляя читателя вернуться к странице, на которой возник запрос. Затем я привязал это действие к первому именованному действию, используя его следующее поле. Если размещение контента установлено на "inline", это делает так, что когда пользователь нажимает на ссылку печати:
- Он открывает Adobe Reader на той же вкладке и загружает файл
- Он сразу отображает диалоговое окно печати
- Как только диалог печати закрыт (попадают ли они "ОК" или "отменить" ), вкладка браузера возвращается на веб-страницу
Я смог сделать все эти изменения в Ruby достаточно легко, используя только модули File и IO; Я открыл PDF файл, который был сгенерирован с помощью внешнего инструмента, после него был добавлен xref в существующий раздел каталога, а затем добавлен новый раздел в PDF с обновленным объектом Catalog, содержащим мою специальную строку OpenAction, а также новые объекты Action.
Из-за возможностей инкрементной ревизии PDF вам не нужно вносить какие-либо изменения в существующие данные для этого, просто добавьте дополнительный раздел в конец.
Ответ 7
Почему бы не использовать пункт меню "Действия", чтобы установить это?
Выполните следующие действия. Если у вас есть Acrobat Pro, перейдите на вкладку "Страницы", щелкните правой кнопкой мыши на миниатюре для первой страницы и выберите свойства страницы. Перейдите на вкладку действий в верхней части окна и в окне выбора триггера выберите страницу. В разделе действия выберите "Выполнить пункт меню. Нажмите кнопку" Добавить ", затем выберите" Файл " > " Печать ", затем" ОК ". Нажмите" ОК" еще раз и сохраните PDF.
Ответ 8
Если вы используете prawn gem для Ruby on Rails для создания своего PDF-документа, вы можете использовать следующий дополнительный камень для активации диалоговое окно печати:
Ответ 9
Другое решение:
<input type="button" value="Print" onclick="document.getElementById('PDFtoPrint').focus(); document.getElementById('PDFtoPrint').contentWindow.print();">
Ответ 10
если вы вставляете 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>
Я надеюсь, что это поможет.