конвертировать изображения в pdf: как сделать PDF-страницы того же размера

Я сделал что-то вроде

convert -page A4 -compress A4 *.png CH00.pdf 

Но первая страница намного больше, чем на последующих страницах. Это происходит, хотя размеры изображения аналогичны. Эти изображения сканируются и обрезаются, поэтому могут иметь небольшие различия в размерах

Я думал, что -page A4 должна фиксировать размер страниц?

  • Как изменить высоту и ширину каждой страницы pdf
  • Что вы делаете для сканирования с разрешением 600 dpi при работе с небольшим выходным файлом?
  • Конвертировать PDF из цветового пространства sRGB в CMYK
  • Самый простой способ создать pdf-файл из шаблона с помощью командной строки (без pdflatex)?
  • Как создать индексы в pdf?
  • Поддерживает ли okular / poppler следующие перекрестные ссылки внутри документа в файлах PDF?
  • Манипулирование изображением pdf
  • Pdf-ридер, поддерживающий формы XFA (в то время как Adobe Reader не поддерживается в недавнем Linux)?
  • 7 Solutions collect form web for “конвертировать изображения в pdf: как сделать PDF-страницы того же размера”

    В прошлый раз, когда я использовал convert для такой задачи, я явно указал размер адресата с помощью изменения размера:

     $ i=150; convert a.png b.png -compress jpeg -quality 70 \ -density ${i}x${i} -units PixelsPerInch \ -resize $((i*827/100))x$((i*1169/100)) \ -repage $((i*827/100))x$((i*1169/100)) multipage.pdf 

    Команда convert не всегда использует DPI в качестве модуля плотности по умолчанию / формата страницы, поэтому мы явно указываем DPI с опцией -units (иначе вы можете получать разные результаты с разными комбинациями формата / формата ввода). Новый размер (заданный через -resize ) – это размер страницы формата DIN A4 в пикселях. Аргумент resize указывает максимальный размер страницы. Какое разрешение и качество выбора зависит от варианта использования – я выбрал 150 DPI и среднее качество, чтобы сэкономить некоторое пространство, пока оно не выглядит слишком плохим при печати на бумаге.

    Обратите внимание, что convert по умолчанию не меняет пропорции с операцией изменения размера:

    Изменение размера поместит изображение в запрошенный размер. Он НЕ заполняет, размер запрашиваемого ящика.

    ( Руководство по ImageMagick )

    В зависимости от версии ImageMagick и задействованных форматов ввода, возможно, опустить параметр -repage . Но иногда это требуется, и без этого параметра заголовок PDF может содержать слишком малые размеры. В любом случае, -repage не должно повредить.

    Вычисления используют целочисленную арифметику, так как bash поддерживает только это. С помощью zsh выражения можно упростить, т. zsh на $((i*8.27))x$((i*11.69)) .

    То, что вы действительно хотите использовать:

     $ convert a.png b.png -compress jpeg -resize 1240x1753 \ -extent 1240x1753 -gravity center \ -units PixelsPerInch -density 150x150 multipage.pdf 

    -extent фактически расширяет изображение до 1240×1753, в то время как -resize сохраняет соотношение изображения, 1240x... его в 1240x... или ...x1753 .

    Параметр -gravity необязателен, но может использоваться для -gravity изображения при его расширении.

    Дополнение к ответу собеседника :

    установив IM v6.6.9-7, я обнаружил, что параметр -gravity должен быть помещен между -resize и -extent чтобы иметь эффект.

    кроме того, (хотя это не было частью вопроса op), я нашел установку другого фонового цвета, который привел бы к полной команде

     convert in.jpg -resize 1240x1750 -background black -compose Copy\ -gravity center -extent 1240x1750\ -units PixelsPerInch -density 150 out.pdf 

    еще одна полезная вариация, которую я часто использую, когда я не хочу повторно масштабировать изображение, которое уже идет в правильном соотношении сторон, но сохраняет свое индивидуальное разрешение

     convert in.jpg -units PixelsPerInch -set density '%[fx:w/8.27]'\ -repage a4 out.pdf 

    где плотность мишени динамически определяется путем вычисления ширины, разделенной на 8,27 (это ширина в дюймах страницы А4). параметр -repage a4 можно пропустить большую часть времени, но у меня было несколько случаев, когда результирующий файл .pdf имел бы другой формат с плотным размером A4 размером 210×297 мм (8.27×11.6 ").

    Я нашел следующий скрипт удобным, который сочетает в себе ответы, перечисленные здесь, а также некоторые проблемы, которые я имел с вычислением с плавающей запятой:

     endInputArgs=$(($#-1)) quoted_args="$(printf " %q" "${@:1:$endInputArgs}")" output_arg="$(printf " %q" "${@:$#:1}")" ratiox=$(echo "150*8.27" | bc) ratioy=$(echo "150*11.69" | bc) bash -c "convert $quoted_args -compress jpeg -resize 1240x1753 \ -units PixelsPerInch -density 150x150 -repage ${ratiox}x${ratioy} $output_arg" 

    Сценарий вызывается (сохраняется как файл images2pdf)

     images2pdf file\ 1.jpg file\ 2.jpg file\ 3.jpg output.pdf 

    Я нашел код Михера очень полезным, однако он полностью излагает PDF как портрет или пейзаж, поэтому я изменил его, чтобы проверить компоновку каждого входного файла и сопоставить его с выходом.

    Я не включил редактирование Yotam, поскольку он работает без него в моем Ubuntu 15.04.

     $#!/bin/bash # Resizes files to A4 (or other size - change PaperWdthMetr and PaperHghtMetr below) and merges into a PDF export LOCALE=C [[ "${2}x" == "x" ]] && \ { echo "Usage: $( basename $0 ) output.pdf extension" echo " merges all files (*.extension) into a single PDF" echo "If files z_merged.pdf, z_temp.pdf or $1 exist, they will be overwritten" exit 1 } || \ OutName="$1" ext="$2" # Set basic variables unset Debug #; Debug="yes" # print extra messages IMBackground="white" # what colour for paper IMQuality="91" # JPEG compression level PaperHghtMetr="297" # milimeters, 297 for ISO A4 PaperWdthMetr="210" # milimeters, 210 for ISO A4 PaperDens="200" # maximum (wanted) dpi for a page PaperHInch=$( echo scale=5\; $PaperHghtMetr / 2.54 / 10 | bc -l ) # Inch PaperWInch=$( echo scale=5\; $PaperWdthMetr / 2.54 / 10 | bc -l ) # Inch PaperRtio=$( echo scale=5\; $PaperWdthMetr / $PaperHghtMetr | bc -l ) # Remove temporary files from prior run rm -rf z_merged.pdf z_temp.pdf 2>/dev/null # Process any $ext file in the current directory find . -maxdepth 1 -name "*.${ext}" -print0 | sort -z | while read -d '' -r FName do echo "Converting $FName" ImgIdentify=$( identify -format "%w %h" "$FName" ) ImgWdthOrig=$( echo $ImgIdentify | cut -d" " -f1 ) ImgHghtOrig=$( echo $ImgIdentify | cut -d" " -f2 ) ImgRtio=$( echo "scale=5; $ImgWdthOrig / $ImgHghtOrig" | bc -l ) # Match output page layout - Landscape or Portrait - to input file if (( $(echo "$ImgRtio > 1 && $PaperRtio > 1 || $ImgRtio < 1 && $PaperRtio < 1" |bc -l) )); then echo "Portrait" PaperHghtInch=$PaperHInch PaperWdthInch=$PaperWInch else echo "Landscape" PaperHghtInch=$PaperWInch PaperWdthInch=$PaperHInch fi [[ $( echo $ImgRtio'>'$PaperRtio | bc -l ) == 1 ]] \ && ImgDens=$( echo scale=0\; $ImgWdthOrig / $PaperWdthInch | bc -l ) \ || ImgDens=$( echo scale=0\; $ImgHghtOrig / $PaperHghtInch | bc -l ) [[ $Debug ]] && echo "ImgDens1: $ImgDens" [[ $( echo $ImgDens'>'$PaperDens | bc -l ) == 1 ]] \ && ImgDens=$PaperDens [[ $Debug ]] && echo "ImgDens2: $ImgDens" ImgWdth=$( echo $PaperWdthInch \* $ImgDens | bc -l ) # pixels ImgHght=$( echo $PaperHghtInch \* $ImgDens | bc -l ) # pixels [[ $Debug ]] && echo "ImgWdth: $ImgWdth". [[ $Debug ]] && echo "ImgHght: $ImgHght". convert "${FName}" \ -resize ${ImgWdth}x${ImgHght} \ -background $IMBackground -gravity center \ -extent ${ImgWdth}x${ImgHght} \ -units PixelsPerInch -set density $ImgDens \ -repage ${ImgWdth}x${ImgHght}+0+0 \ -compress JPEG \ -quality $IMQuality \ "${FName%.$ext}.pdf" # Merge new PDF page with prior pages [[ -f z_merged.pdf ]] && \ { pdftk z_merged.pdf "${FName%.$ext}.pdf" cat output z_temp.pdf mv z_temp.pdf z_merged.pdf } || \ cp "${FName%.$ext}.pdf" z_merged.pdf [[ $Debug ]] || rm -rf "${FName%.$ext}.pdf" done [[ -f z_merged.pdf ]] && mv z_merged.pdf "$OutName" echo "Done." 

    Я тоже боролся с этим. Основываясь на приведенной выше информации, я написал сценарий, который добавляет отсортированные в алфавитном порядке файлы изображений в один PDF-файл.

    Некоторые переменные устанавливаются внутри скрипта. Это зависит от ImageMagick и pdftk.

    NB: Если входное изображение имеет более высокое разрешение (dpi), чем требуемое разрешение output.pdf, изображение передискретируется до более низкого разрешения. В противном случае изображение не будет повторно изменено, и оно будет расширено только для того, чтобы соответствовать холсту страницы.

     #!/bin/bash export LOCALE=C [[ "${2}x" == "x" ]] && \ { echo "Usage: $( basename $0 ) output.pdf extension" echo " merges all files (*.extension) into a single PDF" echo "If files z_merged.pdf, z_temp.pdf or $1 exist, they will be overwritten" exit 1 } || \ OutName="$1" ext="$2" # Set basic variables unset Debug #; Debug="yes" # print extra messages IMBackground="white" # what colour for paper IMQuality="91" # JPEG compression level PaperWdthMetr="210" # milimeters, 210 for ISO A4 PaperHghtMetr="297" # milimeters, 297 for ISO A4 PaperDens="200" # maximum (wanted) dpi for a page PaperWdthInch=$( echo scale=5\; $PaperWdthMetr / 2.54 / 10 | bc -l ) # Inch PaperHghtInch=$( echo scale=5\; $PaperHghtMetr / 2.54 / 10 | bc -l ) # Inch PaperRtio=$( echo scale=5\; $PaperWdthMetr / $PaperHghtMetr | bc -l ) # Remove temporary files from prior run rm -rf z_merged.pdf z_temp.pdf 2>/dev/null # Process any $ext file in the current directory find . -maxdepth 1 -name "*.${ext}" -print0 | sort -z | while read -d '' -r FName do echo "Converting $FName" ImgIdentify=$( identify -format "%w %h" "$FName" ) ImgWdthOrig=$( echo $ImgIdentify | cut -d" " -f1 ) ImgHghtOrig=$( echo $ImgIdentify | cut -d" " -f2 ) ImgRtio=$( echo "scale=5; $ImgWdthOrig / $ImgHghtOrig" | bc -l ) [[ $( echo $ImgRtio'>'$PaperRtio | bc -l ) == 1 ]] \ && ImgDens=$( echo scale=0\; $ImgWdthOrig / $PaperWdthInch | bc -l ) \ || ImgDens=$( echo scale=0\; $ImgHghtOrig / $PaperHghtInch | bc -l ) [[ $Debug ]] && echo "ImgDens1: $ImgDens" [[ $( echo $ImgDens'>'$PaperDens | bc -l ) == 1 ]] \ && ImgDens=$PaperDens [[ $Debug ]] && echo "ImgDens2: $ImgDens" ImgWdth=$( echo $PaperWdthInch \* $ImgDens | bc -l ) # pixels ImgHght=$( echo $PaperHghtInch \* $ImgDens | bc -l ) # pixels [[ $Debug ]] && echo "ImgWdth: $ImgWdth". [[ $Debug ]] && echo "ImgHght: $ImgHght". convert "${FName}" \ -resize ${ImgWdth}x${ImgHght} \ -background $IMBackground -gravity center \ -extent ${ImgWdth}x${ImgHght} \ -units PixelsPerInch -set density $ImgDens \ -repage ${ImgWdth}x${ImgHght}+0+0 \ -compress JPEG \ -quality $IMQuality \ "${FName%.$ext}.pdf" # Merge new PDF page with prior pages [[ -f z_merged.pdf ]] && \ { pdftk z_merged.pdf "${FName%.$ext}.pdf" cat output z_temp.pdf mv z_temp.pdf z_merged.pdf } || \ cp "${FName%.$ext}.pdf" z_merged.pdf [[ $Debug ]] || rm -rf "${FName%.$ext}.pdf" done [[ -f z_merged.pdf ]] && mv z_merged.pdf "$OutName" echo "Done." 

    Я просто использовал что-то похожее на maxschlepzigs ответ под Ubuntu 16.04 / ImageMagick

    Это также центрирует результат

     i=300; convert a.png b.png -compress jpeg -quality 100 \ -density ${i}x${i} -units PixelsPerInch \ -resize $((i*827/100))x$((i*1169/100)) \ -gravity center \ -extent $((i*827/100))x$((i*1169/100)) multipage.pdf 
    Interesting Posts

    Сценарии Bash, запущенные из gnome / nautilus, не имеют переменных окружения

    Сортировка в обратном числовом порядке на подполе в многополевой сортировке

    Как заставить UUENCODE работать?

    Как установить последнюю версию Python на Debian отдельно или обновить?

    Редактор Kate: как определить / добавить фильтры типов файлов в диалоговом окне файлов?

    i3wm dmenu добавить файл .desktop

    Список всех пар слов, которые отображаются в строке вместе в файле

    Замена строк в большом файле

    Как отсортировать поток данных по двум именам столбцов (номер столбца может отличаться)?

    Как удалить упрямое изображение докеров?

    Назначение выходного номера на выход X

    Как загрузить пакет в мой приватный репозиторий YUM на Suse

    mint 17.2 не будет подключаться к самому сильному ssid, а вместо этого к определенному

    Что делает `env COLUMNS =% S ps …` do?

    Установленный SFTP для AWS Linux – Невозможно прочитать

    Linux и Unix - лучшая ОС в мире.