преобразуйте изображения в PDF: Как сделать Страницы PDF тем же размером

Этим вопросом является подходящий вариант для Linux acl. Так как Вы не заявляете свою ОС, я приму Linux в дальнейшем. Вот сессия в качестве примера.

Я не знаю о действительно хорошем acl учебное руководство, но Вы могли сделать хуже, чем http://www.vanemery.com/Linux/ACL/linux-acl.html

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

Также обратите внимание, что необходимо смонтировать раздел, в котором Вы работаете с acl поддержка, например.

/dev/mapper/debian-acl /mnt/acl        ext3    defaults,acl        0       2

Сессия следует:

/mnt/acl$ mkdir foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: faheem
user::rwx
group::r-x
other::r-x

Установите группу foo быть staff, и набор acl группы и пользователь foo кому: rwx.

/mnt/acl$ chgrp staff foo
/mnt/acl$ setfacl -R -m u::rwx,g::rwx foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: staff
user::rwx
group::rwx
other::r-x

Значение по умолчанию набора acls пользователя и группы к rwx также. Это определяет полномочия, которым наследовались файлы и каталоги foo. Таким образом, все файлы и каталоги, созданные под нечто, будут иметь полномочия группы rw.

/mnt/acl$ setfacl -d --set u::rwx,g::rwx,o::- foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: staff
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:other::---

Теперь создайте некоторые файлы в foo как пользователи faheem и john.

/mnt/acl$ cd foo
/mnt/acl/foo$ touch bar

# switch to user john for this next command.

/mnt/acl/foo$ touch baz

Файлы списка. Заметьте что оба файла, принадлежавшие faheem и файлы, принадлежавшие john создаются с полномочиями группы rw.

/mnt/acl/foo$ ls -la
total 3
drwxrwxr-x+ 2 faheem staff  1024 May  9 01:22 .
drwxr-xr-x  4 faheem faheem 1024 May  9 01:20 ..
-rw-rw----  1 faheem faheem    0 May  9 01:20 bar
-rw-rw----  1 john   john      0 May  9 01:22 baz

47
03.09.2011, 15:36
9 ответов

В прошлый раз я использовал 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 в пикселях. Изменить размер аргумент указывает максимальный размер страницы. Какое разрешение и качество для выбора точно зависят от варианта использования - я выбрал 150 DPI и среднее качество для оставления некоторого свободного места, в то время как это не выглядит слишком плохо при печати на бумаге.

Отметьте это convert по умолчанию не изменяет соотношение сторон с изменить размер операцией:

Измените размер вместит изображение в требуемый размер. Это НЕ заполняется, требуемый размер поля.

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

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

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

Штриховые изображения

Если файлы PNG являются двухуровневыми (черно-белый иначе штриховая графика), отображает затем img2pdf инструмент приводит к превосходящим результатам по ImageMagick convert. Это означает img2pdf быстрее и приводит к меньшему PDFs.

Пример:

$ img2pdf -o multipage.pdf a.png b.png

или:

$ img2pdf --pagesize A4 -o multipage.pdf a.png b.png
63
27.01.2020, 19:34
  • 1
    при использовании -repage a4 Я получаю a invalid argument for option '-repage': a4 –  Scolytus 07.03.2014, 13:36
  • 2
    @Scolytus, в системе Fedora 19 я наблюдал подобную проблему - это кажется этим -repage больше не поддерживает имя a4. Я работал вокруг этого через арифметику оболочки: -repage $((150*8.27))x$((150*11.69)) –  maxschlepzig 07.03.2014, 17:17
  • 3
    я принимаю те магические числа, составляет 150 точек на дюйм, и A4, выраженный в единицах прежней версии? –  Michael Scheper 19.03.2015, 05:07
  • 4
    @MichaelScheper, да, точки на дюйм и дюймы. –  maxschlepzig 19.03.2015, 11:26
  • 5
    @MichaelScheper, да, точки на дюйм и дюймы. –  maxschlepzig 19.03.2015, 11:26
  • 6
    начальной загрузки Спасибо, помогите мне. На самом деле -density 150 аргумент был важен для добавления. –  dma_k 21.04.2015, 18:54

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

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

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

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

24
27.01.2020, 19:34
  • 1
    ! -extent действительно, что я хочу использовать :) - добавьте пропущенную оставленную кавычку перед - степень, Спасибо! –  brownian 17.05.2013, 15:18
  • 2
    Спасибо, я в конечном счете добавил недостающую галочку! ;-) –  caugner 28.05.2013, 14:22

Дополнение к ответу caugner:

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

дополнительно (хотя не часть o.p. вопроса) я нашел установку другого обращения цвета фона, которое приведет к общей команде

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 (который является шириной в дюйме страницы A4). -repage a4 параметр может быть опущен большую часть времени, но у меня было несколько случаев, где получающийся .pdf имел бы другой формат немного от размеров A4 210x297 мм (8.27x11.6")

9
27.01.2020, 19:34
[1181446] Я тоже с этим боролся. Основываясь на вышеприведенной информации, я написал скрипт, который добавляет в один PDF файлы изображений, отсортированные в алфавитном порядке.

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

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

1
27.01.2020, 19:34

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

endInputArgs=$(($#-1))

quoted_args="$(printf " %q" "${@:1:$endInputArgs}")"
output_arg="$(printf " %q" "${@:$#:1}")"

ratiox=$(echo "150*8.27" | bc -l)
ratioy=$(echo "150*11.69" | bc -l)

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

/редактирование: Добавлен флаг "-l" в соответствии с комментарием Таниуса для большей точности.

2
27.01.2020, 19:34

Я нашел код Михера очень полезным, однако он полностью раскрывает 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."
2
27.01.2020, 19:34

Я только что использовал что-то похожее на ответ 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
1
27.01.2020, 19:34

Я настоятельно рекомендую программу Python CLI img2pdfдля преобразования без потерь:

https://gitlab.mister-muffin.de/josch/img2pdf

Пример использования:

img2pdf img1.png img2.png -o out.pdf
5
27.01.2020, 19:34

Я хотел преобразовать изображение в размер страницы 5,00 x 8,00 дюймов(для просмотра в Adobe Reader )Вот что я сделал в ОС Ubuntu 18.04. Во-первых, выясните размер страницы, который мне нужен, вот так:

$ pdfinfo my-input.pdf

И возврат:Размер страницы :360 x 576 pts

Затем изображение конвертируется в PDF того же размера:

$ img2pdf --pagesize 360x576 -o outpage.pdf input_pic.jpg

Примечание :для установки img2pdf

$ sudo apt install img2pdf

1
27.01.2020, 19:34

Теги

Похожие вопросы