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

convert /home/bill/TempScan/*.png  myfile.pdf

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

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

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

2 ответа

Решение

convert это мощный инструмент командной строки для преобразования графики. Предположительно, это создает риски для безопасности, особенно если оно используется совместно с веб-сервером. В последних версиях Ubuntu реализован файл политики, в котором некоторые convert ограничены. По-видимому, этот файл по умолчанию запрещает "преобразовывать" несколько графических файлов в один файл PDF.

Файл политики /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" /> -->

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

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

Как пишет vanadium, вы должны изменить политику 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, вот две информационные ссылки:

Вместо того, чтобы ослаблять ограничения безопасности 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.

Решение abu_bua действительно хорошо для меня. Для удобства здесь в одной командной строке с sed:

sudo sed -i 's/rights="none" pattern="PDF"/rights="read|write" pattern="PDF"/g' /etc/ImageMagick-6/policy.xml /etc/ImageMagick-6/policy.xml

Вот еще более удобный способ, который автоматически получает местоположение (а) файла (ов) 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
Другие вопросы по тегам