2012-11-26 117 views
4

我想从Java小程序打印自定义纸张大小。我已设置纸张尺寸,但它被忽略。如何打印自定义纸张尺寸(检查8“x 4”)?

我也尝试过使用本书的方法,因为我已经看到了一些有关这有助于它的工作,但是当我用它时,它只是打印一个空白页,似乎仍然是关于A4(我正在打印检查这显然要小得多(8“×4”))。

我想从JEditorPane打印HTML,如果这有什么区别。

如果您有任何想法,我将非常感激,我正在用这个撕掉我的头发。

我还应该补充一点,就Java而言,我是一个非常初学者。

这是我到目前为止有:

更新时间: 我现在拿到的页面大小合适的,但似乎无法让我加载到适应或与排队HTML页面页面大小。

更新: 现在我只是不能让小程序在浏览器中运行。它从eclipse起作用,而不是浏览器。我还需要从参数中传递URL。

这里是我使用的HTML Applet标记和更新Java代码:

<!DOCTYPE html> 
<html> 
<head><title>Printing Cheque</title></head> 
<body> 
<applet width=100 height=100 code="HTMLPrinter" 
     archive="cheque_print.jar"> 
</applet> 

</body> 
</html> 


package com.yunatech.pns.chequeprint; 

import java.applet.Applet; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.print.Book; 
import java.awt.print.PageFormat; 
import java.awt.print.Paper; 
import java.awt.print.Printable; 
import java.awt.print.PrinterException; 
import java.awt.print.PrinterJob; 
import javax.swing.JEditorPane; 

public class HTMLPrinter extends Applet { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 8065834484717197790L; 
    private static JEditorPane editor; 

    public HTMLPrinter() { 


     try { 

      editor = new JEditorPane(); 
      editor.setPage("http://localhost/print_test/test.html"); 

      PrinterJob pj = PrinterJob.getPrinterJob(); 
      if (pj.printDialog()) { 
       PageFormat pf = pj.defaultPage(); 
       Paper paper = pf.getPaper(); 
       double width = 8d * 72d; 
       double height = 4d * 72d; 
       double margin = 1d * 72d; 
       paper.setSize(width, height); 
       paper.setImageableArea(
         margin, 
         0, 
         width - (margin * 2), 
         height); 
       System.out.println("Before- " + dump(paper)); 
       pf.setOrientation(PageFormat.PORTRAIT); 
       pf.setPaper(paper); 
       System.out.println("After- " + dump(paper)); 
       System.out.println("After- " + dump(pf)); 
       dump(pf); 
       PageFormat validatePage = pj.validatePage(pf); 
       System.out.println("Valid- " + dump(validatePage)); 

       Book pBook = new Book(); 
       pBook.append(new Page(), pf); 
       pj.setPageable(pBook); 

       try { 
        pj.print(); 
       } catch (PrinterException ex) { 
        ex.printStackTrace(); 
       } 
      } 

     } catch (Exception exp) { 
      exp.printStackTrace(); 
     } 
    } 

    protected static String dump(Paper paper) { 
     StringBuilder sb = new StringBuilder(64); 
     sb.append(paper.getWidth()).append("x").append(paper.getHeight()) 
       .append("/").append(paper.getImageableX()).append("x"). 
       append(paper.getImageableY()).append(" - ").append(paper 
       .getImageableWidth()).append("x").append(paper.getImageableHeight()); 
     return sb.toString(); 
    } 

    protected static String dump(PageFormat pf) { 
     Paper paper = pf.getPaper(); 
     return dump(paper); 
    } 

    public static class Page implements Printable { 

     public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) { 
      if (pageIndex >= 1) return Printable.NO_SUCH_PAGE; 

      Graphics2D g2d = (Graphics2D)graphics; 
      g2d.translate((int)pageFormat.getImageableX(), (int)pageFormat.getImageableY()); 

      editor.setSize((int)pageFormat.getImageableWidth(), (int)pageFormat.getImageableHeight()); 
      editor.print(g2d); 

      return Printable.PAGE_EXISTS; 
     } 
    } 
} 

预先感谢您可以提供任何帮助。

回答

8

打印设计为以每英寸像素为单位工作。基底印刷API使用的72

您需要将相应的测量转换DPI ...

double paperWidth = 8 * 72d; 
double paperHeight = 4 * 72d; 
double margin = 1 * 72d; 

更新,例如

g2d.setClip(0, 0, (int)pageFormat.getImageableWidth(), (int)pageFormat.getImageableHeight());病谏,危险的,一般,不除此之外,你已经使用了错误的宽度和高度值。可成像的参数考虑了边距,但是您尚未翻译图形,这将更有可能切割底部,您必须打印的区域的左侧部分...

我只是避免使用裁剪

enter image description here

public class TestPrinting01 { 

    public static void main(String[] args) { 

     PrinterJob pj = PrinterJob.getPrinterJob(); 
     if (pj.printDialog()) { 
      PageFormat pf = pj.defaultPage(); 
      Paper paper = pf.getPaper(); 
      double width = 8d * 72d; 
      double height = 4d * 72d; 
      double margin = 1d * 72d; 
      paper.setSize(width, height); 
      paper.setImageableArea(
        margin, 
        margin, 
        width - (margin * 2), 
        height - (margin * 2)); 
      System.out.println("Before- " + dump(paper)); 
      pf.setOrientation(PageFormat.LANDSCAPE); 
      pf.setPaper(paper); 
      System.out.println("After- " + dump(paper)); 
      System.out.println("After- " + dump(pf)); 
      dump(pf); 
      PageFormat validatePage = pj.validatePage(pf); 
      System.out.println("Valid- " + dump(validatePage)); 

      Book pBook = new Book(); 
      pBook.append(new Page(), pf); 
      pj.setPageable(pBook); 

      try { 
       pj.print(); 
      } catch (PrinterException ex) { 
       ex.printStackTrace(); 
      } 
     } 
    } 

    protected static String dump(Paper paper) { 
     StringBuilder sb = new StringBuilder(64); 
     sb.append(paper.getWidth()).append("x").append(paper.getHeight()) 
       .append("/").append(paper.getImageableX()).append("x"). 
       append(paper.getImageableY()).append(" - ").append(paper 
       .getImageableWidth()).append("x").append(paper.getImageableHeight()); 
     return sb.toString(); 
    } 

    protected static String dump(PageFormat pf) { 
     Paper paper = pf.getPaper(); 
     return dump(paper); 
    } 

    public static class Page implements Printable { 

     public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) { 
      if (pageIndex >= 1) { 
       return Printable.NO_SUCH_PAGE; 
      } 

      Graphics2D g2d = (Graphics2D) graphics; 
      // Be careful of clips... 
      g2d.translate((int) pageFormat.getImageableX(), (int) pageFormat.getImageableY()); 

      double width = pageFormat.getImageableWidth(); 
      double height = pageFormat.getImageableHeight(); 

      g2d.drawRect(0, 0, (int)pageFormat.getImageableWidth() - 1, (int)pageFormat.getImageableHeight() - 1); 
      FontMetrics fm = g2d.getFontMetrics(); 
      String text = "top"; 
      g2d.drawString(text, 0, fm.getAscent()); 

      text = "bottom"; 
      double x = width - fm.stringWidth(text); 
      double y = (height - fm.getHeight()) + fm.getAscent(); 
      g2d.drawString(text, (int)x, (int)y); 

      return Printable.PAGE_EXISTS; 
     } 
    } 
} 

修订

当打印组件,你成为负责它的布局。

enter image description here

public class TestPrinting01 { 

    private static JEditorPane editor; 

    public static void main(String[] args) { 

     try { 

      editor = new JEditorPane(); 
      editor.setPage(new File("C:/hold/search.htm").toURI().toURL()); 

      PrinterJob pj = PrinterJob.getPrinterJob(); 
      if (pj.printDialog()) { 
       PageFormat pf = pj.defaultPage(); 
       Paper paper = pf.getPaper(); 
       double width = 8d * 72d; 
       double height = 4d * 72d; 
       double margin = 1d * 72d; 
       paper.setSize(width, height); 
       paper.setImageableArea(
         margin, 
         margin, 
         width - (margin * 2), 
         height - (margin * 2)); 
       System.out.println("Before- " + dump(paper)); 
       pf.setOrientation(PageFormat.LANDSCAPE); 
       pf.setPaper(paper); 
       System.out.println("After- " + dump(paper)); 
       System.out.println("After- " + dump(pf)); 
       dump(pf); 
       PageFormat validatePage = pj.validatePage(pf); 
       System.out.println("Valid- " + dump(validatePage)); 

       Book pBook = new Book(); 
       pBook.append(new Page(), pf); 
       pj.setPageable(pBook); 

       try { 
        pj.print(); 
       } catch (PrinterException ex) { 
        ex.printStackTrace(); 
       } 
      } 

     } catch (Exception exp) { 
      exp.printStackTrace(); 
     } 
    } 

    protected static String dump(Paper paper) { 
     StringBuilder sb = new StringBuilder(64); 
     sb.append(paper.getWidth()).append("x").append(paper.getHeight()) 
       .append("/").append(paper.getImageableX()).append("x"). 
       append(paper.getImageableY()).append(" - ").append(paper 
       .getImageableWidth()).append("x").append(paper.getImageableHeight()); 
     return sb.toString(); 
    } 

    protected static String dump(PageFormat pf) { 
     Paper paper = pf.getPaper(); 
     return dump(paper); 
    } 

    public static class Page implements Printable { 

     public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) { 
      if (pageIndex >= 1) { 
       return Printable.NO_SUCH_PAGE; 
      } 

      Graphics2D g2d = (Graphics2D) graphics; 
      // Be careful of clips... 
//   g2d.setClip(0, 0, (int) pageFormat.getWidth(), (int) pageFormat.getHeight()); 
      g2d.translate((int) pageFormat.getImageableX(), (int) pageFormat.getImageableY()); 

      double width = pageFormat.getImageableWidth(); 
      double height = pageFormat.getImageableHeight(); 

      System.out.println("width = " + width); 
      System.out.println("height = " + height); 

      editor.setLocation(0, 0); 
      editor.setSize((int)width, (int)height); 
      editor.printAll(g2d); 

      g2d.setColor(Color.BLACK); 
      g2d.draw(new Rectangle2D.Double(0, 0, width, height)); 

      return Printable.PAGE_EXISTS; 
     } 
    } 
} 
+0

感谢您的答复,但这似乎并没有改变任何东西。我很高兴知道我是否可以接受我的纸张尺寸。 – Liam

+0

@liam新增工作示例 – MadProgrammer

+0

谢谢,这对我有很大的帮助,而且我越来越接近获得我想要的东西。纸张大小是正确的,但我似乎无法得到我正在加载正确的大小或位置的HTML页面。我更新了上面的代码以显示我现在拥有的内容。任何想法,我要去错了吗? – Liam

相关问题