Java SE8横向打印功能异常问题求助
解决Java SE8横向打印时页面空白区域异常的问题
嘿,这个问题我之前也踩过坑!你遇到的情况是Java打印API的一个常见小坑:直接修改defaultPage()返回的页面格式后,validatePage()并没有正确更新纸张的可打印区域——虽然绘制的内容因为坐标系旋转显示成了横向,但页面的实际尺寸还是沿用了纵向的设置,所以才没出现你预期的空白区域。
给你一套靠谱的解决方案,直接改代码就行:
PrinterJob job = PrinterJob.getPrinterJob(); // 先获取默认页面格式,克隆一份来修改,避免污染原打印上下文 PageFormat defaultPf = job.getPageFormat(null); PageFormat landscapePf = (PageFormat) defaultPf.clone(); // 设置横向打印模式 landscapePf.setOrientation(PageFormat.LANDSCAPE); // 关键步骤:手动调整纸张尺寸和可打印区域,适配横向布局 Paper paper = landscapePf.getPaper(); // 横向模式下,纸张的宽高需要互换(物理纸张方向变了,但API默认不会自动调整) double originalWidth = paper.getWidth(); double originalHeight = paper.getHeight(); paper.setSize(originalHeight, originalWidth); // 设置边距,数值可以根据自己的需求调整(单位是点,1英寸=72点) double margin = 20; // 注意:setImageableArea的参数是x, y, width, height,这里的宽高要对应交换后的纸张尺寸 paper.setImageableArea(margin, margin, originalHeight - 2 * margin, originalWidth - 2 * margin); landscapePf.setPaper(paper); // 验证格式并绑定到打印任务 PageFormat validatedPf = job.validatePage(landscapePf); job.setPrintable(myPrintable, validatedPf); job.print();
还要提醒你一个细节:如果之前你在Printable#print()方法里手动旋转了Graphics2D对象(比如g2d.rotate(...)),一定要把那部分代码删掉!因为设置了横向的PageFormat后,Java打印框架会自动帮你旋转绘制坐标系,手动旋转会导致内容转两次,反而出问题。
这样修改后,页面的可打印区域就会正确适配横向模式,空白区域也会按照预期显示出来啦。
内容的提问来源于stack exchange,提问作者smr
相关产品推荐
相关产品推荐

