我希望能夠使用PrinterJob
打印數據列表,但似乎PrinterJob
僅打印Node
s,所以當我使用TableView
並打印它時,首先它不打印所有元素,第二我不喜歡這個設計。我的應用程序已經有創建PDF表(樣本是展示在這個問題結束)的功能,我的問題是,我怎麼能打印此PDF格式,這proccess打印是它的POS打印機作爲一個正常的同打印機?Java:打印數據表
編輯
基於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.IOException
說No file in print request
。我犯了什麼錯誤?
將這項工作兩臺打印機(我的意思是POS和正常),因爲我沒有自己的POS打印機嘗試嗎? –
@ Ayoub.A我不擁有一個要麼...應該是的。我真的只能在這裏引用你的文檔。您可以使用'PrintServiceLookup.lookupPrintServices(...)'獲得能夠打印文檔的所有打印機(「打印服務」),並且只要您有權訪問,就可以使用'PrintService.getAttributes()'查詢或修改打印機的各個方面適當的打印機。但我沒有辦法測試... –
你能告訴我如何顯示打印對話框,我找不到方法來做到這一點。謝謝 –