Este repositório contém um aplicativo de impressora para impressoras PostScript que usa PAPPL para oferecer suporte à impressão IPP de vários sistemas operacionais. Além disso, utiliza os recursos do cups-filters 2.x (funções de filtro em libcupsfilters, libppd) e pappl-retrofit (encapsulando drivers CUPS clássicos em aplicativos de impressora). Este trabalho (ou agora o código do pappl-retrofit) é derivado do aplicativo hp-printer-app.
Suas contribuições são bem-vindas. Por favor, poste problemas e receba solicitações.
Uma aplicação de impressora não raster: O formato de destino é PostScript, um formato vetorial/de alto nível. Os dados de entrada em PostScript ou PDF são aceitos e a conversão necessária é feita sem nenhuma etapa raster intermediária.
Um aplicativo de impressora que usa as novas funções de filtro do cups-filters 2.x. Funções de filtro são funções de biblioteca derivadas dos filtros CUPS e contêm décadas de desenvolvimento e refinamento desde a introdução do CUPS em 2000.
Um aplicativo de impressora adaptado para drivers CUPS clássicos, neste caso a forma mais simples de apenas arquivos PPD para impressoras PostScript. Ele lista arquivos PPD de repositórios incluídos no Snap, carrega o PPD necessário para a impressora real, extrai opções do PPD para exibi-las na interface da web, aceita configurações de trabalho como atributos IPP e insere corretamente o código PostScript fornecido pelo PPD no fluxo de dados de saída.
Um aplicativo de impressora que não passa por trabalhos brutos (o formato de entrada é o formato nativo da impressora). Para garantir que sempre o código PostScript do arquivo PPD seja inserido no fluxo de saída, chamamos o formato nativo da impressora de "application/vnd.printer-specific" que não existe como formato de entrada, então a entrada "application/postscript" é forçada através da função de filtro pstops().
Um aplicativo de impressora expansível: O usuário pode adicionar arquivos PPD por meio da interface web de administração para suportar modelos de impressora adicionais.
Outras propriedades são:
Para evitar a necessidade de reinventar o código para bifurcar em subprocessos para que possamos passar os dados através de uma sequência de filtros, criamos uma função de filtro para enviar os dados para a impressora e formar uma cadeia do filtro de conversão real função (uma de pstops() e pdftops()) com esta função de filtro usando a função de filtro filterChain().
Para entrada PWG/Apple Raster usamos retornos de chamada raster para que o processamento seja transmitido, permitindo trabalhos grandes e até infinitamente longos. Usamos funções libppd para inserir o código PostScript da opção PPD no fluxo de saída e a função filterPOpen() para criar um descritor de arquivo para as funções libppd enviarem dados para o dispositivo.
O Snap do aplicativo de impressora PostScript possui todos os arquivos PostScript PPD dos projetos foomatic-db e HPLIP integrados, portanto, a maioria dos PPDs de impressora PostScript que geralmente vêm com distribuições Linux. Para evitar que esse grande número de PPDs aumente o tamanho do Snap, nós os compactamos fortemente usando pyppd. Observe que alguns PPDs usam determinados filtros CUPS para funcionalidade extra. Esses filtros estão incluídos no Snap, portanto, a funcionalidade extra é suportada (na maioria dos casos, impressão protegida por PIN). O usuário pode adicionar PPDs adicionais sem precisar reconstruir o Snap (veja abaixo).
Usamos o ID do dispositivo IEEE-1284 da impressora para identificar inicialmente que se trata de uma impressora PostScript (via campo CMD:) para ver se ela é suportada e só então verificar por marca e modelo se a suportamos explicitamente com um PPD. As impressoras PostScript para as quais não há PPD recebem um PPD genérico atribuído. Pela verificação do campo CMD: antes da pesquisa de marca/modelo, garantimos que se o PostScript for fornecido por um módulo adicional, o módulo está realmente instalado.
Os atributos IPP do trabalho padrão são mapeados para as configurações de opção PPD que melhor se adequam a eles, para que os usuários possam imprimir a partir de qualquer tipo de cliente (como, por exemplo, um telefone ou dispositivo IoT) que suporte apenas atributos IPP padrão e não possa recuperar as opções PPD. Bandejas, tamanhos de mídia, tipos de mídia e duplex podem ser mapeados facilmente, mas quando se trata de cor e qualidade fica mais complexo, pois as opções relevantes diferem muito nos arquivos PPD. Aqui usamos um algoritmo que automaticamente (quem deseja editar manualmente ~ 10.000 PPDs para as tarefas) encontra o conjunto correto de configurações de opções para cada combinação de print-color-mode
( color
/ monochrome
), print-quality
( draft
/ normal
/ high
) e print-content-optimize
( auto
/ photo
/ graphics
/ text
/ text-and-graphics
) no PPD da impressora atual. Assim, você tem acesso fácil a toda a qualidade ou velocidade da sua impressora sem precisar lidar com configurações de opções específicas da impressora (as opções originais ainda podem ser acessadas pela interface de administração da web).
Os recursos da impressora para um determinado modelo de impressora (um "driver" no Aplicativo da Impressora) não são estáticos durante toda a vida da fila de impressão configurada no Aplicativo da Impressora. O usuário pode configurar através de uma página na interface de administração web quais acessórios de hardware (bandejas de papel extras, unidade duplex, finalizadores, ...) estão instalados na impressora e o aplicativo da impressora atualiza a estrutura de dados do driver e com isso os recursos da impressora. A resposta a uma solicitação IPP get-printer-attributes é atualizada adequadamente.
PostScript é uma linguagem de programação completa e muitas impressoras PostScript permitem consultar configurações de opções e a presença de acessórios de hardware instaláveis que executam código PostScript apropriado. Se uma configuração puder ser consultada, o fabricante colocará o código PostScript necessário no arquivo PPD, junto com a opção consultável. Essas consultas são suportadas pela interface web do aplicativo da impressora.
Os dispositivos de impressora disponíveis são descobertos (e usados) com backends do CUPS e não com backends do próprio PAPPL. Dessa forma, soluções alternativas peculiares para impressoras USB com problemas de compatibilidade são usadas (e são editáveis) e a saída PostScript pode ser enviada para a impressora via IPP, IPPS (criptografado!) E LPD, além do soquete (geralmente porta 9100). O backend SNMP pode ser configurado (comunidade, escopo de endereço).
Se você tiver uma configuração de sistema incomum ou um firewall pessoal, sua impressora talvez não seja descoberta. Nesta situação, a entrada totalmente manual "Impressora de rede" em combinação com o campo nome do host/IP pode ser útil.
Na página "Adicionar arquivos PPD" na lista de arquivos PPD do usuário já adicionados marque quais são realmente utilizados por uma impressora que foi configurada no Aplicativo de Impressora, para evitar que o usuário remova esses arquivos.
Sequências legíveis para opções de fornecedores (precisa de suporte da PAPPL: Problema nº 58: suporte à localização)
Internacionalização/Localização (Precisa de suporte do PAPPL: Edição nº 58: Suporte à localização)
Verificação do nível de tinta SNMP por meio da função ps_status() (precisa de suporte do PAPPL: Problema nº 83: o CUPS faz pesquisas de nível de tinta IPP e SNMP via backends, o PAPPL deve ter funções para isso)
Opções de construção para cups-filters, para construção sem libqpdf e/ou sem libppd, a primeira permitirá criar o Snap deste aplicativo de impressora sem baixar e construir QPDF
Para executar e usar este aplicativo de impressora, basta instalá-lo na Snap Store:
sudo snap install --edge ps-printer-app
Em seguida, siga as instruções abaixo para configurá-lo.
Para construir o Snap sozinho, no diretório principal deste repositório execute
snapcraft snap
Isso fará o download de todos os pacotes necessários e criará o aplicativo de impressora PostScript. Observe que PAPPL (próximo 1.0) e cups-filters (próximo 2.0) são extraídos diretamente de seus repositórios GIT, pois ainda não há versões apropriadas. Isso também pode levar ao fato de que este aplicativo de impressora não será mais compilado repentinamente.
NOTA: Há um bug no Ubuntu Groovy (20.10) que o impede de construir Snaps, veja esta discussão no fórum Snapcraft. O problema já foi resolvido, mas ainda não entrou no Groovy.
Qualquer versão mais antiga (como 20.04) ou mais recente (como 21.04) do Ubuntu deve funcionar.
Para instalar o Snap run resultante
sudo snap install --dangerous ps-printer-app_1.0_amd64.snap
O aplicativo da impressora será iniciado automaticamente como um daemon de servidor.
Entre na interface da web
http://localhost:8000/
Use a interface da web para adicionar uma impressora. Forneça um nome, selecione a impressora descoberta e selecione marca e modelo. Defina também os acessórios instalados, a mídia carregada e os padrões de opções. A configuração de acessórios e os padrões de opções também podem ser pesquisados na impressora.
Em seguida, imprima arquivos PDF, PostScript, JPEG, Apple Raster ou PWG Raster com
ps-printer-app FILE
ou imprima com CUPS, CUPS (e também navegado por cups) descubra e trate as impressoras configuradas com este aplicativo de impressora como impressoras IPP sem driver (IPP Everywhere e AirPrint).
Você também pode adicionar arquivos PPD sem reconstruir o Snap, usando o botão "Adicionar arquivos PPD" na interface da web ou copiando manualmente os arquivos PPD:
sudo cp PPDFILE /var/snap/ps-printer-app/common/ppd/
Após copiar (ou remover) manualmente os arquivos PPD você precisa reiniciar o servidor ou na interface web, na página "Adicionar arquivos PPD" clique no botão "Atualizar" na parte inferior. Isso adiciona as alterações à lista interna de drivers.
Na página "Adicionar impressora" no menu suspenso para selecionar o driver, os arquivos PPD adicionados pelo usuário são marcados como "ADICIONADOS PELO USUÁRIO". Ao configurar uma impressora com seleção automática de driver, os arquivos PPD adicionados pelo usuário são preferidos.
PPDFILE
na linha de comando acima não pode ser apenas um único arquivo PPD, mas qualquer número de arquivos PPD únicos, arquivos .tar.gz
contendo PPDs (em estrutura de diretório arbitrária) e executáveis de geração de PPD que geralmente são colocados em /usr/lib/cups/driver
. Você também pode criar estruturas de subdiretórios arbitrários em /var/snap/ps-printer-app/current/ppd/
contendo os tipos de arquivos mencionados. Apenas certifique-se de não colocar nenhum executável que faça outra coisa além de listar e gerar arquivos PPD.
Observe que com a interface da web você só pode gerenciar PPDs individuais (descompactados ou compactados com gzip
) no próprio /var/snap/ps-printer-app/current/ppd/
. Arquivos, executáveis ou subdiretórios não são mostrados e uploads apropriados não são aceitos. Isso evita especialmente a adição de executáveis sem direitos de root.
Qualquer arquivo PPD adicionado deve ser para impressoras PostScript, pois os arquivos PPD não PostScript são para drivers CUPS e, portanto, precisariam de arquivos adicionais para funcionar e tais arquivos não são suportados por este aplicativo de impressora. A página "Adicionar arquivos PPD" mostra avisos se esses arquivos forem carregados.
Ver
ps-printer-app --help
para mais opções.
Use o argumento "-o log-level=debug" para registro detalhado na janela do terminal.
Você pode adicionar arquivos a /var/snap/ps-printer-app/common/usb/
para regras adicionais de peculiaridades de USB. Edite os arquivos existentes apenas para testes rápidos, pois eles são substituídos a cada atualização do Snap (para introduzir novas regras).
Você pode editar o arquivo /var/snap/ps-printer-app/common/cups/snmp.conf
para configurar a descoberta de impressoras de rede SNMP.
Você também pode fazer uma construção "rápida e suja" sem quebrar e sem precisar instalar PAPPL, cups-filters 2.x e pappl-retrofit em seu sistema. Você precisa de um diretório com o snapshot GIT mais recente do PAPPL, o snapshot GIT mais recente dos cups-filters e o snapshot GIT mais recente do pappl-retrofit (ramificações principais de cada um). Todos eles precisam ser compilados ( ./autogen.sh; ./configure; make
), não sendo necessária instalação. Instale também os arquivos de cabeçalho de todas as bibliotecas necessárias (a instalação de "libcups2-dev" deve bastar).
No diretório com ps-printer-app.c execute a linha de comando
gcc -o ps-printer-app ps-printer-app.c $PAPPL_SRC/pappl/libpappl.a $CUPS_FILTERS_SRC/.libs/libppd.a $CUPS_FILTERS_SRC/.libs/libcupsfilters.a $PAPPL_RETROFIT_SRC/.libs/libpappl-retrofit.a -ldl -lpthread -lppd -lcups -lavahi-common -lavahi-client -lgnutls -ljpeg -lpng16 -ltiff -lz -lm -lusb-1.0 -lpam -lqpdf -lstdc++ -I. -I$PAPPL_SRC/pappl -I$CUPS_FILTERS_SRC/ppd -I$CUPS_FILTERS_SRC/cupsfilters -I$PAPPL_RETROFIT_SRC/pappl/retrofit -L$CUPS_FILTERS_SRC/.libs/ -L$PAPPL_RETROFIT_SRC/.libs/
Há também um Makefile, mas ele precisa que PAPPL, cups-filters 2.x e pappl-retrofit sejam instalados em seu sistema.
Correr
./ps-printer-app --help
Ao executar a versão não ajustada, por padrão, os arquivos PPD são procurados em
/usr/share/ppd/
/usr/lib/cups/driver/
/var/lib/ps-printer-app/ppd/
O último caminho é usado ao adicionar arquivos PPD usando a página "Adicionar arquivos PPD" na interface da web.
Você pode definir a variável de ambiente PPD_PATHS
para pesquisar outros locais:
PPD_PATHS=/path/to/my/ppds:/my/second/place ./ps-printer-app server
Basta colocar uma lista separada por dois pontos de qualquer quantidade de caminhos na variável, sendo sempre o último usado pela página "Adicionar arquivos PPD". É recomendável criar um script wrapper.
Este aplicativo de impressora usa backends do CUPS e não PAPPL, o que significa que para impressoras USB são usadas soluções alternativas USB do CUPS para problemas de compatibilidade, impressoras de rede também podem ser usadas com protocolos IPP, IPPS e LPD, e a descoberta de impressora SNMP é configurável.
As regras do USB Quirk em /usr/share/cups/usb
e o arquivo /etc/cups/snmp.conf
podem ser editados, se necessário.
Certifique-se de ter o CUPS (pelo menos seus backends) instalado.
Você também precisa do Ghostscript para imprimir trabalhos em PDF.
Para acessar a página de teste testpage.ps
use a variável de ambiente TESTPAGE_DIR:
TESTPAGE_DIR=`pwd` PPD_PATHS=/path/to/my/ppds:/my/second/place ./ps-printer-app server
ou para sua própria criação de uma página de teste (PostScript, PDF, PNG, JPEG, Apple Raster, PWG Raster):
TESTPAGE=/path/to/my/testpage/my_testpage.ps PPD_PATHS=/path/to/my/ppds:/my/second/place ./ps-printer-app server
O aplicativo de impressora PostScript tem Copyright © 2020 de Till Kamppeter.
Ele é derivado do aplicativo de impressora HP PCL, um primeiro modelo funcional de um aplicativo de impressora raster usando PAPPL. Está disponível aqui:
https://github.com/michaelrsweet/hp-printer-app
O aplicativo da impressora HP PCL é protegido por Copyright © 2019-2020 por Michael R Sweet.
Este software é licenciado sob a licença Apache versão 2.0, com uma exceção para permitir a vinculação com software GPL2/LGPL2 (como versões mais antigas do CUPS). Consulte os arquivos “LICENSE” e “NOTICE” para maiores informações.