2009-09-10 97 views
13

我們正在研究從Java內部無聲打印PDF文檔。打印將從桌面調用,而不是通過瀏覽器,所以我們不能使用JavaScript。 PDF渲染器是一種可操作的解決方案,但其渲染質量不可接受。 iText似乎無法與Java打印服務一起插入。有一些商業Java庫,Qoppa,JPedal和ICEpdf的jPDFPrint,我們還沒有嘗試過。從Java內部靜默打印PDF

有沒有人有使用Java的PDF靜音打印的經驗?

+0

什麼是與Sun的PDFRender問題了嗎?我在這裏有一些打印輸出,他們看起來乾淨漂亮。您是否有導致問題的特殊元素或圖像? – Stroboskop 2010-06-14 07:30:28

回答

11

Apache PDFBox。它目前正在孵化,但PDF打印功能在此之前已經出現。在內部,它使用Java Print Services創建打印作業,並且它也支持silent printing

請注意,它也需要Fontbox,而且當前(即將發佈的0.8.0版本)已經包含了適用於Type 0字體文檔的優雅回退。 Type 1字體打印正確;但是在0.7.3中,嘗試使用Type 0字體打印文檔將導致引發異常。

+1

我試過這個,但是pdf的打印至少主要是空白的(有時是完全空白的頁面,有時只是一個部分)。 – Stephen 2009-11-09 09:03:42

+1

那麼,命令行(PrintPDF)似乎可以正常工作並打印所有內容(即使它弄亂了我透明的PNG圖像) – Stephen 2009-11-09 09:32:17

+0

這有點奇怪,考慮到命令行打印似乎已經工作(除了PNG圖像) 。我將檢查如何在PDFBox模型中表示PNG。順便說一句,你是用0.7.3還是更新的版本來試試這個? – 2009-11-09 09:58:47

0

看看www.pdflib.com。它的comercial但PDFlib Lite可以免費用於開源項目。它具有Java的綁定。

2

也許我誤解了,但爲什麼不直接使用Print Service API呢?我下面的作品(假設您已經將PDF文檔作爲字節數組):

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

這隻適用於你的打印機本身支持PDF - 很少做 – 2009-09-12 04:17:01

+0

所有的人I已經在Linux下嘗試過了似乎工作。在Windows下,我不得不更新驅動程序。 – 2009-09-12 10:29:04

+0

我試圖在Windows和Linux。這是更新的版本,但是我不能讓它工作,就像我如何加載文件c:\ print.pdf並推入沉默打印?任何建議plz?例如:https://gist.github.com/1093987 – YumYumYum 2011-07-19 23:21:15

0

我有使Acrobat(Reader或Full)進行打印的經驗,但它沒有什麼安靜的跡象(它是無人看管的 - 只是取決於沉默的要求是多麼「沉默」)。如果有興趣,我可以向您發送進行所需DDE呼叫的本機代碼。

+0

您能否顯示代碼? – asalamon74 2009-11-13 08:28:15

+0

有一個命令行開關來觸發打印操作從Acrobat閱讀器,但讀者保持開放...一種解決方案是使用外部工具,請參閱http://www.rgagnon.com/javadetails/java-print-a-pdf.html。很顯然,這僅適用於WIndows ! – RealHowTo 2011-12-31 18:06:53

+0

和那個命令行開關永遠不會w (爲現代版本的Acrobat和/或Reader - 它在舊版本中工作)... – 2012-01-09 19:41:18

0

iText是用於創建PDF文件(每篇文章我從作者看到),因此可能不是你想要的。

我已經用Qoppa的jPDFPrint完全實現了這個目的,但它並不便宜。如果你能負擔得起,這是迄今爲止我發現的最強大的解決方案。我對支持的程度印象深刻,他們甚至爲我生成了一些自定義示例代碼。

我試過PDFBox,但發現它不支持使用Acrobat獲得的「縮小到可打印區域」頁面縮放比例。不是每個人都會關心這個功能,但它對我來說很重要。

2

這個工作對我來說:

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