2011-01-28 3 views
16

Sto usando l'API della libreria Ghostscript (eseguendo il wrapping da C#) per stampare documenti PDF dalla mia applicazione.
Con i parametri "-dFirstPage" e "-dLastPage" Sono in grado di selezionare un intervallo di pagine da stampare, ma per quanto riguarda il numero totale di pagine di un PDF?Ghostscript: PDF totale pagine

Non è molto bello consentire a un utente di selezionare un intervallo di pagine da 2 a 10 quando, diciamolo, il documento PDF ha solo 4 pagine.

Considerare che sto utilizzando la libreria Ghostscript tramite la chiamata alla libreria API gsapi_init_with_args.

+1

I PDF DEVONO dichiarare il loro numero di pagine nel loro catalogo di metadati. Potresti anche andare via come * gs -q -c "(in.pdf) (r) file runpdfbegin pdfpagecount = quit" * per fare in modo che Ghostscript contenga le pagine. –

+0

@pipitas Ciao e grazie per il tuo aiuto; se ho capito, devo usare "(in.pdf) (r) file runpdfbegin pdfpagecount = quit" come parametro di input di una chiamata GS? Se sì, "in.pdf" sarà il file di input, ma che dire di "(r)"? Grazie ancora. – lorenzoff

+0

Basta usare '(r)' così com'è. È una macro interna di Ghostscript che dice a Ghostscript di leggere/eseguire il file '(in.pdf)' ... Sì, l'unica variabile è 'in.pdf' - sostituiscila con [percorso +] nomefile del tuo PDF. –

risposta

31

Ghostscript può contare e visualizzare il numero di pagine di un PDF su stdout. La riga di comando è

gswin32c^
    -q^
    -dNODISPLAY^
    -c "(input.pdf) (r) file runpdfbegin pdfpagecount = quit" 

Qui tutte le cose -c "..." è una linea di comando frammento di PostScript (usando un paio di GS estensioni ai comandi interni). E input.pdf è il nome file PDF (potrebbe anche essere un percorso completo come (c:/path/to/my.pdf)).

Tuttavia, uno strumento migliore e più veloce per questo tipo di lavoro sarebbe quella di utilizzare pdfinfo (parte dei Xpdf-utility, disponibile anche su Windows).


Aggiornamento:

@ebyrob vuole sapere se si può modificare la mia linea di comando esempio in modo che esso anche display il PDF in una sola operazione. Prova questo:

gswin32c^
    -q^
    -c "(input.pdf) (r) file runpdfbegin pdfpagecount ="^
    -f input.pdf 

Beh, non è una singola operazione - è solo due diverse operazioni in una singola riga di comando.

+0

Grazie ancora – lorenzoff

+0

Potrebbe essere modificato per leggere i metadati mentre viene visualizzata l'immagine PDF in un'unica operazione? (Dire con '-sDEVICE = display' e amici specificati) E anche, quando si legge il file da' stdin'? (es: gswin32 nomefile di '-') Solo in esecuzione:' -c "pdfpagecount" 'sembrava darmi un errore" l'operazione non esiste ". Includendo 'runpdfbegin' mi gioco il nome del file non valido. –

+0

@ebyrob: hai bisogno di ogni singolo carattere nel mio esempio di comando (puoi solo cambiare * * input.pdf * 'in un percorso file o percorso esistente diverso. Non puoi semplicemente saltare qualsiasi parte come vuoi ... –

0

Ho provato a fare questo script:

gswin32c^
    -q^
    -c "(input.pdf) (r) file runpdfbegin pdfpagecount ="^
    -f input.pdf 

lavoro in un C# avvolto soluzione e continuato a ottenere l'errore "/ undefinedfilename". In questo caso, assicurarsi che il percorso del file abbia barre "/" come DirectorySeperator e non barre rovesciate "\". So che Kurt Pfeifle l'ha già scritto, ma è successo a me che l'ho semplicemente trascurato.

+0

Se si desidera utilizzare i backslash, è necessario utilizzare due di essi ogni volta ... –