2017-01-18 104 views
0

我希望能夠使用PrinterJob打印數據列表,但似乎PrinterJob僅打印Node s,所以當我使用TableView並打印它時,首先它不打印所有元素,第二我不喜歡這個設計。我的應用程序已經有創建PDF表(樣本是展示在這個問題結束)的功能,我的問題是,我怎麼能打印此PDF格式,這proccess打印是它的POS打印機作爲一個正常的同打印機?Java:打印數據表

enter image description here

編輯

基於James_D 2的答案,我用這個代碼打印:

Document document = createLogDocument(items); 
if (document != null) { 
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
    PdfWriter.getInstance(document, byteArrayOutputStream); 

    byte[] pdfData = byteArrayOutputStream.toByteArray(); 

    DocFlavor pdfInFormat = DocFlavor.BYTE_ARRAY.PDF; 

    Doc myDoc = new SimpleDoc(pdfData, pdfInFormat, null); 

    PrintRequestAttributeSet set = new HashPrintRequestAttributeSet(); 

    PrintService[] services = PrintServiceLookup.lookupPrintServices(pdfInFormat, set); 
    if (services.length > 0) { 
     PrintService service = ServiceUI.printDialog(null, 50, 50, services, services[0], null, set); 


     DocPrintJob job = service.createPrintJob(); 
     job.print(myDoc, set); 

    } 
} 
} catch (DocumentException e) { 
    e.printStackTrace(); 
} catch (PrintException e) { 
    e.printStackTrace(); 
} 

作爲createLogDocument它如下:

private static Document createLogDocument(List<Log> logs) throws DocumentException { 
Document document = new Document(); 
document.open(); 

PdfPTable table = new PdfPTable((new float[]{10, 20, 50, 10, 10})); 
table.setWidthPercentage(100); 
table.setSpacingAfter(20); 
table.setSpacingAfter(20); 

PdfPTable header = new PdfPTable((new float[]{10, 20, 50, 10, 10})); 
header.setWidthPercentage(100); 
header.setSpacingAfter(20); 
header.setSpacingBefore(20); 

PdfPCell cell = null; 

setHeaderCell(cell, "Date", header); 
setHeaderCell(cell, "Type", header); 
setHeaderCell(cell, "Details", header); 
setHeaderCell(cell, "Client", header); 
setHeaderCell(cell, "Employee", header); 

for (Log log : logs) { 

    setNormalCell(cell, log.getDate().toString(), table); 

    setNormalCell(cell, log.getDescription().split(":")[0], table); 

    setNormalCell(cell, log.getDescription().split(":")[1], table); 

    setNormalCell(cell, log.getClient().getName(), table); 

    setNormalCell(cell, log.getEmployee().getName(), table); 
} 

boolean b = true; 
for (PdfPRow r : table.getRows()) { 
    for (PdfPCell c : r.getCells()) { 
     c.setBackgroundColor(b ? BaseColor.LIGHT_GRAY : BaseColor.WHITE); 
    } 
    b = !b; 
} 

document.add(header); 
document.add(table); 
document.close(); 

return document; 

}

但是,當我執行此代碼時,我得到一個java.io.IOExceptionNo file in print request。我犯了什麼錯誤?

回答

1

JavaFX的打印API將無法打印在它的TableView將所有數據。回想一下,表格視圖不會爲表格中的所有項目創建單元格:僅爲可見的項目(那些未滾動出視圖的項目)創建單元格,並根據需要(例如用戶滾動時)重用。由於JavaFX打印API打印節點,並且不存在表示所有數據的節點,所以這根本不起作用。

既然你已經在你的表中的數據的PDF表示,你可以使用標準的API javax.print打印的PDF。該package documentation對如何做到這一點的詳細信息,但在短暫的你會做:

FileInputStream pdfStream; 
try { 
    pdfStream = new FileInputStream("file.pdf"); 
} catch (FileNotFoundException ffne) { 
    ffne.printStackTrace(); 
} 
if (pdfStream == null) { 
    return; 
} 

DocFlavor pdfInFormat = DocFlavor.INPUT_STREAM.PDF; 
Doc myDoc = new SimpleDoc(pdfStream, pdfInFormat, null); 
PrintRequestAttributeSet aset = 
     new HashPrintRequestAttributeSet(); 
PrintService service = 
    PrintServiceLookup.lookupDefaultPrintService(psInFormat, aset); 
if (service != null) { 
    DocPrintJob job = service.createPrintJob(); 
    try { 
     job.print(myDoc, aset); 
    } catch (PrintException pe) { 
     pe.printStackTrace(); 
    } 
} 

如果你的PDF是在內存中,而不是在一個文件中,並且可以在一個byte[]的形式獲取數據,你可以做

byte[] pdfData = ... ; 
DocFlavor pdfInFormat = DocFlavor.BYTE_ARRAY.PDF; 
Doc myDoc = new SimpleDoc(pdfData, pdfInFormat, null); 

而不是使用上面的文件。

+0

將這項工作兩臺打印機(我的意思是POS和正常),因爲我沒有自己的POS打印機嘗試嗎? –

+1

@ Ayoub.A我不擁有一個要麼...應該是的。我真的只能在這裏引用你的文檔。您可以使用'PrintServiceLookup.lookupPrintServices(...)'獲得能夠打印文檔的所有打印機(「打印服務」),並且只要您有權訪問,就可以使用'PrintService.getAttributes()'查詢或修改打印機的各個方面適當的打印機。但我沒有辦法測試... –

+0

你能告訴我如何顯示打印對話框,我找不到方法來做到這一點。謝謝 –

0

好吧,我改變了我的createLog方法返回一個字節數組,其接縫做工精細。

try { 
     byte[] pdfData = createLogDocument(items); 

     if (pdfData.length != 0) { 

      DocFlavor pdfInFormat = DocFlavor.BYTE_ARRAY.PDF; 

      Doc myDoc = new SimpleDoc(pdfData, pdfInFormat, null); 

      PrintRequestAttributeSet set = new HashPrintRequestAttributeSet(); 

      PrintService[] services = PrintServiceLookup.lookupPrintServices(pdfInFormat, set); 

      if (services.length > 0) { 
       PrintService service = ServiceUI.printDialog(null, 50, 50, services, services[0], null, set); 

       if (service != null) { 
        DocPrintJob job = service.createPrintJob(); 
        job.print(myDoc, set); 
       } 

      } 
     } 

    } catch (DocumentException e) { 
     e.printStackTrace(); 
    } catch (PrintException e) { 
     e.printStackTrace(); 
    } 

對於createLogDocument方法:

private static byte[] createLogDocument(List<Log> logs) throws DocumentException { 
    Document document = new Document(); 

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
    PdfWriter.getInstance(document, byteArrayOutputStream); 

    document.open(); 

    //Fill the document with info 

    document.close(); 
    byte[] pdfData = byteArrayOutputStream.toByteArray(); 

    return pdfData; 
}