在双面模式下使用 Java 打印横向文档
Posted
技术标签:
【中文标题】在双面模式下使用 Java 打印横向文档【英文标题】:Printing landscape documents with Java on duplex mode 【发布时间】:2012-09-23 07:05:03 【问题描述】:我有一个 JasperReports 报告要在双面打印机上以横向模式打印。在这一点上,我必须支持 PCL5 和 PCL6 打印驱动程序。
在互联网上搜索,我发现了以下代码 sn -p 来完成这项工作:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.print.PrintService;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.OrientationRequested;
import javax.print.attribute.standard.Sides;
public class PrintingTest
public static void main(String[] args)
try
//This are for configuration purpose
String orientation = "LANDSCAPE";
String duplexMode = "LONG_EDGE";
int pageOrientation = 0;
PrintRequestAttributeSet atr = new HashPrintRequestAttributeSet();
if ("Landscape".equals(orientation))
atr.add(OrientationRequested.LANDSCAPE);
pageOrientation = PageFormat.LANDSCAPE;
else if ("Reverse_Landscape".equals(orientation))
atr.add(OrientationRequested.REVERSE_LANDSCAPE);
pageOrientation = PageFormat.REVERSE_LANDSCAPE;
else
atr.add(OrientationRequested.PORTRAIT);
pageOrientation = PageFormat.PORTRAIT;
if ("LONG_EDGE".equals(duplexMode))
atr.add(Sides.TWO_SIDED_LONG_EDGE);
else
atr.add(Sides.TWO_SIDED_SHORT_EDGE);
//Printing to the default printer
PrintService printer = javax.print.PrintServiceLookup
.lookupDefaultPrintService();
//Creating the printing job
PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setPrintService(printer);
Book book = new Book();
PageFormat pageFormat = printJob.defaultPage();
pageFormat.setOrientation(pageOrientation);
// Appending a exampledocument to the book
book.append(new ExampleDocument(), pageFormat);
// Appending another exampledocument to the book
book.append(new ExampleDocument(), pageFormat);
// Setting the Pageable to the printjob
printJob.setPageable(book);
try
// Here a could show the print dialog
// printJob.printDialog(atr);
// Here I pass the previous defined attributes
printJob.print(atr);
catch (Exception PrintException)
PrintException.printStackTrace();
catch (PrinterException ex)
ex.printStackTrace();
public static final int MARGIN_SIZE = 72;
private static class ExampleDocument implements Printable
public int print(Graphics g, PageFormat pageFormat, int page)
Graphics2D g2d = (Graphics2D) g;
g2d.translate(pageFormat.getImageableX(),
pageFormat.getImageableY());
// Only on the first two documents...
if (page <= 1)
// Prints using one inch margin
g2d.drawString("Printing page " + page + " - duplex...",
MARGIN_SIZE, MARGIN_SIZE);
return (PAGE_EXISTS);
return (NO_SUCH_PAGE);
这在 PCL6 上运行良好,但是在 PCL5 上进行测试时,我注意到 LONG_EDGE 和 SHORT_EDGE 规则被简单地忽略了。在这两种情况下,作业都以 LONG_EDGE 的形式发送。这不会是一个问题,除了 Java AWT 打印 API 通过将所有页面逆时针旋转 90º 来解决横向打印问题,从而造成以 SHORT_EDGE 模式打印的印象。
Obs:我能够正确打印两种配置,SHORT_EDGE 和 LONG_EDGE,纵向和横向,通过使用 SWT API。但我无法在 SWT 兼容的打印请求中转换碧玉打印请求。
我的问题是:有人遇到过这种情况吗?给出了哪种解决方案?
根据我的观察,我发现了这些可能的解决方案:
与其让 AWT 翻页并发送纵向打印请求,不如强制它作为横向打印请求发送;
想办法在页面处于横向模式时反转 LONG_EDGE 和 SHORT_EDGE 命令。请注意,对于这个问题,我有义务纠正两者都被视为 LONG_EDGE 请求的问题。
将JasperReports转换为使用SWT打印API。
【问题讨论】:
为什么要求 PCL5? 由于我们的项目正在从Delphi平台迁移到Java,我们必须保持对旧版本的功能的支持。我们希望避免将 PCL6 打印机驱动程序作为我们 Java 版本的要求添加。今天,我们准备系统在SWT
、PCL5
或AWT
、PCL6
中运行打印例程,用于双面横向 报告。 SWT
中的问题是,要打印,我需要将内存中的报告页面作为图像处理,这对于某些用户站来说非常繁重。
【参考方案1】:
不确定是否有帮助,但我在 6 年前遇到过这个问题,唯一的解决方案是使用打印机 (Xerox) 的功能通过 .xpf 文件接收打印指令。示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xpif SYSTEM "xpif-v02012.dtd">
<xpif cpss-version="2.01" version="1.0" xml:lang="en">
<xpif-operation-attributes>
<job-name syntax="name" xml:lang="en" xml:space="preserve">job name</job-name>
<requesting-user-name syntax="name" xml:space="preserve">domain user</requesting-user-name>
</xpif-operation-attributes>
<job-template-attributes>
<copies syntax="integer">1</copies>
<finishings syntax="1setOf">
<value syntax="enum">3</value>
</finishings>
<job-recipient-name syntax="name" xml:lang="en-US" xml:space="preserve">domain user</job-recipient-name>
<job-save-disposition syntax="collection">
<save-disposition syntax="keyword">none</save-disposition>
</job-save-disposition>
<media-col syntax="collection">
<media-type syntax="keyword">stationery</media-type>
<media-hole-count syntax="integer">0</media-hole-count>
<media-color syntax="keyword">blue</media-color>
<media-size syntax="collection">
<x-dimension syntax="integer">21000</x-dimension>
<y-dimension syntax="integer">29700</y-dimension>
</media-size>
</media-col>
<orientation-requested syntax="enum">3</orientation-requested>
<sheet-collate syntax="keyword">collated</sheet-collate>
<sides syntax="keyword">one-sided</sides>
<x-side1-image-shift syntax="integer">0</x-side1-image-shift>
<y-side1-image-shift syntax="integer">0</y-side1-image-shift>
</job-template-attributes>
</xpif>
与需要打印的文件一起发送到打印机。
【讨论】:
以上是关于在双面模式下使用 Java 打印横向文档的主要内容,如果未能解决你的问题,请参考以下文章
当我调用printtable的print方法时,默认情况下JPanel不以横向模式打印
设置后 VB .NET WinFormApplication 打印失败横向模式
在 Windows 8.1 下以横向模式剪切打印的 wpf 视觉对象