2009-09-10 8 views
13

Wir suchen in stummen Druck von PDF-Dokumenten aus Java heraus. Der Druck wird vom Desktop und nicht über einen Browser aufgerufen, daher können wir kein JavaScript verwenden. Der PDF-Renderer ist eine funktionsfähige Lösung, aber die Renderqualität ist nicht akzeptabel. iText scheint nicht mit dem Java-Druckdienst verbunden zu sein. Es gibt einige kommerzielle Java-Bibliotheken, jPDFPrint von Qoppa, JPedal und ICEpdf, die wir noch nicht ausprobiert haben.Silent Printing von PDF aus dem Inneren von Java

Hat jemand Erfahrung mit PDF Silent Printing von Java?

+0

Was ist Ihr Problem mit Sun PDFRender? Ich habe hier einige Ausdrucke und sie sehen sauber und nett aus. Haben Sie spezielle Elemente oder Bilder, die Probleme verursachen? – Stroboskop

Antwort

11

Apache PDFBox. Es befindet sich derzeit in der Inkubation, aber die PDF-Druckfunktionalität ist schon vorher da. Intern verwendet es die Java Print Services, um einen Druckauftrag zu erstellen, und es unterstützt auch .

Beachten Sie, dass es auch Fontbox benötigt, und die aktuelle (kommende Version 0.8.0) hat ein elegantes Fallback für Dokumente mit Typ 0-Schriftarten enthalten. Schriftarten vom Typ 1 werden korrekt gedruckt. In Version 0.7.3 führen Versuche zum Drucken von Dokumenten mit Schriftarten des Typs 0 jedoch zum Auslösen einer Ausnahme.

+1

Ich habe das versucht, aber die pdfs sind zumindest überwiegend leer gedruckt (manchmal komplett leere Seiten, manchmal nur ein Ausschnitt). – Stephen

+1

Nun, die Befehlszeile (PrintPDF) scheint zu funktionieren und alles zu drucken (auch wenn es mein transparentes PNG-Bild durcheinander bringt) – Stephen

+0

Das ist ein bisschen komisch, wenn man bedenkt, dass der Ausdruck der Befehlszeile funktioniert hat (außer dem PNG-Bild) . Ich werde prüfen, wie PNGs im PDFBox-Modell dargestellt werden. Übrigens, probierst du das mit 0.7.3 oder einer späteren Version? –

0

Werfen Sie einen Blick auf www.pdflib.com. Seine kommerzielle, aber PDFlib Lite ist kostenlos für Open-Source-Projekte zur Verfügung. Es hat Bindungen für Java.

2

Vielleicht bin ich ein Missverständnis, aber warum nicht einfach die Print Service API direkt verwenden? Die folgenden Werke für mich (vorausgesetzt, dass Sie das PDF-Dokument als ein Byte-Array):

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

das funktioniert nur, wenn Ihr Drucker nativ PDF unterstützt - nur wenige tun –

+0

Alle die ich habe unter Linux versucht zu funktionieren. Unter Windows musste ich die Treiber aktualisieren. –

+0

Ich probiere das in Windows und in Linux. Hier ist die aktualisierte Version aber aber ich kann es nicht funktionieren, wie kann ich die Datei laden c: \ print.pdf und Push to Silent print ?. Irgendwelche Vorschläge, zB: https://gist.github.com/1093987 – YumYumYum

0

Ich habe Erfahrung mit Acrobat (Reader oder Full) machen das Drucken, aber es ist alles andere als still (es ist unbeaufsichtigt, obwohl - hängt nur davon ab, wie "leise" die stille Anforderung ist). Wenn es Interesse gibt, kann ich Ihnen den nativen Code schießen, der die erforderlichen DDE-Aufrufe vornimmt.

+0

Könnten Sie bitte den Code anzeigen? – asalamon74

+0

Es gibt einen Befehlszeilenschalter, um eine Druckoperation auszulösen vom Acrobat-Reader, aber der Reader bleibt geöffnet ... Eine Lösung ist die Verwendung eines externen Dienstprogramms, siehe http://www.rgagnon.com/javadetails/java-print-a-pdf.html. Dies ist offensichtlich nur für Windows ! – RealHowTo

+0

und dieser Befehlszeilenschalter hat noch nie w Orked für mich (in modernen Versionen von Acrobat und/oder Reader - es funktionierte in älteren Versionen) ... –

0

iText ist zum Erstellen von PDF-Dateien gedacht (pro Beitrag, den ich vom Autor sah), und ist wahrscheinlich nicht das, was Sie wollen.

Ich habe Qoppas jPDFPrint ziemlich erfolgreich für genau diesen Zweck verwendet, aber es ist nicht billig. Wenn Sie es sich leisten können, ist es die robusteste Lösung, die ich bisher gefunden habe. Ich war auch sehr beeindruckt von dem Grad der Unterstützung. Sie haben sogar einige benutzerdefinierte Beispielcodes für mich erstellt.

Ich habe versucht, PDFBox, aber es hat nicht die "Shrink to printable area" Seitenskalierung, die Sie mit Acrobat erhalten. Nicht jeder wird sich für dieses Feature interessieren, aber es ist wichtig für mich.

2

Dies funktioniert für mich:

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