Проблема с пакетным преобразованием .png в .pdf с помощью convert

Проблема с пакетным преобразованием .png в .pdf с помощью convert
convert /home/bill/TempScan/*.png  myfile.pdf

выдает сообщение об ошибке:

convert-im6.q16: not authorized `myfile.pdf' @ error/constitute.c/WriteImage/1037.

Любая помощь будет оценена по достоинству!

решение1

convertмощный инструмент командной строки для преобразования графики. Его поддержка PDF обеспечивается Ghostscript. Из-за значительногоДыра в безопасности GhostscriptДо версии 9.24 использование convertв файлах PDF было заблокировано в качестве временной меры. Проблема была исправлена ​​с версии Ghostscript 9.24. Хотя версии Ghostscript обновляются до безопасных версий во всех поддерживаемых версиях Ubuntu (на данный момент с Ubuntu 16.04 и далее), ограничение на использование может все еще действовать.

Файл политики — /etc/ImageMagick-6/policy.xml. Вы можете редактировать этот файл как пользователь root, чтобы изменить политики.

Устранение всех ограничений использования

Для пользователей настольных компьютеров, не использующих веб-сервер, простое устранение этих ограничений может быть достаточным. Для этой цели можно удалить файл, но лучше "переместить файл", переименовав его. С помощью этой команды вы переименовываете файл. В результате все политики отменяются, но вы все еще можете вернуться к ним, если необходимо:

sudo mv /etc/ImageMagick-6/policy.xml /etc/ImageMagick-6/policy.xmlout

Чтобы вернуться к исходной ситуации, просто верните исходное имя:

sudo mv /etc/ImageMagick-6/policy.xmlout /etc/ImageMagick-6/policy.xml

Помните, что перемещение файла политики снижает безопасность системы.

Устранение только ограничения на объединение в PDF

Для вашего конкретного случая gene_wood в комментарии указал на возможность выборочного смягчения политики работы с PDF-файлами, закомментировав одну строку:

<policy domain="coder" rights="none" pattern="PDF" />

Отредактируйте файл и поместите знаки комментария вокруг этой строки, чтобы отключить это правило:

<!-- <policy domain="coder" rights="none" pattern="PDF" /> -->

Если вы не хотите отменять все политики безопасности, это ваш путь.

решение2

Какванадий размещен, вам необходимо изменить политику ImageMagick.

sudo vim /etc/ImageMagick-6/policy.xml

и замените строку

<policy domain="coder" rights="none" pattern="PDF" />

с

<policy domain="coder" rights="read|write" pattern="PDF" />

Если вы хотите разрешить только запись, но не чтение, вы также можете стереть read|часть в строке выше.


Кстати, для тех, кто интересуется уязвимостью ImageMagick, вот 2 информационные ссылки:

решение3

Вместо того, чтобы снова ослаблять ограничения безопасности ImageMagick, я бы просто использовалimg2pdf.

Он специально разработан для такого рода использования.

Вам следует использовать img2pdf, если ваши приоритеты (в следующем порядке):

  • всегда без потерь:изображение, встроенное в PDF-файл, всегда будет иметь ту же цветовую информацию для каждого пикселя, что и входные данные
  • маленький:если возможно, разница в размере файла между входным изображением и выходным PDF-файлом будет только из-за накладных расходов самого контейнера PDF.
  • быстрый:если это возможно, входное изображение просто вставляется в PDF-документ «как есть» без какого-либо ресурсоемкого перекодирования пиксельных данных

Традиционное программное обеспечение для конвертации (например, ImageMagick) может:

  1. не может быть без потерь, так как перекодирование в JPEG с потерями
  2. не быть маленьким, потому что использование расточительного плоского кодирования необработанных пиксельных данных
  3. не быть быстрым, так как входные данные перекодируются

Еще одним преимуществом отсутствия необходимости перекодировать входные данные (в большинстве распространенных ситуаций) является то, что img2pdf способен обрабатывать гораздо большие объемы входных данных, чем другое программное обеспечение, поскольку необработанные пиксельные данные никогда не нужно загружать в память.

Это должна быть эквивалентная команда:

img2pdf --out myfile.pdf /home/bill/TempScan/*.png 

Если по какой-то причине вы не можете этого сделать (например, не можете установить новые пакеты), еще одним потенциальным способом конвертации без потерь может быть конвертация convertизображений в многостраничный файл TIFF и последующее использование его tiff2pdfиз инструментов libtiff.

решение4

Вот еще более удобный способ, который автоматически получает местоположение файла(ов) policy.xml и выполняет поиск/замену для всех них:

for file in `convert -list policy | grep "Path:" | grep -v built | sed 's/Path: \(.*\)/\1/g'`; do sed -i 's/domain="coder" rights="none" pattern="PDF"/domain="coder" rights="read|write" pattern="PDF"/g' $file; done

Связанный контент