Наиболее вероятная причина, по которой ваши изображения "нарезаются" после их извлечения, заключается в следующем: они были "нарезаны" еще до их извлечения, так как они живут внутри самого файла PDF.< /сильный>
Не спрашивайте меня, почему некоторые программы для создания PDF делают это.
MS Powerpoint печально известен этим - фоновые изображения, демонстрирующие некоторый градиент, часто нарезаются на десятки тысяч 1x1
, 1x2
или 1x8
пикселей и мини-изображения аналогичного размера внутри PDF.
Обновлять
1. Определите масштаб проблемы
Фрагменты изображения образца PDF можно идентифицировать с помощью команды pdfimages -list
(для этого требуется последняя версия pdfimages
, основанная на форке Poppler, а не xpdf
!):
pdfimages -list so-28023312-test1.pdf
page num type width height color comp bpc enc interp objectID x-ppi y-ppi size ratio
------------------------------------------------------------------------------------------
1 0 image 271 271 rgb 3 8 jpeg no 18 0 163 163 26.7K 12%
1 1 image 271 271 rgb 3 8 jpeg no 19 0 163 163 21.7K 10%
1 2 image 271 271 rgb 3 8 jpeg no 30 0 163 163 22.9K 11%
1 3 image 271 271 rgb 3 8 jpeg no 31 0 163 163 21.8K 10%
1 4 image 132 271 rgb 3 8 jpeg no 32 0 162 163 9895B 9.2%
1 5 image 271 271 rgb 3 8 jpeg no 33 0 163 163 22.5K 10%
1 6 image 271 271 rgb 3 8 jpeg no 34 0 163 163 16.5K 7.7%
1 7 image 271 271 rgb 3 8 jpeg no 35 0 163 163 16.9K 7.9%
1 8 image 271 271 rgb 3 8 jpeg no 36 0 163 163 20.3K 9.4%
1 9 image 132 271 rgb 3 8 jpeg no 37 0 162 163 14.5K 14%
1 10 image 271 271 rgb 3 8 jpeg no 20 0 163 163 17.1K 8.0%
1 11 image 271 271 rgb 3 8 image no 21 0 163 163 107K 50%
1 12 image 271 271 rgb 3 8 image no 22 0 163 163 96.7K 45%
1 13 image 271 271 rgb 3 8 image no 23 0 163 163 119K 56%
1 14 image 132 271 rgb 3 8 jpeg no 24 0 162 163 10.7K 10%
1 15 image 271 99 rgb 3 8 jpeg no 25 0 163 161 7789B 9.7%
1 16 image 271 99 rgb 3 8 jpeg no 26 0 163 161 6456B 8.0%
1 17 image 271 99 rgb 3 8 jpeg no 27 0 163 161 7202B 8.9%
1 18 image 271 99 rgb 3 8 jpeg no 28 0 163 161 8241B 10%
1 19 image 132 99 rgb 3 8 jpeg no 29 0 162 161 5905B 15%
Поскольку на 1 странице всего 20 разных фрагментов, легко...
- ...сначала извлеките их все и конвертируйте в JPEG, а затем
- ...затем снова сшейте их вместе.
2. Извлеките фрагменты в формате JPEG.
Следующая команда извлечет фрагменты и попытается сохранить их в формате JPEG (-j
) 28023312:
pdfimages so-28023312-test1.pdf 28023312
Есть 3 изображения, которые вышли как PPM. Используйте ImageMagick convert
, чтобы сделать из них JPEG (не обязательно, но упрощает командную строку «сшивки»:
for i in 11 12 13; do
convert 28023312-0${i}.ppm 28023312-0${i}.jpg
done
Вот первые три фрагмента, 280233312-000.jpg, 280233312-001.jpg и 280233312-002.jpg:
3. Снова сшейте 20 фрагментов вместе.
ImageMagick может снова сшить 20 изображений вместе. Глядя на страницу PDF, а также на 20 файлов JPEG, легко определить порядок, в котором они должны быть объединены:
convert \
\( 28023312-0{00,01,02,03,04}.jpg +append \) \
\( 28023312-0{05,06,07,08,09}.jpg +append \) \
\( 28023312-0{10,11,12,13,14}.jpg +append \) \
\( 28023312-0{15,16,17,18,19}.jpg +append \) \
-append \
complete.jpg
Разбор команды:
оператор изображения +append
добавляет все перечисленные изображения в горизонтальном порядке.
Строки \( ... \)
указывают на обработку в стороне соответствующей части стека изображений (которая должна быть разделена экранированными круглыми скобками). Результат этой горизонтальной операции добавления затем заменит отдельные фрагменты внутри текущего стека изображений.
Последний -append
оператор изображения добавляет текущие изображения по вертикали.
Вот получившийся JPEG, снова полностью сшитый вместе:
Можно ли это автоматизировать?
Теоретически мы могли бы автоматизировать этот процесс. Для этого нам пришлось бы проанализировать исходный код PDF. Однако это довольно сложно, поскольку поток контента может быть сжат.
Чтобы распаковать все или большую часть потоков контента и получить более четкое представление структуры файла PDF, мы могли бы использовать mutool clean -d
, podofouncompress
или qpdf --qdf
.
Я предпочитаю qpdf, 'структурный преобразователь файлов PDF с сохранением содержимого '. Вот команда:
qpdf --qdf --object-streams=disable so-28023312-test1.pdf qdf.pdf
Полученный PDF-файл qdf.pdf
легче анализировать, поскольку большинство (но не все) ранее двоичные разделы теперь представлены в кодировке ASCII. Когда вы будете искать вхождения Do
внутри этого файла, вы увидите, где вставлены изображения (однако, я не могу дать вам полное руководство по анализу PDF здесь, извините...).
Следующая команда выводит все строки, в которых встречается Do
, плюс предыдущая строка (-B 1
):
grep -a -B 1 " Do" qdf.pdf
1002 0 0 1002 236 5776.67 cm
/Im0 Do
--
1001 0 0 1002 1237 5776.67 cm
/Im1 Do
--
120.12 0 0 120.24 268.44 693.2004 cm
/Im2 Do
--
[...skipping 15 other output segments...]
--
1002 0 0 369 3237 3406.67 cm
/Im18 Do
--
490 0 0 369 4238 3406.67 cm
/Im19 Do
--
1 0 0 1 204.9037018 508.5130005 cm
/Fm0 Do
Все строки /ImNN Do
вставляют изображения (строка /Fm0 Do
относится к объекту формы, а не к изображению).
Предыдущие строки, например 490 0 0 369 4238 3406.67 cm
, устанавливают текущую матрицу преобразования. Только по этой линии иногда можно сделать вывод о положении изображения и его размере. В случае с этим файлом этого недостаточно — для определения текущей «позиции рисования» потребуется содержимое нескольких предшествующих строк.
person
Kurt Pfeifle
schedule
19.01.2015