2012-11-26 116 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

相關問題