Проблема с пакетным преобразованием.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, вот две информационные ссылки:
Вместо того, чтобы
Он специально разработан для такого рода сценариев использования.
Вам следует использовать img2pdf, если ваши приоритеты (в этом порядке):
- всегда без потерь: изображение, встроенное в PDF, всегда будет иметь ту же информацию о цвете для каждого пикселя, что и вход
- маленький: если возможно, разница в размере файла между входным изображением и выходным PDF будет только накладными расходами самого контейнера PDF
- быстро: если возможно, входное изображение просто вставляется в документ PDF как есть без какого-либо требовательного к процессору перекодирования пиксельных данных
Обычное программное обеспечение для преобразования (например, ImageMagick):
- не быть без потерь, потому что перекодирование с потерями в JPEG
- не быть маленьким из-за использования расточительного плоского кодирования необработанных данных пикселей
- не быть быстрым, потому что входные данные перекодируются
Еще одно преимущество отсутствия повторного кодирования ввода (в большинстве распространенных ситуаций) заключается в том, что 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