2013-01-22 3 views
2

Java에서 PrinterJob을 프린터에 실제로 인쇄하지 않도록하여 각 페이지에 대한 그래픽 개체를 얻을 수있는 방법이 있습니까? PrintService를 null로 설정하려고 시도했지만 Java가 허용하지 않습니다.PrinterJob을 사용하여 이미지 인쇄 (Graphics2D)

본질적으로 다른 맥락에서 PrinterJobs 기능을 재구성하지 않고도 문서의 정확한 인쇄 미리보기를 검색 할 수 있습니다. 여기

내 프로그램의 인쇄 기능에 대한 코드입니다 :

public int print(Graphics graphics, PageFormat pageFormat, int page) throws PrinterException { 

    deepCopyString = string; 

    FontMetrics metrics = graphics.getFontMetrics(font); 
    int lineHeight = metrics.getHeight(); 

    arrangePage(graphics, pageFormat, metrics); 

    if (page > pageBreaks.length){ 
     return NO_SUCH_PAGE; 
    } 

    Graphics2D g = (Graphics2D) graphics; 

    g.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); 
    g.setFont(font); 

    int begin = (page == 0) ? 0 : pageBreaks[page-1]; 
    int end = (page == pageBreaks.length) ? lines.length : pageBreaks[page]; 

    int y = 0; 
    int x = 0; 

    for (int line = begin; line < end; line++){ 
     x = 0; 
     y += lineHeight; 

     checkSyntax(line); 

     String l = lines[line]; 

     for (int c = 0; c < l.length(); c++){ 
      applySyntax(c, line); 

      metrics = graphics.getFontMetrics(font); 
      String ch = Character.toString(l.charAt(c)); 

      g.setFont(font); 
      g.drawString(ch, x, y); 

      x += metrics.charWidth(l.charAt(c)); 
      //System.out.println(c + "/"+l.length()); 
     } 

     //g.drawString(lines[line], 0, y); 
    } 

    reset(); 

    records.add(g); 

    return PAGE_EXISTS; 
} 

이미 내가 다른 구성 요소를 그릴 수 있도록 그래픽 오브젝트가 기록 된 것을 볼 수 있지만 것으로 오히려 쓸모 보는입니다 계속해서 레코드를 완성하기 전에 프린터로 보내십시오.

이것은 일반적으로 좋지 않은 아이디어 일 수 있으며 인쇄하기가 상당히 쉽습니다. 이 문제가 심각하게 악화되는 경우, 더 나은 방법을 설명 할 수있는 출처로 안내해주십시오.

답변

3

기본적으로 사용자가 페인트 할 수있는 Graphics 컨텍스트를 만들고 싶습니다. 또한 메서드에 지나칠 수있는 PageFormat을 생성해야합니다. 이제

public class TestPrint implements Printable { 

    private BufferedImage background; 
    public static final float DPI = 72; 

    public static void main(String[] args) { 
     new TestPrint(); 
    } 

    public TestPrint() { 

     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception ex) { 
       } 

       try { 
        background = ImageIO.read(new File("C:/Users/shane/Dropbox/MegaTokyo/MgkGrl_Yuki_by_fredrin.jpg")); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 

       float width = cmToPixel(21f, DPI); 
       float height = cmToPixel(29.7f, DPI); 

       Paper paper = new Paper(); 
       float margin = cmToPixel(1, DPI); 
       paper.setImageableArea(margin, margin, width - (margin * 2), height - (margin * 2)); 
       PageFormat pf = new PageFormat(); 
       pf.setPaper(paper); 

       BufferedImage img = new BufferedImage(Math.round(width), Math.round(height), BufferedImage.TYPE_INT_RGB); 
       Graphics2D g2d = img.createGraphics(); 
       g2d.setColor(Color.WHITE); 
       g2d.fill(new Rectangle2D.Float(0, 0, width, height)); 
       try { 
        g2d.setClip(new Rectangle2D.Double(pf.getImageableX(), pf.getImageableY(), pf.getImageableWidth(), pf.getImageableHeight())); 
        print(g2d, pf, 0); 
       } catch (PrinterException ex) { 
        ex.printStackTrace(); 
       } 
       g2d.dispose(); 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new JLabel(new ImageIcon(img))); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 

      } 
     }); 

    } 

    public float cmToPixel(float cm, float dpi) { 

     return (dpi/2.54f) * cm; 

    } 

    public int print(Graphics graphics, PageFormat pageFormat, int page) throws PrinterException { 

     if (page > 0) { 
      return NO_SUCH_PAGE; 
     } 

     Graphics2D g = (Graphics2D) graphics; 

     g.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); 
     if (background != null) { 

      int x = (int)Math.round((pageFormat.getImageableWidth() - background.getWidth())/2f); 
      int y = (int)Math.round((pageFormat.getImageableHeight() - background.getHeight())/2f); 

      g.drawImage(background, x, y, null); 

     } 

     g.setColor(Color.BLACK); 
     g.draw(new Rectangle2D.Double(0, 0, pageFormat.getImageableWidth() - 1, pageFormat.getImageableHeight() - 1)); 

     return PAGE_EXISTS; 
    } 
} 

enter image description here

은, 분명히,이 우리가 실제로 같은 하드웨어 장치를 사용하지 않을 때문에, 화면에 인쇄되어 어떤 프린터로 인쇄 무슨에 차이가 될 것,하지만된다 기본 개념이 적용됩니다.

+1

그래서 printable() 메서드를 직접 인쇄 가능한 객체에서 호출하면 실제로 프린터로 용지가 보내지지 않습니다. – Brayden

+1

아니요, 렌더링 할 그래픽 컨텍스트를 사용합니다 - 이것은 고전적인 인쇄 미리보기 접근 방식입니다 ... – MadProgrammer

+0

도움 주셔서 대단히 감사합니다. – Brayden