【问题标题】:itext and dotmatrix printersitext 和点阵打印机
【发布时间】:2012-01-07 20:04:49
【问题描述】:

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

发票必须在点阵打印机上用连续纸打印。

每个发票页面大小为 a5 横向大小。

如果我选择页面大小为 a5,代码会生成一个 PDF,如其所示

a5 portrait

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

如果我将页面大小选择为 a5 横向 (a5.rotate()),代码会生成一个 PDF,就像它在此处看到的那样,这样会更好。

a5 landscape

但是当它打印在纸上时,它开始垂直打印页面,因为打印机有一个 a4 纸盘。

在我看来,我需要将我的打印机定义为带有连续纸的点阵打印机。

我使用的代码是:

    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();

那么如何在连续纸上使用点阵打印机并在页面上的字符已经打印时停止纸张滚动?

【问题讨论】:

    标签: java pdf printing itext dot-matrix


    【解决方案1】:

    经过长时间的研究,我找不到任何方法可以在没有任何额外安装的情况下在客户的点阵打印机上打印。

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

    【讨论】:

      【解决方案2】:

      我在 Jasper 报告打印(连续纸)方面遇到了类似的问题,在摆弄了几天的代码之后,我找到了一个我认为对你有用的解决方案。

      我认为你要做的就是生成一个 PDF 文件作为输出,然后简单地获取 Adob​​eReader exe 来进行打印,你可以使用

      AcroRd32.exe /N /T PdfFile PrinterName

      参数来实现这一点。

      【讨论】:

      • 你好。感谢您的回复,正如我对上一个答案的评论,它是一个 Web 应用程序,并且文档需要在客户端打印,所以不能在 JSP 页面上使用这样的命令行。
      【解决方案3】:

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

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

      最“简单”的解决方案是在 BufferedImage 中呈现 PDF,将其保存为像素图像(例如 PNG)并打印出来。这将允许您确保方向是您想要的。

      还要检查打印机驱动程序的设置:其中一些在打印文件后会发送“换页”字符,如果您填满整个 a5 页面,则会导致空白页。

      【讨论】:

      • 你好亚伦。感谢您的及时建议。通过 PDF 发送到打印机背后的想法是,该系统是一个 Web 应用程序。所以;将数据发送到客户端打印机是通过将javascript添加到PDF文件来完成的,当它打开时,它会直接打印。不幸的是,在服务器端将发票转换为图形并没有帮助。
      • 在这种情况下,您需要修复客户端的打印机设置。确保打印机驱动程序在打印作业后不发送换页。至于页面旋转,您几乎无能为力:如果客户端使用相同的 PDF 查看器将其他 PDF 打印到不同的打印机,则方向可能会超出您的控制范围。
      猜你喜欢
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 2018-02-23
      • 2010-11-06
      • 2012-12-10
      • 1970-01-01
      相关资源
      最近更新 更多