Печать Pdf из тега javascript embed

У меня есть файл PDF, и я пытаюсь распечатать его через Javascript. Я пробовал этот трюк: Тихая печать встроенного PDF, однако функция печати никогда не становится доступной, она всегда undefined.

Я пробовал трюк Iframe с помощью этого кода:

function printPDF() {
if(document.getElementById("pdfDocument").contentWindow.document.readyState === "complete") {   
    document.getElementById("pdfDocument").focus();
    document.getElementById("pdfDocument").contentWindow.print();
} else {
    setInterval(printPDF(), 1000);
}
}

(pdfDocument - это идентификатор iframe). Это открывает диалог печати, но печатает пустую страницу. Мне бы очень хотелось, чтобы метод embed tag работал. Но почему функция печати никогда не становится доступной?

Большинство сообщений на эту тему довольно старые. Каков наилучший способ HTML5/jQuery? (или просто регулярный JS в этой точке)

EDIT:

вот код JS для тега embed:

function printPDF() {
alert(document.getElementById("pdfDocument").print);
//Wait until PDF is ready to print    
 if (typeof document.getElementById("pdfDocument").print == 'undefined') {
     setTimeout(function(){printPDF();}, 1000);
 } else {
     var x = document.getElementById("pdfDocument");
     x.print();
 }
}

Это постоянно меняет "undefined" каждую секунду. Опция "Печать" недоступна. Любые идеи?

Ответ 1

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

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

  • Во всех браузерах мне не удалось вызвать какой-либо метод print() через Javascript, я смог использовать PdfActions. OPENACTION будет вызывать печать. Я вложил их в PDF с помощью iText.

  • Chrome использует Adobe viewer, который не предоставляет доступ к любому типу метода print(), но выполняет PdfActions, встроенный в PDF. Таким образом, вы можете вставлять "OpenAction" в PDF файл и распечатывать PDF-запрос всякий раз, когда он открывается из любого приложения, которое просматривает эти действия.

  • Firefox (выше определенной версии, все последние версии) использует средство просмотра Adobe в Windows, которое также распознает PdfActions. Тем не менее, в OSX он теряет поддержку просмотра Adobe и переключается на запеченный в Firefox viewer (pdf.js). Что не поддерживает PdfActions.

  • IE: Я не очень много тестировал IE. В основном потому, что я отказался от печати PDF из Javascript после того, как Firefox не работал на OSX (для меня это не так).

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

Он не отвечает на вопрос, но все, что у меня есть. Мое предложение всем, кто может найти это в будущем: в этом случае PDF файл, если возможно, станет проще. В противном случае, пожалуйста, обновите этот вопрос, если вы знаете, как вызвать print() через Javascript в FF preview pdf viewer в OSX.

-Phil

Ответ 2

С Javascript я не уверен, что мы сможем это сделать. Однако может быть достигнуто с помощью script инъекции в файл pdf. Если мое понимание правильное, это то, что делает Google.

Например.

  • Откройте URL: https://drive.google.com/viewerng/viewer?url=http://www.energy.umich.edu/sites/default/files/pdf-sample.pdf
  • Теперь щелкните значок печати. ​​
  • Как вы видите, открывается новое окно с командой печати, введенной в pdf. После загрузки PDF запускается встроенная команда печати. Вы можете видеть, что печать срабатывает всякий раз, когда вы обновляете страницу. Это означает, что поведение печати связано с событием загрузки документа.

Мы можем использовать iTextSharp для моделирования поведения выше.

Ответ 3

Существует способ визуализации всего pdf в браузере (вместо встраивания внешнего приложения), который дает вам полный доступ к API-интерфейсам браузера в отношении pdf.

Это реализация Mozilla pdf в JavaScript: https://github.com/mozilla/pdf.js/
И это витрина: http://mozilla.github.io/pdf.js/web/viewer.html (обратите внимание на кнопку печати в правом верхнем углу).

Ознакомьтесь с кодом зрителя здесь, чтобы узнать, как это работает: https://github.com/mozilla/pdf.js/blob/master/web/viewer.js

На минусовой стороне - это будет сложнее, чем просто вложение.
С положительной стороны это действительно сработает.