Firefox: le refus d'une Autorisation pour accéder à la propriété "imprimer"
C'est un bug dans firefox. Localement, il peut être désactivé en allant à l' about:config
et définissez la propriété d' pdfjs.disabled
de vrai. Seule solution possible est d'utiliser un script côté serveur et modifier les pdf. À l'aide de php, vous pouvez utiliser fpdf et d'intégrer des extensions à mettre en œuvre js (inclunding l' print()
de la fonction) ou simplement de convertir le fichier pdf en une image, le retour de l'url et de l'imprimer. Vous pouvez utiliser FPDI de modifier le fichier pdf existant. Je vais vous donner un exemple sur la façon dont je l'ai eu à travailler avec PHP.
Génération d'un fichier PDF avec le javascript en ligne (autoprint) à l'aide de FPDI et PDF_JS
require_once('fpdf.php');
require_once('fpdi.php');
class PDF_JavaScript extends FPDI {
var $javascript;
var $n_js;
function IncludeJS($script) {
$this->javascript=$script;
}
function _putjavascript() {
$this->_newobj();
$this->n_js=$this->n;
$this->_out('<<');
$this->_out('/Names [(EmbeddedJS) '.($this->n+1).' 0 R]');
$this->_out('>>');
$this->_out('endobj');
$this->_newobj();
$this->_out('<<');
$this->_out('/S /JavaScript');
$this->_out('/JS '.$this->_textstring($this->javascript));
$this->_out('>>');
$this->_out('endobj');
}
function _putresources() {
parent::_putresources();
if (!empty($this->javascript)) {
$this->_putjavascript();
}
}
function _putcatalog() {
parent::_putcatalog();
if (!empty($this->javascript)) {
$this->_out('/Names <</JavaScript '.($this->n_js).' 0 R>>');
}
}
}
class PDF_AutoPrint extends PDF_JavaScript
{
function AutoPrint($dialog=false)
{
//Open the print dialog or start printing immediately on the standard printer
$param=($dialog ? 'true' : 'false');
$script="print($param);";
$this->IncludeJS($script);
}
function AutoPrintToPrinter($server, $printer, $dialog=false)
{
$script = "document.contentWindow.print();";
$this->IncludeJS($script);
}
}
$pdf=new PDF_AutoPrint();
$pdf->setSourceFile("mozilla.pdf");
//Open the print dialog
$tplIdx = $pdf->importPage(1, '/MediaBox');
$pdf->addPage();
$pdf->useTemplate($tplIdx, 10, 10, 90);
$pdf->AutoPrint(true);
$pdf->Output('generated.pdf', 'F');
Maintenant, vous pouvez tout simplement ajouter le pdf généré à votre page et le javascript qui fera appel à la print()
fonction. Vous n'avez même pas à l'appeler manuellement plus. Cependant, dans firefox, cela ne fonctionnera qu'avec des visibility: hidden
et non pas avec de l' display: none
.
function print_pdf(url){
var iFrameJQueryObject = $('<iframe id="iframe" src="'+url+'" style="visibility: hidden"></iframe>');
$('#foo').append(iFrameJQueryObject);
}
print_pdf('mozilla_generated.pdf');
Chrome: Erreur de Sécurité (cross-origin)
Le pdf doit être situé sur le même hôte. Firefox a été d'accord avec les autres domaines dans mes tests, mais chrome m'a donné de la croix-origine des erreurs.
Firefox: page Imprimée inclut about:blank
seulement
Vous obtiendrez une page vide dans firefox (jsfiddle), car il permet d'imprimer l'iframe avant qu'il a chargé de tout contenu. Les moyens mentionnés comme $(document).onload()
ne va pas aider, car ils n'attendez les DOM afin de charger et d' setTimeout()
peut entraîner des erreurs, puisque vous ne savez pas combien de temps il prend l'iFrame à charger.
Vous pouvez simplement résoudre ce problème à l'aide de jQuery load()
. (doc) Cela vous donnera la possibilité d'utiliser une fonction de rappel en tant que paramètre.
si un "complète" de rappel est fourni, il est exécuté après le post-traitement et HTML d'insertion a été effectuée. Le rappel est tiré une fois pour chaque élément dans le jQuery collection, et this
est définie pour chaque élément du DOM à son tour.
Exemple De Code 1
function print_pdf(url){
var id = 'iframe', html = '<iframe id="'+id+'" src="'+url+'" style="display:none"></iframe>';
$('body').append(html);
// wait for the iFrame to fully load and call the print() function afterwards
$('#' + id).load(function () {
document.getElementById(id).contentWindow.print();
});
}
Vous pouvez également créer directement un objet jQuery et l'utilisation de jQuery on()
(doc) pour attacher un gestionnaire d'événement.
Exemple de Code 2 (jsfiddle)
function print_pdf(url){
var iFrameJQueryObject = $('<iframe id="iframe" src="'+url+'" style="display:none"></iframe>');
$('body').append(iFrameJQueryObject);
iFrameJQueryObject.on('load', function(){
$(this).get(0).contentWindow.print();
});
}