2009-09-10 39 views
13

Estamos estudiando la impresión silenciosa de documentos PDF desde Java. La impresión se invocará desde el escritorio y no a través de un navegador, por lo que no podemos usar JavaScript. PDF Renderer es una solución operacional, pero su calidad de representación no es aceptable. iText no parece ser conectable con el servicio de impresión de Java. Existen algunas bibliotecas comerciales de Java, jPDFPrint por Qoppa, JPedal e ICEpdf, que aún no hemos probado.Impresión silenciosa de PDF desde Java

¿Alguien tiene alguna experiencia con la impresión silenciosa en PDF de Java?

+0

Cuál es el problema con PDFRender de Sun? Tengo algunas impresiones aquí y se ven limpias y agradables. ¿Tienes elementos especiales o imágenes que causan problemas? – Stroboskop

Respuesta

11

Apache PDFBox. Actualmente está en incubación, pero la funcionalidad de impresión PDF ya existía antes. Internamente, utiliza los servicios de impresión de Java para crear un trabajo de impresión, y también es compatible con silent printing.

Tenga en cuenta que también requiere Fontbox, y la versión actual (la próxima versión 0.8.0) ha incluido un elegante repliegue para documentos con fuentes Tipo 0. Las fuentes tipo 1 se imprimen correctamente; sin embargo, en 0.7.3, los intentos de imprimir documentos con tipos de letra 0 generarán una excepción.

+1

Intenté esto, pero el pdf se imprimió al menos principalmente en blanco (a veces páginas completamente en blanco, a veces solo una sección). – Stephen

+1

Bueno, la línea de comando (PrintPDF) parece funcionar e imprimir todo (incluso si hace un lío de mi imagen PNG transparente) – Stephen

+0

Eso es un poco extraño, teniendo en cuenta que la impresión de línea de comando parece haber funcionado (a excepción de la imagen PNG) . Comprobaré cómo se representan PNG en el modelo PDFBox. Por cierto, ¿estás intentando esto con 0.7.3 o una versión posterior? –

0

Eche un vistazo a www.pdflib.com. Es comercial, pero PDFlib Lite está disponible de forma gratuita para proyectos de código abierto. Tiene enlaces para Java.

2

Tal vez estoy malentendido, pero ¿por qué no simplemente usar la API del servicio de impresión directamente? Las siguientes obras para mí (se supone que tiene el documento PDF como una 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."); 
} 
+6

esto solo funciona si tu impresora admite PDF de forma nativa - pocos lo hacen –

+0

Todos los que yo Lo he probado en Linux parece que funciona. En Windows tuve que actualizar los controladores. –

+0

Estoy intentando esto en Windows y en Linux. Aquí está la versión actualizada, pero no puedo hacerlo funcionar, por ejemplo, ¿cómo puedo cargar el archivo en c: \ print.pdf y presione para imprimir en silencio? Cualquier sugerencia, por ejemplo: https://gist.github.com/1093987 – YumYumYum

0

Tengo experiencia haciendo que Acrobat (Reader o Full) imprima, pero es todo menos silencioso (sin embargo, es desatendido, solo depende de qué tan silencioso sea el requisito de silencio). Si hay interés, puedo capturar el código nativo que realiza las llamadas DDE requeridas.

+0

¿Podría mostrar el código? – asalamon74

+0

Hay un interruptor de línea de comando para activar una operación de impresión desde Acrobat Reader pero el lector permanece abierto ... Una solución es usar una utilidad externa, ver http://www.rgagnon.com/javadetails/java-print-a-pdf.html. Obviamente, esto es solo para Windows ! – RealHowTo

+0

y ese interruptor de línea de comando nunca ha w orked para mí (en las versiones modernas de Acrobat y/o Reader, funcionó en versiones anteriores) ... –

0

iText está destinado a la creación de archivos PDF (por una publicación que vi del autor), y por lo tanto, probablemente no es lo que desea.

He usado el jPDFPrint de Qoppa con bastante éxito para exactamente este propósito, pero no es barato. Si puede pagarlo, es la solución más robusta que he encontrado hasta ahora. También me ha impresionado mucho el nivel de apoyo; incluso generaron algún código de muestra personalizado para mí.

Intenté PDFBox, pero encontré que no es compatible con la escala de página "Reducir a área de impresión" que obtiene con Acrobat. No a todos les importará esta característica, pero es esencial para mí.

2

Esto funciona para mí:

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."); 
    }  
}