У меня есть PNG-файл размером 1200×7200 пикселей, и я хочу разрезать его на многостраничный PDF-файл размером 8,5×11 дюймов с полями в 1 дюйм.
Для удобства вот таблица дюймов в пикселях:
Дюймы Пиксели, 72 PPI Пиксели, 300 PPI 8,5 612 2550 11 792 3300
Я пытался
# version 1
magick input.png -crop x3300 +repage -units PixelsPerInch -density 300 output.pdf
но это не оставляет полей.
Методом проб и ошибок я пришел к
# version 2
magick input.png -crop x2700 -repage 2550x3300+100+100 -units PixelsPerInch -density 300 output.pdf
но я не могу понять, почему текст на последней странице перенесен вниз (чтобы это исправить, я попытался добавить -gravity center, но это удаляет поля).
Я также не понимаю, почему для создания маржи мне подходит значение 100. Поскольку я использую -units PixelsPerInch и -density 300, я ожидаю, что 1 дюйм равен 300 пикселям, а не 100, но изменение -repage 2550x3300+100+100 на -repage 2550x3300+300+300 делает поля очень большими.
Изображение загружено сюда: https://github.com/jsx97/test/blob/main/input.png
И вот визуальное представление того, чего я хочу достичь:
Непрозрачные серые прямоугольники представляют собой нарезанные изображения. Красные стрелки обозначают поля шириной 1 дюйм.
Изображение должно простираться от верхнего левого поля шириной 1 дюйм до нижнего левого поля шириной 1 дюйм. За исключением, конечно, последней страницы, потому что оставшаяся высота исходного изображения может быть меньше 9 дюймов.
Какая версия будет использоваться, A или B, не решает пользователь. Это просто зависит от ширины и высоты изображения.
Я понимаю, что текст и изображения можно нарезать на произвольную высоту, и это не проблема.
Добавьте +repage после обрезки, затем добавьте соответствующую -page.
@ fmw42 Фред, кажется, следовать этой инструкции не составит труда, но я пробовал ее разными способами и не могу понять, какой из них вы имеете в виду, потому что ни один из результатов меня пока не устраивает. Не могли бы вы опубликовать точную команду?
magick input.png -crop x2700 +repage -repage 2550x3300+100+100 -units PixelsPerInch -density 300 output.pdf. Но это еще не проверено, и я не знаю, верны ли ваши значения -repage, значение обрезки для данного входного размера и желаемого выходного размера при заданной плотности, а также ваши поля. Я сомневаюсь, что это правильно -repage 2550x3300+100+100, поскольку вы применяете его к каждому фрагменту. Возможно, завтра мне придется изучить этот вопрос подробнее. Наверное, сегодня не хватает времени.
Каковы размеры вашего 8x11 дюймов при плотности 300 пикселей? Зачем вам это нужно в разрешении 300 dpi? Страница формата А4 будет иметь размер 595x842 пикселей и 8,27x11,69 дюйма при разрешении 72 точки на дюйм.
@KJ Я не слежу за этим. Итак, какова будет ваша команда?
@jsx Проблема с нарезкой и необходимостью поля, которое не перезаписывает границы изображения белыми полосами текстуры по краям, заключается в том, что вы не сказали, что вы хотите делать с этими плитками на границе вашего большого изображения. При обрезке верхняя и левая стороны не сливаются. Обрезка начинается с первого пикселя. Не можете ли вы просто обрезать меньший размер (на 100 пикселей меньше, чем вы хотите, поэтому на 200 меньше по ширине и высоте) и после обрезки поместить рамку в 100 пикселей вокруг плиток? Это по-прежнему не учитывает какие-либо излишки справа и снизу, которые не заполнены.
@jsx Возьмем простой пример, добавив изображение 3x3 одинакового размера. Затем попробуйте обрезать его так, как вы хотите, и проработайте детали. Затем примените ту же концепцию к своему большому изображению.
@KJ Извините, я не понимаю, почему вы хотите, чтобы плотность была 174, а не 72. Учитывая входной PNG с разрешением по умолчанию 72 dpi, выходной PDF-файл A4 имеет размер 8x11 (приблизительно) с разрешением 72 dpi, и, следовательно, кадрирование 595x842 будет быть 8x11 (приблизительно) при использовании плотности 72 dpi. Итак, если вам нужна рамка шириной 10 пикселей по всему периметру, можно обрезать ее до размера 575x824 = (595-20)x(842-20).
@jsx P.S. Поле в 1 дюйм при разрешении 72 dpi будет составлять 72 пикселя, а не 100.
Давайте продолжим обсуждение в чате.





Вот простой пример в Imagemagick. Начнем с этого изображения:
Затем я попытаюсь получить из него PDF-файл формата A4 размером 8,27x11,69 дюйма. Мне нужно обрезать так, чтобы вокруг него была граница шириной 1 дюйм при разрешении 72 dpi (поскольку входная плотность не указана в файле, предполагается, что она установлена по умолчанию и составляет 72 dpi). Таким образом, 1 дюйм будет равен 72 пикселям при разрешении 72 точки на дюйм. Таким образом, мне нужно обрезать пиксельный эквивалент 8,27x11,69 при разрешении 72 dpi, что составляет 575x824, но мне нужно вычесть поля 2x72 dpi. Итак, это 431х68. Для демонстрации я беру произвольное смещение 320+80, которое находится вокруг попугая.
Magick Cartoon_parrot.jpg -crop 431x680+320+80 +repage -bordercolor белый -border 72x72 parrot_crop_pad.pdf
http://www.fmwconcepts.com/misc_tests/parrot_crop_pad.pdf
Exiftool говорит:
Мой превью говорит:
7,99 × 11,45 дюйма
Фред, сегодня мне потребуется больше времени, чтобы понять и адаптировать ваш ответ, а пока не могли бы вы объяснить, как изменить следующую команду: magick input.png -crop x2700 -repage 2550x3300+1+1 -units PixelsPerInch -density 300 output.pdf так, чтобы смещение 1x1 добавлялось из верхнего левого угла, а не из нижнего левого?
Не можете ли вы просто добавить одну строку и один столбец в верхнюю и левую части ввода, используя -splice один раз для верхней части и один раз для левой? Тогда выполняй свою команду.
Изображения в PDF-файле применяются не через плотность, а как векторную длину их ограничивающей рамки.
В этом конкретном случае, если мы обрезаем ширину до длины, необходимой для рисованных линий размером 6,5 дюйма, мы обнаружим, что длина равна 1131 пикселю. Таким образом, мы можем заполнить изображение с желаемым внешним соотношением.
1131/6,5*8,5 = 1479 пикселей в ширину, поэтому используйте Magick или любое другое приложение, чтобы добавить достаточно пустого пространства для достижения этой ширины.
Исходные пиксели = 1204, поэтому расчет равен (1479-1204)/2 = + 137 и + 138 (без 1/2 пикселя).
Итак, возьмите исходник и добавьте 138 белых пикселей слева и 137 таких же справа.
Теперь у нас есть соотношение ширины, которое мы можем определить для высоты страницы: 1479/8,5 x 11, ОДНАКО нам нужно только 9 дюймов пикселей, а затем отступы для имитации белых пустот.
Фрагменты изображения должны иметь высоту 1479/8,5 * 9 = 1566 пикселей и 174 белых поля до и после.
Так что на последней странице будет нехватка, которую тоже нужно учесть.
Таким образом, нам нужно изображение шириной 8,5 дюймов и высотой 45 дюймов, чтобы разделить и заполнить верхнюю и нижнюю части. Не беспокойтесь о DPI, они никогда не используются внутри PDF-файла, важны итоговые значения.
convert input.png -gravity north -background white -extent 1479x7830 out.png
Следующий шаг — разделить это рабочее изображение на 5 частей (высотой 1566 пикселей) и снова заполнить их (центр тяжести), чтобы они соответствовали полю изображения PDF размером 1479 x 1914, после чего идеальные по пикселям изображения можно поместить в почтовый ящик.
convert out.png -crop 1x5-0@ tile-%d.png
Я не использую ImageMagick, чтобы узнать наиболее эффективный способ, но следующий шаг — заполнить страницы так, чтобы они соответствовали соотношению Letter Box 8,5 x 11, поэтому для каждого изображения 0–4 используйте:
convert tile-0.png -gravity center -background white -extent 1479x1914 page-0.png
or
for /L %c in (0,1,4) do convert tile-%c.png -gravity center -background white -extent 1479x1914 page-%c.png
По совпадению, внутренние страницы PDF также учитываются от 0 до n-1.
Теперь вы можете объединить все страницы в один PDF-файл и для этого использовать:
convert page-*.png -page letter result.pdf
В этом имперском случае с использованием окон для цикла (при создании не пострадали ни плотность, ни качество):
convert input.png -gravity north -background white -extent 1479x7830 out.png
convert out.png -crop 1x5-0@ tile-%d.png
for /L %c in (0,1,4) do convert tile-%c.png -gravity center -background white -extent 1479x1914 page-%c.png
convert page-*.png -page letter result.pdf
Исходное изображение имело размер 1,99 МБ (2 095 064 байта). Добавляя белый цвет и повторно сжимая, мы получаем оптимизированный для Ghostscript вывод в моей системе размером 1,12 МБ (1 178 355 байт). Проверяя с помощью оптимизатора без потерь, мы можем очень медленно улучшать сжатие с помощью /FlateDecode/Predictor 10 для окончательного размера без потерь. 1,00 МБ (1 049 492 байт). Однако имейте в виду, что дополнительное время для 5 страниц для вас означает для 100 чтений клиентов гораздо больше времени на распаковку, поэтому его следует игнорировать, когда уменьшение размера не так уж велико и расстраивает вашу читательскую аудиторию.
Может быть 4 (не 5) полноразмерных страниц, но на этот раз мы начинаем с высоты, поэтому 7204/4 = 9 дюймов, что по совпадению дает более естественные 200 пикселей на дюйм? Нам нужно сначала разделить страницы на 4, а затем преобразовать страницы в высоту 2200 пикселей без изменений. Таким образом, мы также можем выбрать поле слева, равное 200, но пока не будем устанавливать неравномерность справа, поэтому прибавим 400 к 1210:
convert input.png -crop 1x4-0@ tiles-%d.png
for /L %c in (0,1,3) do convert tiles-%c.png -gravity center -background white -extent 1610x2200 pages-%c.png
На этом этапе страницы имеют идеальный размер 8,05 x 11,00 дюймов, поэтому все, что нужно, это добавить 0,45 дюйма справа или проще равномерно на предыдущем шаге, используя ширину 1700. Поэтому я предлагаю, чтобы это было лучше всего. Наконец, аналогичное объединение в PDF:
convert pages-*.png -page letter result.pdf
Как тренер по дизайну, мне не нравится аспект «Вдова/Офан» между страницами 2 и 3, и я интуитивно знаю, что в версии B потребуется дополнительное отступ на 2 дюйма.
convert input.png -gravity north -background white -extent 1796x7606 out.png
convert out.png -crop 1x4-0@ tiles-%d.png
for /L %c in (0,1,3) do convert 4tiles-%c.png -gravity center -background white -extent 1796x2324 4pages-%c.png
convert 4pages-*.png -page letter result4us.pdf
magick input.png [+repage] -resize 1950x\> -crop x2700 +repage -background white -extent 1950x2700 -bordercolor white -border 300x300 -units PixelsPerInch -density 300 output.pdf
Соответствующее обсуждение находится на GitHub:
https://github.com/ImageMagick/ImageMagick/discussions/7402
+repage после входного файла необязательно.
@KJ Кажется, твой файл выглядит нормально, как ты его создал? «но это уродливая ошибка <ваша ссылка> добавьте отступы внизу изображения и разделите их на 5, а затем по центру в области букв 5» — Извините, не могли бы вы объяснить, что вы здесь имеете в виду?