Нарезка высокого изображения в многостраничный PDF-файл

У меня есть 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, не решает пользователь. Это просто зависит от ширины и высоты изображения.


Я понимаю, что текст и изображения можно нарезать на произвольную высоту, и это не проблема.

@KJ Кажется, твой файл выглядит нормально, как ты его создал? «но это уродливая ошибка <ваша ссылка> добавьте отступы внизу изображения и разделите их на 5, а затем по центру в области букв 5» — Извините, не могли бы вы объяснить, что вы здесь имеете в виду?

user25418595 13.06.2024 00:32

Добавьте +repage после обрезки, затем добавьте соответствующую -page.

fmw42 13.06.2024 00:39

@ fmw42 Фред, кажется, следовать этой инструкции не составит труда, но я пробовал ее разными способами и не могу понять, какой из них вы имеете в виду, потому что ни один из результатов меня пока не устраивает. Не могли бы вы опубликовать точную команду?

user25418595 13.06.2024 00:54
magick input.png -crop x2700 +repage -repage 2550x3300+100+100 -units PixelsPerInch -density 300 output.pdf. Но это еще не проверено, и я не знаю, верны ли ваши значения -repage, значение обрезки для данного входного размера и желаемого выходного размера при заданной плотности, а также ваши поля. Я сомневаюсь, что это правильно -repage 2550x3300+100+100, поскольку вы применяете его к каждому фрагменту. Возможно, завтра мне придется изучить этот вопрос подробнее. Наверное, сегодня не хватает времени.
fmw42 13.06.2024 01:00

Каковы размеры вашего 8x11 дюймов при плотности 300 пикселей? Зачем вам это нужно в разрешении 300 dpi? Страница формата А4 будет иметь размер 595x842 пикселей и 8,27x11,69 дюйма при разрешении 72 точки на дюйм.

fmw42 13.06.2024 01:06

@KJ Я не слежу за этим. Итак, какова будет ваша команда?

fmw42 13.06.2024 01:42

@jsx Проблема с нарезкой и необходимостью поля, которое не перезаписывает границы изображения белыми полосами текстуры по краям, заключается в том, что вы не сказали, что вы хотите делать с этими плитками на границе вашего большого изображения. При обрезке верхняя и левая стороны не сливаются. Обрезка начинается с первого пикселя. Не можете ли вы просто обрезать меньший размер (на 100 пикселей меньше, чем вы хотите, поэтому на 200 меньше по ширине и высоте) и после обрезки поместить рамку в 100 пикселей вокруг плиток? Это по-прежнему не учитывает какие-либо излишки справа и снизу, которые не заполнены.

fmw42 13.06.2024 01:46

@jsx Возьмем простой пример, добавив изображение 3x3 одинакового размера. Затем попробуйте обрезать его так, как вы хотите, и проработайте детали. Затем примените ту же концепцию к своему большому изображению.

fmw42 13.06.2024 01:49

@KJ Извините, я не понимаю, почему вы хотите, чтобы плотность была 174, а не 72. Учитывая входной PNG с разрешением по умолчанию 72 dpi, выходной PDF-файл A4 имеет размер 8x11 (приблизительно) с разрешением 72 dpi, и, следовательно, кадрирование 595x842 будет быть 8x11 (приблизительно) при использовании плотности 72 dpi. Итак, если вам нужна рамка шириной 10 пикселей по всему периметру, можно обрезать ее до размера 575x824 = (595-20)x(842-20).

fmw42 13.06.2024 01:56

@jsx P.S. Поле в 1 дюйм при разрешении 72 dpi будет составлять 72 пикселя, а не 100.

fmw42 13.06.2024 02:02

Давайте продолжим обсуждение в чате.

fmw42 13.06.2024 02:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
11
149
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вот простой пример в 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 говорит:

  • EmbeddedImageWidth: 575
  • Встроенное изображениеHeight: 824

Мой превью говорит:

7,99 × 11,45 дюйма

Фред, сегодня мне потребуется больше времени, чтобы понять и адаптировать ваш ответ, а пока не могли бы вы объяснить, как изменить следующую команду: magick input.png -crop x2700 -repage 2550x3300+1+1 -units PixelsPerInch -density 300 output.pdf так, чтобы смещение 1x1 добавлялось из верхнего левого угла, а не из нижнего левого?

user25418595 14.06.2024 09:47

Не можете ли вы просто добавить одну строку и один столбец в верхнюю и левую части ввода, используя -splice один раз для верхней части и один раз для левой? Тогда выполняй свою команду.

fmw42 14.06.2024 17:41

Изображения в 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 после входного файла необязательно.

Другие вопросы по теме