Потеря прозрачности на краске LinearGradient при печати на принтере MacOS X с использованием служб печати Java
Посмотрим, является ли это ошибкой в реализации Java для MacOSX (я использую 1.8.0_181). У меня есть LinearGradientPaint с цветом, который имеет прозрачность. Это правильно отображается на экране. При печати на принтере или в PDF прозрачность теряется в MacOSX, но печатается нормально в Windows 7 и Windows 10.
Обратите внимание, что красный цвет виден под прозрачным зеленым:
Смотри, что красный полностью скрыт, прозрачность потеряна: (напечатано в PDF)
Вот полный рабочий пример:
import java.awt.*;
import java.awt.print.*;
import javax.swing.*;
public class TestGradient {
public static class TwoRectangles extends JComponent {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
g2d.setColor(Color.RED);
g2d.fillRect(0, 75, 500, 150); //paint a red opaque rectangle
LinearGradientPaint p = new LinearGradientPaint(50, 100, 500, 100, new float[]{0.0f, 1.0f}, new Color[]{Color.GREEN, new Color(128, 128, 128, 128)}, MultipleGradientPaint.CycleMethod.NO_CYCLE);
g2d.setPaint(p);
g2d.fillRect(50, 50, 500, 200); //paint a green gradient with transparency
}
}
public static final TwoRectangles rect = new TwoRectangles();
public static void main(String[] args) throws PrinterException {
JFrame f = new JFrame("Test Gradient");
f.setLayout(new BorderLayout());
f.add(rect);
f.setSize(600, 300);
f.setVisible(true);
PrinterJob printJob = PrinterJob.getPrinterJob();
Printable prt = new Printable() {
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
if (pageIndex > 0)
return(NO_SUCH_PAGE);
rect.print(graphics);
return PAGE_EXISTS;
}
};
printJob.setPrintable(prt);
if (printJob.printDialog())
printJob.print();
}
}