[OpenJDK 2D-Dev] [12] Review request for 8201818: [macosx] Printing attributes break page size set via "java.awt.print.Book" object
Anton Litvinov
anton.litvinov at oracle.com
Fri Aug 17 19:42:34 UTC 2018
Hello,
Could you please review the following fix for the bug.
Bug: https://bugs.openjdk.java.net/browse/JDK-8201818
Webrev: http://cr.openjdk.java.net/~alitvinov/8201818/jdk12/webrev.00
The bug consists in the fact that, if any one printing attribute is
contained in "PrintRequestAttributeSet" during the call to
"java.awt.print.PrinterJob.print(PrintRequestAttributeSet)" method, a
page size from "java.awt.print.PageFormat" object provided by
"java.awt.print.Book" set to a printer job through
"PrinterJob.setPageable(Pageable)" method is not respected and the
printer job prints the document on a page of a size equal to a default
page size of a selected printer.
CAUSE OF THE BUG:
The root cause of the bug is
"sun.print.RasterPrinterJob.getPageFormatFromAttributes()" method which
returns "PageFormat" object constructed from default settings of the
selected printer, if the attribute set in the printer job is not empty.
For the case in this bug, when the user explicitly sets "Book" object
for the printer job, this method should not return anything except for
"null", because:
1. According to the documentation for the method
"PrinterJob.print(PrintRequestAttributeSet)" from Java Platform SE 8 API
Specification, if a user sets "java.awt.print.Pageable" object for
"PrinterJob", then printing attributes related to media size, imageable
area, page orientation will not influence anyhow the "PageFormat" object
used for printing, and only "PageFormat" provided by the "Pageable"
object will be used.
Statement: "For clients of the Pageable interface, the PageFormat will
always be as supplied by that interface, on a per page basis."
Specification URL #1:
https://docs.oracle.com/javase/8/docs/api/java/awt/print/PrinterJob.html#print-javax.print.attribute.PrintRequestAttributeSet-
2. Documentation on the method
"PrinterJob.printDialog(PrintRequestAttributeSet)" acknowledges the
point #1 by the statement "If using the Pageable interface, clients
which intend to use media selected by the user must create a PageFormat
derived from the user's selections.".
Specification URL #2:
https://docs.oracle.com/javase/8/docs/api/java/awt/print/PrinterJob.html#printDialog-javax.print.attribute.PrintRequestAttributeSet-
THE SOLUTION:
The solution consists in changing the method
"RasterPrinterJob.getPageFormatFromAttributes()" to return "null" for
cases, when the "Pageable" object set in the printer job is not an
instance of "sun.print.OpenBook" class, which is exclusively used by the
printer job to wrap "Printable" object set by the user through
"PrinterJob.setPrintable(Printable)".
The fix affects only macOS platform, because
"RasterPrinterJob.getPageFormatFromAttributes()" method is called only
from the macOS specific native code in the file
"src/java.desktop/macosx/native/libawt_lwawt/awt/CPrinterJob.m".
Thank you,
Anton
More information about the 2d-dev
mailing list