itext和dotmatrix打印机

时间:2011-11-28 10:36:38

标签: java pdf printing itext dot-matrix

我有一个JSP页面,它只是获取参数,查询数据库,生成发票PDF,以及静默发送到默认打印机。我使用itext库。

发票必须打印在带有连续纸张的点阵式打印机上。

每个发票页面大小都是a5格局。

如果我选择pagesize作为a5,代码会生成一个PDF,就像在这里看到的那样

a5 portrait

打印时,会打印一页并将另一页留空。用户必须手动滚动纸张。

如果我选择pagesize作为a5横向(a5.rotate()),代码会生成一个PDF,就像在这里看到的那样,这样会更好。

a5 landscape

但是当它在纸上打印时,它会开始垂直打印页面,处理打印机时有一个A4纸盘。

对我来说,我需要将我的打印机定义为带有连续纸张的dotmatrix打印机。

我使用的代码是:

    Document document = new Document(PageSize.A5,0,0,0,0);
try {   
 PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());
 writer.addViewerPreference(PdfName.PRINTSCALING, PdfName.NONE);
document.open();


StringBuffer javascript = new StringBuffer();
 javascript.append("this.print({bUI: false, bSilent: true, bShrinkToFit: true});");
 PdfAction pdfAction= PdfAction.javaScript(javascript.toString(), writer);
 writer.addJavaScript(pdfAction);
 writer.addViewerPreference(PdfName.PRINTSCALING, PdfName.NONE);
 PdfPTable table = new PdfPTable(3); // 3 columns.
 table.setWidthPercentage(100);

 PdfPCell cell1 = new PdfPCell(new Paragraph(""));
 PdfPCell cell2 = new PdfPCell(new Paragraph(""));
 PdfPCell cell3 = new PdfPCell(new Paragraph(MakbuzNo,FontFactory.getFont(FontFactory.COURIER,9)));
 cell3.setLeading(16f, 0f);
 cell1.setBorder(Rectangle.NO_BORDER);
 cell2.setBorder(Rectangle.NO_BORDER);
 cell3.setBorder(Rectangle.NO_BORDER);

cell3.setHorizontalAlignment(Element.ALIGN_RIGHT);
table.addCell(cell1);
table.addCell(cell2);    
table.addCell(cell3);    

cell1 = new PdfPCell(new Paragraph(""));
cell2 = new PdfPCell(new Paragraph(""));
cell3 = new PdfPCell(new Paragraph(Duzenleyen,FontFactory.getFont(FontFactory.COURIER,9)));
cell3.setLeading(16f, 0f);
cell3.setHorizontalAlignment(Element.ALIGN_RIGHT);

cell1.setBorder(Rectangle.NO_BORDER);
cell2.setBorder(Rectangle.NO_BORDER);
cell3.setBorder(Rectangle.NO_BORDER);
table.addCell(cell1);
table.addCell(cell2);    
table.addCell(cell3);    


cell1 = new PdfPCell(new Paragraph(MSISDN,FontFactory.getFont(FontFactory.COURIER,9)));
cell2 = new PdfPCell(new Paragraph(""));
cell3 = new PdfPCell(new Paragraph(DuzenlemeSaati,FontFactory.getFont(FontFactory.COURIER,9)));
cell1.setLeading(16f, 0f);
cell3.setLeading(16f, 0f);
cell1.setHorizontalAlignment(Element.ALIGN_LEFT);
cell3.setHorizontalAlignment(Element.ALIGN_RIGHT);

cell1.setBorder(Rectangle.NO_BORDER);
cell2.setBorder(Rectangle.NO_BORDER);
cell3.setBorder(Rectangle.NO_BORDER);
table.addCell(cell1);
table.addCell(cell2);    
table.addCell(cell3);   

cell1 = new PdfPCell(new Paragraph(""));
cell2 = new PdfPCell(new Paragraph(""));
cell3 = new PdfPCell(new Paragraph(DuzenlemeTarihi,FontFactory.getFont(FontFactory.COURIER,9)));
cell3.setLeading(16f, 0f);
cell3.setHorizontalAlignment(Element.ALIGN_RIGHT);

cell1.setBorder(Rectangle.NO_BORDER);
cell2.setBorder(Rectangle.NO_BORDER);
cell3.setBorder(Rectangle.NO_BORDER);
table.addCell(cell1);
table.addCell(cell2);    
table.addCell(cell3);

cell1 = new PdfPCell(new Paragraph(" "));
cell2 = new PdfPCell(new Paragraph(" "));
cell3 = new PdfPCell(new Paragraph(" "));
cell1.setLeading(45f, 0f);
cell1.setBorder(Rectangle.NO_BORDER);
cell2.setBorder(Rectangle.NO_BORDER);
cell3.setBorder(Rectangle.NO_BORDER);

table.addCell(cell1);
table.addCell(cell2);    
table.addCell(cell3);

cell1 = new PdfPCell(new Paragraph(izahat,FontFactory.getFont(FontFactory.COURIER,9)));
cell1.setHorizontalAlignment(Element.ALIGN_LEFT);
cell1.setColspan(3);
cell1.setBorder(Rectangle.NO_BORDER);  
table.addCell(cell1);

cell1 = new PdfPCell(new Paragraph(" "));
cell2 = new PdfPCell(new Paragraph(" "));
cell3 = new PdfPCell(new Paragraph(" "));
cell1.setLeading(75f, 0f);
cell1.setBorder(Rectangle.NO_BORDER);
cell2.setBorder(Rectangle.NO_BORDER);
cell3.setBorder(Rectangle.NO_BORDER);

table.addCell(cell1);
table.addCell(cell2);    
table.addCell(cell3);

cell1 = new PdfPCell(new Paragraph(kopyayazi,FontFactory.getFont(FontFactory.COURIER,9)));
cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
cell1.setColspan(3);
cell1.setBorder(Rectangle.NO_BORDER);  
table.addCell(cell1);

cell1 = new PdfPCell(new Paragraph(TutarYazi,FontFactory.getFont(FontFactory.COURIER,9)));
cell1.setHorizontalAlignment(Element.ALIGN_LEFT);
cell1.setColspan(2);
cell3 = new PdfPCell(new Paragraph(ToplamTutar,FontFactory.getFont(FontFactory.COURIER,9)));
cell3.setHorizontalAlignment(Element.ALIGN_RIGHT);
cell1.setLeading(16f, 0f);
cell3.setLeading(16f, 0f);
cell1.setBorder(Rectangle.NO_BORDER);
cell3.setBorder(Rectangle.NO_BORDER);

table.addCell(cell1);
table.addCell(cell3);
document.add(table);
document.newPage();
    } catch (DocumentException de) {
        de.printStackTrace();
        System.err.println("document: " + de.getMessage());
    }

    document.close();

那么当页面上的字符已被打印时,如何将dotmatrix打印机与连续纸张一起使用并停止纸卷轴?

3 个答案:

答案 0 :(得分:1)

欢迎来到地狱:-)以下是所有在您的过程中都有小爪子的守护进程:

  • PDF文件本身具有方向
  • PDF查看器/打印机可能会尝试旋转页面以适合页面
  • 打印机驱动程序也可以这样做
  • 如果您有激光打印机,也可能会旋转页面。

最“简单”的解决方案是在BufferedImage中渲染PDF,将其保存为像素图像(例如PNG)并打印出来。这样您就可以确保方向符合您的要求。

同时检查打印机驱动程序的设置:有些人在打印文件后发送“换页”字符,如果你填满整个a5页面,这将导致空页面。

答案 1 :(得分:0)

我遇到了与Jasper报告打印类似的问题(使用连续纸张),经过几天的代码摆弄后,我发现了一个我觉得适合你的解决方案。

我认为你要做的就是生成一个PDF文件作为输出,只需让AdobeReader exe进行打印,就可以使用

AcroRd32.exe / N / T PdfFile PrinterName

实现此目的的参数。

答案 2 :(得分:0)

经过长时间的研究,我找不到任何方法在客户的点阵打印机上打印而无需额外安装。

最有效的方法是拥有一个签名的applet。客户端需要安装Java。