Центрирование изображения .jpg в PDF с помощью Imagemagick? - PullRequest
6 голосов
/ 29 сентября 2011

Я использую convert версию ImageMagick 6.6.2-6 2011-03-16, и я хотел бы использовать ее для создания PDF-файла формата А4 из изображения, где изображение будет немасштабировано и отцентрировано,

Я запускаю следующее (как модификацию Наложение изображений с 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

... но, в принципе, ничего не показывает?То же самое происходит с изображением png ...

Обратите внимание, что

  • Просто 'convert -page A4 red.jpg out.pdf' работает - но изображение не центрировано;(-gravity center приводит к тому, что изображение не отображается )
  • Если изображение png, 'convert -page A4 -gravity center red.png out.pdf' действительно работает нормально

... однакоЯ бы хотел, чтобы convert встраивал содержимое потока JPEG напрямую - следовательно, я не хотел бы сначала конвертировать JPG в PNG.

Итак, можно ли будет использовать convert для непосредственного центрирования изображения JPG на странице формата A4 в формате PDF?

Заранее большое спасибо за любые ответы,
Приветствия!

EDIT2: @John Keyes ответ работает для примера выше;где изображение «меньше», чем размер PDF - однако, если изображение больше, например:

$ 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

..., тогда оно не будет выполнено.Однако получается: « если вы измените -extent на 50x50, а затем поиграете с -gravity, вы увидите изменения » - за исключением вопроса: какой степени выизменить, что изображения - или что из окончательного PDF?

Ну, получается - это размер конечного PDF ... Чтобы найти этот размер, как видит convert, проверьте страницу: Magick :: Geometry - однакообратите внимание, что «спецификации размера страницы Postscript», такие как «A4+43+43>», к сожалению, вызывают сбой convert в этом контексте ... Но по крайней мере соответствующие цифры для размера (595x842) могут быть скопированы со страницы;и, наконец, это работает:

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

... и на самом деле, часть -extent на самом деле не нужна - часть -resize важна для показа большого изображения ..

Однако проблема здесь в том, что включенное изображение, похоже, пересчитывается - однако я просто хотел бы показать его масштабированное, чтобы оно соответствовало странице, но в противном случае хотелось бы, чтобы исходный поток JPG был вставлен в файл.Поэтому я думаю, что вопрос все еще частично открыт :)

РЕДАКТИРОВАТЬ: Связано:

Ответы [ 2 ]

4 голосов
/ 29 сентября 2011

У меня отлично работает следующее:

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

, и если вы измените порядок «файлов», оно тоже будет работать:

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

Я думаю, что red.jpgпо центру, но поверх него рисуется белый.

0 голосов
/ 29 сентября 2011

Ну, это за пределами imagemagick, но вот решение в Latex, использующее пакет tikz (используя Как определить размер рисунка, чтобы он занимал остальную часть страницы? # 14514 ), который, кажется, надежно размещает изображения на странице и сохраняет их полностью:

% 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}

Обратите внимание, что класс документов letter используется для разделения каждого изображения на отдельной странице.

...