Impressão silenciosa de PDF de dentro de Java
-
05-07-2019 - |
Pergunta
Estamos analisando a impressão silenciosa de documentos em PDF de dentro de Java. A impressão será invocada da área de trabalho e não através de um navegador, para que não possamos usar o JavaScript. O renderizador de PDF é uma solução operacional, mas sua qualidade de renderização não é aceitável. O iText não parece estar travável com o serviço de impressão Java. Existem algumas bibliotecas Java Commercial, JPDFPrint da QOPPA, JPEDAL e ICEPDF que ainda não experimentamos.
Alguém tem alguma experiência com a impressão silenciosa em PDF da Java?
Solução
Apache pdfbox. Atualmente, está em incubação, mas a funcionalidade de impressão em PDF já existe antes disso. Internamente, ele usa os serviços de impressão Java para criar um trabalho de impressão e também suporta impressão silenciosa.
Observe que também requer o Fontbox e a atual (próxima versão 0.8.0) incluiu um fallback gracioso para documentos com fontes tipo 0. As fontes tipo 1 são impressas corretamente; No entanto, em 0,7.3, as tentativas de imprimir documentos com fontes tipo 0 resultarão em uma exceção sendo lançada.
Outras dicas
Talvez eu seja mal -entendido, mas por que não usar a API de serviço de impressão diretamente? O seguinte funciona para mim (pressupõe que você tenha o documento PDF como uma matriz de bytes):
DocFlavor flavor = DocFlavor.BYTE_ARRAY.PDF;
PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, null);
if (services.length > 0)
{
DocPrintJob printJob = services[0].createPrintJob();
Doc document = new SimpleDoc(pdfBytes, flavor, null)
printJob.print(document, null);
}
else
{
System.out.println("No PDF printer available.");
}
Isso funciona para mim:
public void print() {
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, null);
FileInputStream psStream = null;
try {
psStream = new FileInputStream("c:\\test.pdf");
} catch (FileNotFoundException ffne) {
ffne.printStackTrace();
}
if (psStream == null) {
return;
}
if (services.length > 0)
{
PrintService myService = null;
for(PrintService service : services) {
System.out.println(service.getName());
if(service.getName().contains("my printer")) {
myService = service;
break;
}
}
DocPrintJob printJob = myService.createPrintJob();
Doc document = new SimpleDoc(psStream, flavor, null);
try {
printJob.print(document, null);
} catch (PrintException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else
{
System.out.println("No PDF printer available.");
}
}
Dê uma olhada no www.pdflib.com. Seu lite comercial, mas PDFlib está disponível gratuitamente para projetos de código aberto. Possui ligações para Java.
Há um exemplo usando o jpedal em http://www.jpedal.org/support_egsp.php
Você precisará da versão comercial do ICEPDF se desejar suporte completo à fonte.
Eu tenho experiência em fazer acrobat (leitor ou cheio) fazer a impressão, mas é tudo menos silencioso (embora não seja atendido - apenas depende de quão 'silencioso' é o requisito silencioso). Se houver interesse, posso atirar no código nativo que faz as chamadas DDE necessárias.
O ITEXT destre -se à criação de arquivos PDF (de acordo com uma postagem que vi do autor) e, portanto, provavelmente não é o que você deseja.
Eu usei o JPDFPrint da QOPPA com bastante sucesso para exatamente esse fim, mas não é barato. Se você pode pagar, é a solução mais robusta que encontrei até agora. Também fiquei muito impressionado com o nível de apoio; Eles até geraram algum código de amostra personalizado para mim.
Eu tentei o PDFBox, mas descobri que ele não suporta a escala de página "encolhimento para a área imprimível" que você recebe com o Acrobat. Nem todo mundo vai se importar com esse recurso, mas é essencial para mim.