Потеря прозрачности на краске 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();

  } 
 }

0 ответов

Другие вопросы по тегам