【问题标题】:Page formating not working for printing a page using Java in Netbeans页面格式不适用于在 Netbeans 中使用 Java 打印页面
【发布时间】:2021-04-21 10:21:52
【问题描述】:

我正在尝试打印具有自定义尺寸的页面。但它不工作。 我已经为我希望我的页面的宽度和高度设置了变量。

查看我的代码并提出一些更改建议

    PrinterJob job = PrinterJob.getPrinterJob();
    job.setJobName("Print Data");
        
    job.setPrintable(new Printable(){
        public int print(Graphics pg,PageFormat pf, int pageNum){
            //Paper paper = pf.getPaper();
            Paper paper = new Paper();
            double width = 8d * 22d;
            double height = 4d * 22d;
            double margin = 0.2d * 22d;
            paper.setSize(width, height);
            paper.setImageableArea(
                    margin,
                    margin,
                    width - (margin * 2),
                    height - (margin * 2));
            job.setPrintable(this, pf);
            
            if(pageNum > 0){
                return Printable.NO_SUCH_PAGE;
            }
            
            Graphics2D g2 = (Graphics2D)pg;

            g2.translate(pf.getImageableX(), pf.getImageableY());
            
            System.out.println("width1 = " + pf.getWidth());
            System.out.println("height1 = " + pf.getHeight());

            g2.setColor(Color.BLACK);
            g2.draw(new Rectangle2D.Double(0, 0, pf.getWidth(), pf.getHeight()));

            
            jPanel3.printAll(g2);
     
            return Printable.PAGE_EXISTS; 
        }
    });
    
    System.out.println("1");
    boolean ok = job.printDialog();
    
    if(ok){
        try{
            System.out.println("2");
            job.print();
            System.out.println("3");
        }
        catch (PrinterException ex){
            ex.printStackTrace();
        }
    }

我被这个问题困住了。无论我设置什么尺寸。我得到 ISO A4 尺寸的打印。我认为他们的代码有问题。

【问题讨论】:

  • 哦,打印,有什么好玩的????好的,打印 API 以 72dpi 的基本级别工作。因此,如果您想将纸张尺寸设置为 10x10 厘米,您需要将其转换为基于 72dpi 的像素,用于 exampleexample(我已经很久没有担心这个问题了,所以它可能已经改变)
  • 好的,也不要尝试在print 方法中更改纸张...有点晚,因为页面格式和纸张详细信息已经确定,并且详细信息可能已经发送到打印机

标签: java netbeans netbeans-8


【解决方案1】:

有很多可能的问题,但我要解决最令人头疼的问题

这...

job.setPrintable(new Printable(){
    public int print(Graphics pg,PageFormat pf, int pageNum){
        //Paper paper = pf.getPaper();
        Paper paper = new Paper();
        double width = 8d * 22d;
        double height = 4d * 22d;
        double margin = 0.2d * 22d;
        paper.setSize(width, height);
        paper.setImageableArea(
                margin,
                margin,
                width - (margin * 2),
                height - (margin * 2));
        job.setPrintable(this, pf);

是一个可怕的、可怕的想法。就像在绘制组件时,不修改状态一样,它可能会产生意想不到的后果。

相反,在这种情况下,您应该提前确定Paper 大小。然后应将其应用于PageFormat 并通过setPrintable(Printable, PageFormat) 方法传递给PrintJob

也就是说,它可能看起来更像……

PrinterJob job = PrinterJob.getPrinterJob();
job.setJobName("Print Data");
//Paper paper = pf.getPaper();
PageFormat pageFormat = job.defaultPage();
Paper paper = new Paper();
double width = 8d * 22d;
double height = 4d * 22d;
double margin = 0.2d * 22d;
paper.setSize(width, height);
paper.setImageableArea(
        margin,
        margin,
        width - (margin * 2),
        height - (margin * 2));

pageFormat.setPaper(paper);

job.setPrintable(new Printable() {
    @Override
    public int print(Graphics pg, PageFormat pf, int pageNum) {
        if (pageNum > 0) {
            return Printable.NO_SUCH_PAGE;
        }
        Graphics2D g2 = (Graphics2D) pg;

        g2.translate(pf.getImageableX(), pf.getImageableY());

        System.out.println("width1 = " + pf.getWidth());
        System.out.println("height1 = " + pf.getHeight());

        g2.setColor(Color.BLACK);
        // Consider using pf.getImageableWidth() and pf.getImageableHeight() instead
        g2.draw(new Rectangle2D.Double(0, 0, pf.getWidth(), pf.getHeight()));

        // Maybe consider drawing your border first, as `printAll` 
        // might fill in the whole page
        jPanel3.printAll(g2);

        return Printable.PAGE_EXISTS;
    }
}, pageFormat);

System.out.println("1");
boolean ok = job.printDialog();

if (ok) {
    try {
        System.out.println("2");
        job.print();
        System.out.println("3");
    } catch (PrinterException ex) {
        ex.printStackTrace();
    }
}

我说可能,因为有一堆验证和其他系统垃圾,最终可能仍然不是你想要的。

我确实建议看看...

作为一些基本示例,都在做类似的事情 - 改变纸张大小:D

【讨论】:

  • 你能给我一个程序,我可以用它打印特定页面格式的图像。我将 jPanel 转换为缓冲图像,然后将其保存为 png 格式并将其加载到 Image 类中。现在我希望在打印页面上以特定尺寸和纵横比打印此图像
  • BufferedImage img = new BufferedImage(jPanel3.getWidth(),jPanel3.getHeight(),BufferedImage.TYPE_INT_RGB); jPanel3.paint(img.getGraphics());尝试 { ImageIO.write(img,"png",new File("saved.png")); Image image = ImageIO.read(new File("saved.png")); } catch (IOException ex) { Logger.getLogger(generate_id_card.class.getName()).log(Level.SEVERE, null, ex); }
  • @AnmolDhall 关于“你能给我一个程序,我可以用它打印特定页面格式的图像吗”,答案是否定的。请注意,这是一个帮助开发人员解决编程问题的网站,但不适合要求其他人为您编写代码。
  • @AnmolDhall 至少有两个处理打印图像的链接示例和几乎所有更改页面大小/页面格式的链接示例
  • @AnmolDhall 现在你有一个example,它甚至可以处理多页打印
猜你喜欢
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
相关资源
最近更新 更多