convert /home/bill/TempScan/*.png myfile.pdf
dá mensagem de erro:
convert-im6.q16: not authorized `myfile.pdf' @ error/constitute.c/WriteImage/1037.
Qualquer ajuda seria apreciada!
Responder1
convert
é uma poderosa ferramenta de linha de comando para converter gráficos. Seu suporte para PDF é fornecido pelo Ghostscript. Por causa de um significativofalha de segurança no Ghostscriptantes da versão 9.24, o uso de convert
arquivos PDF foi bloqueado como um paliativo. O problema foi corrigido desde a versão 9.24 do Ghostscript. Embora as versões do Ghostscript sejam atualizadas para versões seguras em todas as versões suportadas do Ubuntu (no momento, a partir do Ubuntu 16.04), a restrição de uso ainda pode estar em vigor.
O arquivo de políticas é /etc/ImageMagick-6/policy.xml
. Você pode editar esse arquivo como usuário root para alterar as políticas.
Eliminando todas as restrições de uso
Para usuários de desktop que não executam um servidor web, simplesmente eliminar essas restrições pode ser suficiente. Para isso, pode-se excluir o arquivo, mas é melhor "mover o arquivo" renomeando-o. Com este comando, você está renomeando o arquivo. Como resultado, todas as políticas serão suspensas, mas você ainda poderá reverter, se necessário:
sudo mv /etc/ImageMagick-6/policy.xml /etc/ImageMagick-6/policy.xmlout
Para voltar à situação original, basta renomear de volta para o nome original:
sudo mv /etc/ImageMagick-6/policy.xmlout /etc/ImageMagick-6/policy.xml
Esteja ciente de que mover o arquivo de política diminui a segurança do sistema.
Eliminando apenas a restrição de combinar em PDF
Para o seu caso específico, gene_wood em um comentário apontou a possibilidade de flexibilizar seletivamente a política para trabalhar com arquivos PDF comentando uma linha:
<policy domain="coder" rights="none" pattern="PDF" />
Edite o arquivo e coloque marcas de comentário ao redor desta linha para desabilitar esta regra:
<!-- <policy domain="coder" rights="none" pattern="PDF" /> -->
Se você não deseja eliminar todas as políticas de segurança, este é o caminho a seguir.
Responder2
Comovanádio postado, você terá que alterar a política do ImageMagick.
sudo vim /etc/ImageMagick-6/policy.xml
e substitua a linha
<policy domain="coder" rights="none" pattern="PDF" />
com
<policy domain="coder" rights="read|write" pattern="PDF" />
Se você deseja permitir apenas a gravação e não a leitura, também pode apagar a read|
parte da linha acima.
Aliás, para aqueles que estão interessados na vulnerabilidade do ImageMagick, aqui estão 2 links informativos:
Responder3
Em vez de afrouxar novamente as restrições de segurança do ImageMagick, eu apenas usariaimg2pdf.
Ele foi projetado especificamente para esse tipo de caso de uso.
Você deve usar img2pdf se suas prioridades forem (nesta ordem):
- sempre sem perdas:a imagem incorporada no PDF sempre terá exatamente as mesmas informações de cor para cada pixel que a entrada
- pequeno:se possível, a diferença no tamanho do arquivo entre a imagem de entrada e o PDF de saída será apenas a sobrecarga do próprio contêiner PDF
- rápido:se possível, a imagem de entrada é apenas colada no documento PDF como está, sem qualquer recodificação dos dados de pixel que consome muita CPU
O software de conversão convencional (como ImageMagick) iria:
- não será sem perdas porque a recodificação com perdas para JPEG
- não ser pequeno porque usar codificação flate desperdiçada de dados brutos de pixel
- não seja rápido porque os dados de entrada são recodificados
Outra vantagem de não ter que recodificar a entrada (nas situações mais comuns) é que o img2pdf é capaz de lidar com entradas muito maiores do que outros softwares, porque os dados brutos do pixel nunca precisam ser carregados na memória.
Este deve ser o comando equivalente:
img2pdf --out myfile.pdf /home/bill/TempScan/*.png
Se, por algum motivo, você não puder fazer isso (por exemplo, não puder instalar novos pacotes), outro caminho potencial para conversão sem perdas seria transformar convert
suas imagens em um arquivo TIFF de várias páginas e usá-las tiff2pdf
nas ferramentas libtiff.
Responder4
Aqui está uma maneira ainda mais conveniente de obter automaticamente a(s) localização(ões) do(s) arquivo(s) policy.xml e realizar a pesquisa/substituição em todos eles:
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