La finestra di dialogo di stampa di un file PDF può essere aperta con Javascript?

So come aprire una pagina Web in una nuova finestra e aggiungere javascript per far apparire la finestra di dialogo di stampa. C’è un modo per fare una cosa simile con un file PDF?

Si, puoi…

I PDF hanno il supporto Javascript. Avevo bisogno di avere capacità di stampa automatica quando è stato creato un PDF generato da PHP e sono stato in grado di utilizzare FPDF per farlo funzionare:

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

Di solito faccio qualcosa di simile all’approccio fornito da Come usare JavaScript per stampare un PDF (eHow.com) , usando un iframe .

  1. una funzione per ospitare il trigger di stampa …

     function printTrigger(elementId) { var getMyFrame = document.getElementById(elementId); getMyFrame.focus(); getMyFrame.contentWindow.print(); } 
  2. un pulsante per dare all’utente l’accesso …

    (un onClick su un button o di un input o qualsiasi altra cosa desideri)

      
  3. un iframe che punta al tuo PDF …

      

Idea bonus n. 1 : crea l’ iframe e aggiungilo alla tua pagina all’interno di printTrigger(); in modo che il PDF non venga caricato fino a quando l’utente non fa clic sul pulsante “Stampa”, quindi il javascript può attaccare! l’iframe e triggers la finestra di dialogo di stampa.


Idea bonus n. 2 – Credito extra se disabiliti il ​​pulsante “Stampa” e offri all’utente una piccola rotellina di caricamento o qualcosa dopo aver fatto clic su di esso, in modo che sappiano che qualcosa è in corso anziché fare clic ripetutamente!

Abbiamo appena capito come farlo all’interno del PDF stesso: se possiedi acrobat pro, vai alla scheda delle tue pagine, fai clic con il pulsante destro del mouse sulla miniatura per la prima pagina e fai clic sulle proprietà della pagina. Fai clic sulla scheda delle azioni nella parte superiore della finestra e sotto Seleziona trigger scegli la pagina aperta. Sotto seleziona azione scegli “Esegui javascript”. Quindi nella finestra di JavaScript, digita questo:

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

Questo stamperà il tuo documento senza un dialogo con la stampante predefinita sulla tua macchina. Se si desidera la finestra di dialogo di stampa, modificare bUI su true, bSilent su false e, facoltativamente, rimuovere il restringimento per adattarlo ai parametri.

Stampa automatica PDF!

Uso l’ named action invece di javascript perché javascript è spesso disabilitato e, in caso contrario, viene visualizzato un avviso.

La mia applicazione web crea un file postscript che viene convertito con ghostscript in un pdf. Voglio che venga stampato automaticamente perché l’utente ha già fatto clic sulla stampa all’interno della mia applicazione. Con le informazioni sulle azioni nominate da @DSimon sopra, ho cercato come risolvere questo. Tutto si riduce per inserire la stringa /Type /Action /S /Named /N /Print nel posto giusto nel pdf.

Stavo pensando di scrivere una piccola utility, ma deve analizzare il pdf per trovare il nodo root, inserire /OpenAction con un riferimento ad un object con l’azione, e ricalcolare i byte-offset in xrif.

Ma poi ho scoperto il pdfmark che è un’estensione al postscript da esprimere, nella syntax di postscript, idiomi che vengono convertiti in pdf dal distillatore di Adobes o da ghostscript.

Dato che sto già usando ghostscript, tutto ciò che devo fare è aggiungere quanto segue alla fine del mio file postscript:

 %AUTOPRINT [ /_objdef {PrintAction} /type /dict /OBJ pdfmark [ {PrintAction} << /Type /Action /S /Named /N /Print >> /PUT pdfmark [ {Catalog} << /OpenAction {PrintAction} >> /PUT pdfmark 

e ghostscript creerà l’azione, la collegherà e calcolerà gli offset xrif. (Nel poscritto % è un commento e PrintAction è il mio nome per l’object)

Guardando il PDF vedo che ha creato questo:

 1 0 obj <> endobj 9 0 obj <>endobj 

1 0 è l’object 1, la revisione 0 e 9 0 è l’object 9, la revisione 0. Nel pdf-trailer si dice che è l’object 1 che è il nodo radice. Come puoi vedere c’è un riferimento dall’object 1, /OpenAction per eseguire l’object 9 revisione 0.

Con ghostscript è ansible convertire un pdf in postscript (pdf2ps), aggiungere il testo sopra e convertirlo in pdf con ps2pdf . Va notato che le meta-informazioni sul pdf sono perse in questa conversione. Non ho cercato di più in questo.

Esempio di codice di incorporamento:

   

Potrebbe essere necessario scherzare con i nomi / id. Usando Adobe Reader …

Se sai come sono strutturati i file PDF (o sei disposto a passare un po ‘di tempo a leggere le specifiche), puoi farlo in questo modo.

Utilizzare l’azione denominata “Stampa” nel campo OpenAction dell’object Catalog; l’azione “Stampa” non è documentata, ma Acrobat Reader e la maggior parte degli altri principali lettori lo capiscono. Un buon vantaggio di questo approccio è che non si ricevono avvisi JavaScript. Vedi qui per i dettagli: http://www.gnostice.com/nl_article.asp?id=157

Per renderlo ancora più brillante, ho aggiunto una seconda azione, URI, indirizzando il lettore a tornare alla pagina che ha originato la richiesta. Quindi ho collegato questa azione alla prima azione denominata utilizzando il campo successivo. Con la disposizione del contenuto impostata su “in linea”, questo rende ansible che quando l’utente fa clic sul collegamento di stampa:

  1. Apre Adobe Reader nella stessa scheda e carica il file
  2. Mostra immediatamente la finestra di dialogo di stampa
  3. Non appena viene chiusa la finestra di dialogo Stampa (sia che premano “OK” o “Annulla”), la scheda del browser torna alla pagina Web

Sono stato in grado di fare tutte queste modifiche in Ruby abbastanza facilmente usando solo i moduli File e IO; Ho aperto il PDF che avevo generato con uno strumento esterno, seguito l’xrif alla sezione Catalogo esistente, quindi ho aggiunto una nuova sezione al PDF con un object Catalogo aggiornato contenente la mia speciale linea OpenAction e anche i nuovi oggetti Action.

A causa delle funzionalità di revisione incrementale del PDF, non è necessario apportare alcuna modifica ai dati esistenti per farlo, basta aggiungere una sezione aggiuntiva alla fine.

Perché non utilizzare l’opzione di menu Azioni per impostarlo?

Procedere come segue: Se si dispone di Acrobat Pro, accedere alla scheda delle pagine, fare clic con il pulsante destro del mouse sulla miniatura per la prima pagina e fare clic sulle proprietà della pagina. Fai clic sulla scheda delle azioni nella parte superiore della finestra e sotto Seleziona trigger scegli la pagina aperta. Sotto seleziona azione seleziona ‘Esegui una voce di menu’ . Fare clic sul pulsante Aggiungi quindi selezionare “File> Stampa”, quindi OK. Fare nuovamente clic su OK e salvare il PDF.

Se stai utilizzando la gem di gamberi per Ruby on Rails per generare il tuo PDF, puoi utilizzare la gem seguente per triggersre la finestra di dialogo di stampa:

gamberi-print

Un’altra soluzione:

  

se incorpori il pdf nella tua pagina web e fai riferimento all’id object, dovresti riuscire a farlo.

per esempio. nel tuo HTML:

  

nella tua javascript:

  

Spero che aiuti.