2011-09-28 5 views
6

Sto usando convert versione 6.6.2-6 ImageMagick 2011-03-16, e vorrei usarlo per generare un pdf A4 da un'immagine, in cui l'immagine sarà non-scala e centrata.Centrare un'immagine .jpg in PDF usando Imagemagick?

sto correndo il seguente (come una modifica del Overlaying Images with ImageMagick):

# generate a 100x100 JPG with just red color 
convert -size 100x100 xc:red red.jpg 

# generate PDF from JPG 
convert -page A4 xc:white red.jpg -gravity center -composite -format pdf out.pdf 

... ma, in fondo, non mostra? Stessa cosa accade per un immagine png ...

Nota che

  • Just 'convert -page A4 red.jpg out.pdf' funziona - ma l'immagine non è centrata; (-gravity center causa immagine non mostrare)
  • Se l'immagine è png, 'convert -page A4 -gravity center red.png out.pdf' effettivamente funziona bene

... però, mi piacerebbe convert per incorporare i contenuti del flusso JPEG direttamente - quindi, non vorrei prima convertire JPG in PNG.

Così, sarebbe possibile utilizzare convert per centrare un immagine JPG in una pagina PDF A4 direttamente?

Molte grazie in anticipo per qualsiasi risposta,
Cheers!

 

EDIT2: @ John Keyes risposta lavora per l'esempio di cui sopra; dove l'immagine è "piccolo" rispetto alla dimensione PDF - se l'immagine è più grande, ad es .:

$ convert -size 1228x1706 -background \#f44 -rotate 45 gradient:\#f00-\#fff red.jpg 
$ identify red.jpg 
red.jpg JPEG 2075x2075 2075x2075+0+0 8-bit DirectClass 120KB 0.000u 0:00.000 

... allora sarà sicuro. Tuttavia, si scopre: "if you change -extent to 50x50, then play with -gravity, you'll see changes" - ad eccezione, la domanda è: che misura si fa a cambiare, quella dell'immagine - o quella del PDF finale?

Beh, si scopre - è l'entità del PDF finale ... Per scoprire che taglia come convert vede, controllare la pagina: Magick::Geometry - tuttavia, notare che i "Dati PostScript formato della pagina" come "A4+43+43> "Purtroppo, causare convert a crash in questo contesto ... Ma almeno i rispettivi numeri per le dimensioni (595x842) possono essere copiati dalla pagina; e, infine, questo funziona:

convert -page A4 -gravity center -resize 595x842 -extent 595x842 red.jpg out.pdf 

... e in realtà, la parte -extent non è realmente necessario - la parte -resize è quella importante avere la grande mostra immagine ..

Tuttavia, il problema qui è che l'immagine inclusa sembra essere ricampionata - tuttavia, mi piacerebbe solo mostrarla ridimensionata in modo che si adatti alla pagina, ma altrimenti vorrebbe che lo stream JPG originale venga inserito nel file ..Quindi credo che la questione è ancora parzialmente aperta :)

EDIT: Correlati:

risposta

4

Le seguenti opere perfettamente per me :

convert -page A4 red.jpg -gravity center -format pdf out.pdf 

e se si cambia l'ordine dei "file" funziona troppo:

convert -page A4 red.jpg xc:white -gravity center -composite -format pdf out.pdf 

Penso che la red.jpg è centrato ma il bianco è disegnata su di esso.

+0

Impressionante: molte grazie, @John Keyes! Avrei giurato di aver già provato qualcosa con '-format pdf' e ho fallito; ma sto provando la tua prima linea di comando e funziona benissimo! :) Grazie ancora - grazie! – sdaau

+0

Prego. Sono andato più volte nella tana del coniglio delle opzioni ImageMagick. –

+1

Questo non funziona con le immagini di grandi dimensioni (Versione 6.9.2), nel mio caso la conversione di 5 MByte JPEG. Produce solo una pagina vuota. Senza l'opzione del "centro di gravità" funziona, ma non è centrata, ovviamente. Sembra essere un problema aperto: https://www.imagemagick.org/discourse-server/viewtopic.php?t=22759 – mischka

0

Bene, questo è al di fuori di ImageMagick, ma qui è una soluzione in lattice, utilizzando tikz pacchetto (usando How to define a figure size so that it consumes the rest of a page? #14514), che sembra porre in modo affidabile le immagini a pagina, e li conserva pienamente:

% note: need to run pdflatex twice!! First time generates blank pages! 
% convert -size 1228x1706 -background \#f44 -rotate 45 gradient:\#f00-\#fff red.jpg 
% convert -size 595x1400 xc:red redlong.jpg 

\documentclass[a4paper]{letter} 

\usepackage{graphicx} 
\usepackage[hmargin=0.5cm,vmargin=0.5cm]{geometry} % sets page margins 

\usepackage{tikz} 
\usetikzlibrary{calc} 

\newcommand{\imagepage}[1]{ 
\tikz[overlay,remember picture]\coordinate (image-start); \par 
\vfill 
\null\hfill 
\begin{tikzpicture}[overlay,remember picture] 
    \path let \p0 = (0,0), \p1 = (image-start) in 
    node [inner sep=0pt,outer sep=0pt,anchor=center] at (current page.center) {% 
     \pgfmathsetmacro\imgheight{\y1-\y0}% 
     \includegraphics[height=\imgheight pt,width=\textwidth,keepaspectratio]{#1}% 
    }; 
\end{tikzpicture}% 
} 



\begin{document} 


% there must be a \n\n after {letter!} 
\begin{letter} 

    \imagepage{red.jpg} 
\end{letter} 


\begin{letter} 

    \imagepage{redlong.jpg} 
\end{letter} 

% see also \resizebox{\textwidth}{!}{\includegraphics{red.jpg}} 
\end{document} 

Nota , la classe di documento letter viene utilizzata per consentire che ogni immagine venga divisa in una pagina separata.