Java打印 - 设置边框大小

4

我想在Java中将打印文档的大小设置为零或去掉边框。它总是有一个标准的白色边框。

这是我的函数,用于打印JPanel和一些组件:

    public void printComponent(){

          PrinterJob pj = PrinterJob.getPrinterJob();
          pj.setJobName(" Print Component ");

          pj.setPrintable (new Printable() {

            @Override
            public int print(Graphics pg, PageFormat pf, int pageNum) throws PrinterException {
                if (pageNum > 0){
                      return Printable.NO_SUCH_PAGE;
                      }

                      Graphics2D g2 = (Graphics2D) pg;
                      g2.translate(pf.getImageableX(), pf.getImageableY());
                      TournamentView.this.paint(g2);
                      return Printable.PAGE_EXISTS;
            }

          });
          if (pj.printDialog() == false)
          return;

          try {
              PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
              aset.add(OrientationRequested.LANDSCAPE);
              PrinterResolution pr = new PrinterResolution(200, 200, PrinterResolution.DPI);
              aset.add(pr);
              pj.print( aset);
          } catch (PrinterException ex) {
                // handle exception
          }
        }

我因为这里没有打印机,所以正在使用Adobe PDF打印机。有什么建议吗?

1个回答

7
使用带有PageFormat参数的PrinterJob.setPrintable()版本。
PageFormat中,将纸张的可打印区域设置为没有边框(x=0,y=0,宽度=纸张宽度,高度=纸张高度)。
你可能想要通过PrinterJob.validatePage()来验证它,该方法:

返回克隆的页面,其设置已调整以与此PrinterJob的当前打印机兼容。例如,返回的PageFormat可以将其可打印区域调整为适合于当前打印机使用的纸张的物理区域。

这是一个好主意,因为打印机可能不支持无边框打印,而且此方法将调整你的PageFormat,使其与打印机兼容。
以下是一个打印一些文本并去除边框的示例:
PrinterJob pj = PrinterJob.getPrinterJob();
PageFormat format = pj.getPageFormat(null);
Paper paper = format.getPaper();
//Remove borders from the paper
paper.setImageableArea(0.0, 0.0, format.getPaper().getWidth(), format.getPaper().getHeight());
format.setPaper(paper);

pj.setPrintable(new Printable()
{
    @Override
    public int print(Graphics pg, PageFormat pf, int pageNum)
            throws PrinterException
    {
        if (pageNum > 0)
            return Printable.NO_SUCH_PAGE;

        Graphics2D g2 = (Graphics2D)pg;
        g2.translate(pf.getImageableX(), pf.getImageableY());
        int textHeight = g2.getFontMetrics().getHeight();
        g2.drawString("Good morning, what will be for eating?", 0, textHeight);
        return Printable.PAGE_EXISTS;
    }
}, format);

if (!pj.printDialog())
    return;

pj.print();

在Windows上使用Postscript ->文件打印机进行测试。仍有一小部分边框未打印,但这可能是打印机驱动程序的限制。


这个很好地解决了,现在出现的问题是打印对话框需要大约10秒钟才会弹出 - 有什么想法吗? - Anthea
当您使用PrinterJob.setPrintable(Printable,PageFormat)而不是PrinterJob.setPrintable(Printable)时,它会发生。 - Anthea
@Anthea 尝试将你的绘画代码减少到绝对最少(例如只绘制一条线或字符串)。这可能是由于大量剪切导致的减速,或者是打印机驱动程序。当我使用后置脚本打印机驱动程序打印到文件时,我没有遇到任何这样的减速情况。 - prunge
好的,我在另一台电脑上尝试了一下,那里它正常工作。我要检查一下我的打印机驱动程序!非常感谢。 - Anthea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接