Quels sont les paramètres que je dois transmettre? La version de Ghostscript que j'utilise est 8.71.
gs \
-sDEVICE=pdfwrite \
-o foo.pdf \
/usr/local/share/ghostscript/8.71/lib/viewjpeg.ps \
-c \(my.jpg\) viewJPEG
lit my.jpg et produit foo.pdf. Vous devrez trouver où votre installation a installé le programme PostScript viewjpeg.ps
.
https://gitlab.mister-muffin.de/josch/img2pdf
Comme mentionné par PleaseStand, GhostScript décodera les données JPEG, entraînant perte de génération , ainsi que des performances "dix à cent" fois moins bonnes que img2pdf.
ImageMagick (c'est-à-dire convert
) décode et réencode également les images.
J'utilise la même ligne de commande de base qu'Henry a donnée dans sa réponse depuis un certain temps maintenant dans un simple script Bash, avec quelques ajustements.
Mon script complet convertit plusieurs images JPEG en PDF multipage, en utilisant cette commande modifiée:
gs \
-sDEVICE=pdfwrite \
-o foo.pdf \
/usr/local/share/ghostscript/9.02/lib/viewjpeg.ps \
-c "(1st.jpg) viewJPEG showpage \
(2nd.jpg) viewJPEG showpage \
(3rd.jpg) viewJPEG showpage \
(last.jpg) viewJPEG showpage"
Cela s'appelle comme ceci:
jpegs2pdf.sh output.pdf file1.jpeg [file2.jpeg [file2.jpeg [...]]]
Le problème est que cette commande utiliserait la même taille de page (par défaut) que Ghostscript (généralement Letter ou A4 en mode portrait), et chaque image JPEG sera mise à l'échelle pour s'adapter à cette largeur de page et/ou hauteur de page, étant placée dans le coin inférieur gauche .
Mon script fait que chaque page PDF PDF utilise les mêmes dimensions de page que le JPEG d'origine de la page. Pour la découverte automatique des dimensions JPEG, j'utilise la commande identify
d'ImageMagick:
identify -format "%[fx:(w)] %[fx:(h)]" some.jpeg
Voici le code du script complet:
#!/bin/bash
#
#############################################################################
#
# Shellscript to convert a set of JPEG files to a multipage PDF.
#
# Requirements: (1) Ghostscript needs to be installed on the local system.
# (2) ImageMagick needs to be installed on the local system.
#
# Usage: jpegs2pdf.sh output.pdf file1.jpeg [file2.jpeg [file2.jpeg [...]]]
#
# Copyright (c) 2007, <[email protected]>
# Use, distribute and modify without any restrictions.
#
# Versions:
# v1.0.0, Jul 12 2007: initial version
# v1.0.1, Jan 07 2011: set viewJPEG.ps path (self-compiled GS 9.02)
#
#############################################################################
outfile=$1
shift
param=""
for i in "$@" ; do
dimension=$(identify -format "%[fx:(w)] %[fx:(h)]" "${i}")
param="${param} <</PageSize [${dimension}]>> setpagedevice (${i}) viewJPEG showpage"
done
gs \
-sDEVICE=pdfwrite \
-dPDFSETTINGS=/prepress \
-o "$outfile" \
/usr/local/share/ghostscript/9.02/lib/viewjpeg.ps \
-c "${param}"
alternativement sur certaines distributions linux convert pic1.jpg pic2.jpg out.pdf
fait le travail avec des résultats mitigés
J'ai la version Ghostscript 9.1, donc la commande avec la ligne ci-dessous DIDN'T WORKED FOR ME
/usr/local/share/ghostscript/9.02/lib/viewjpeg.ps
donc j'ai modifié la commande et édité la ligne et j'ai utilisé ceci, IL A FONCTIONNÉ POUR MOI
viewjpeg.ps
Ainsi, la NOUVELLE COMMANDE MODIFIÉE IS ci-dessous:
gs \
-sDEVICE=pdfwrite \
-o foo.pdf \
viewjpeg.ps \
-c "(1st.jpg) viewJPEG showpage \
(2nd.jpg) viewJPEG showpage \
(3rd.jpg) viewJPEG showpage \
(last.jpg) viewJPEG showpage"
GhostScript est un interpréteur PostScript, il ne prend donc pas directement en charge une entrée JPEG, uniquement une sortie JPEG. Cela dit, il prend en charge la décompression JPEG (à l'exception du JPEG progressif).
Il existe un programme PostScript et un script Shell associé que vous pouvez utiliser pour tirer parti de cela appelé jpeg2eps . Pour obtenir un PDF, la plupart des systèmes ont le script pstopdf
disponible, qui exécute chacun des fichiers d'entrée (vous utiliseriez la sortie du script jpeg2eps) via GhostScript.
Sous Windows, j'ai eu du mal à convertir plusieurs jpgs en un PDF avec les réponses ci-dessus lorsque j'ai dû utiliser des chemins absolus pour le paramètre -c. J'ai constaté que je devais utiliser la double barre oblique " // "pour le séparateur de chemin de fichier. Lorsque j'utilisais le caractère"\", je recevais le message
Erreur:/ioerror dans --file ---
Voici la commande qui a fonctionné pour moi:
gswin32 -dNOPAUSE -q -sDEVICE=pdfwrite -r500 -dBATCH -sOutputFile="C:\temp\tempImageFiles\5e7e0cc2-9699-44d4-be6b-ad5cd338f012\output\test.pdf" "C:\Program Files (x86)\gs\gs9.06\lib\viewjpeg.ps" -c "(C://temp//tempImageFiles//5e7e0cc2-9699-44d4-be6b-ad5cd338f012//input//test0.jpg) viewJPEG showpage (C://temp//tempImageFiles//5e7e0cc2-9699-44d4-be6b-ad5cd338f012//input//test1.jpg) viewJPEG showpage (C://temp//tempImageFiles//5e7e0cc2-9699-44d4-be6b-ad5cd338f012//input//test2.jpg) viewJPEG showpage (C://temp//tempImageFiles//5e7e0cc2-9699-44d4-be6b-ad5cd338f012//input//test3.jpg) viewJPEG showpage (C://temp//tempImageFiles//5e7e0cc2-9699-44d4-be6b-ad5cd338f012//input//test4.jpg) viewJPEG showpage"
Et voici celui qui a généré le message d'erreur:
gswin32 -dNOPAUSE -q -sDEVICE=pdfwrite -r500 -dBATCH -sOutputFile="C:\temp\tempImageFiles\5e7e0cc2-9699-44d4-be6b-ad5cd338f012\output\test.pdf" "C:\Program Files (x86)\gs\gs9.06\lib\viewjpeg.ps" -c "(C:\temp\tempImageFiles\5e7e0cc2-9699-44d4-be6b-ad5cd338f012\input\test0.jpg) viewJPEG showpage (C:\temp\tempImageFiles\5e7e0cc2-9699-44d4-be6b-ad5cd338f012\input\test1.jpg) viewJPEG showpage (C:\temp\tempImageFiles\5e7e0cc2-9699-44d4-be6b-ad5cd338f012\input\test2.jpg) viewJPEG showpage (C:\temp\tempImageFiles\5e7e0cc2-9699-44d4-be6b-ad5cd338f012\input\test3.jpg) viewJPEG showpage (C:\temp\tempImageFiles\5e7e0cc2-9699-44d4-be6b-ad5cd338f012\input\test4.jpg) viewJPEG showpage"