質問

私は、100%ではないアルファで色を使用すると、ページ全体が印刷されない問題が発生しています。

例えば

  • 2ページがあります p1, P2.
  • 私は40%にセットされたアルファのある色を持っています C1.
  • 私は同じ色を持っていますが、100%アルファです C2.
  • 長方形があります r それはページに印刷されるかもしれません。
  • 両方にいくつかのテストテキストが印刷されています。

  • P1がRを印刷しない場合、P2はC2を使用してRを印刷し、P2は正常に印刷します。

  • P1がRを印刷しない場合、P2はC1を使用してRを印刷します。P2は印刷しません。
  • P1がC1を使用してRを印刷する場合、P2はC1を使用してRを印刷し、P2は正常に印刷します。

これを実証するためのサンプルアプリケーションは次のとおりです。

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.RoundRectangle2D;
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.swing.JButton;
import javax.swing.JFrame;

class Rectangle extends java.awt.Rectangle {
    public static final int SCREEN_RESOLUTION = 72;
    private static final int TWIP_CONVERT = 1440;

    Rectangle(int x, int y, int w, int h) {
        super(twip2pixel(x,1),twip2pixel(y,1),twip2pixel(w,1),twip2pixel(h,1));
    }

    static int twip2pixel(int twips, float zoom) {
         return Math.round(zoom * twips * SCREEN_RESOLUTION / TWIP_CONVERT);
     }
}

public class Test extends JFrame implements ActionListener{

    static Rectangle[] textRectangles1 = {
                new Rectangle(2590, 8075, 2325,265),
                new Rectangle(2480, 8480, 7595, 265),
                new Rectangle(1700, 8940, 8310, 265),
                new Rectangle(2445, 9385, 7615, 265),
                new Rectangle(2630, 9850, 7410, 265),
                new Rectangle(2015, 10320, 8005, 265),
                new Rectangle(2450, 10780, 7600, 265),
                new Rectangle(8210, 12240, 2170, 265),
    };

    static Rectangle[] textRectangles2 = {
                new Rectangle(1895, 5630, 6160, 265)
    };

    JButton btnPrint;
    JButton btnPrint2;
    JButton btnPrint3;

    public Test() {
        this.setLayout(new FlowLayout());

        btnPrint = new JButton("Print - 100% alpha - works");
        btnPrint.addActionListener(this);
        this.add(btnPrint);

        btnPrint2 = new JButton("Print2 - 40% alpha - doesn't work");
        btnPrint2.addActionListener(this);
        this.add(btnPrint2);

        btnPrint3 = new JButton("Print3 - both pages 40% alpha - works");
        btnPrint3.addActionListener(this);
        this.add(btnPrint3);

        this.pack();
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        Test test = new Test();
        test.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        PrinterJob job = PrinterJob.getPrinterJob();

        Book book = new Book();
        if(e.getSource().equals(btnPrint)) {
            book.append(new MyPage(textRectangles1, 255, false), new PageFormat());
            book.append(new MyPage(textRectangles2, 255, true), new PageFormat());
        } else if(e.getSource().equals(btnPrint2)) {
            book.append(new MyPage(textRectangles1, 255, false), new PageFormat());
            book.append(new MyPage(textRectangles2, 100, true), new PageFormat());
        } else {
            book.append(new MyPage(textRectangles1, 100, true), new PageFormat());
            book.append(new MyPage(textRectangles2, 100, true), new PageFormat());
        }

        job.setPageable(book);
        boolean doPrint = job.printDialog();
        if (doPrint) {
            try {
                job.print();
            } catch (PrinterException ex) {
                // The job did not successfully
                // complete
            }
        }
    }

    static void drawText(Graphics2D g, Rectangle r) {
        g.setClip(r.x, r.y, r.width, r.height);
        AffineTransform oldTransform = g.getTransform();
        g.scale(1.0, 1.0);
        g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
                   RenderingHints.VALUE_FRACTIONALMETRICS_ON);

        g.translate(r.x, r.y);
        g.setFont(new Font("Arial",0,10));

        g.setColor(Color.BLACK);

        float y = g.getFontMetrics().getAscent() + 1;
        g.drawString("TEST", 3, y);

        g.setTransform(oldTransform);
    }

    static void drawBox(Graphics2D g, Rectangle r, int alpha) {
        AffineTransform oldTransform = g.getTransform();
        float zoom = 1;
        g.scale(zoom, zoom);
        g.setClip(r);
        g.translate(r.x, r.y);

        Font boxFont = new Font("Arial", 1, 30);
        g.setFont(boxFont);

        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

        RoundRectangle2D rect = new RoundRectangle2D.Double(0.0,0.0,r.getWidth()-2,r.getHeight()-2,15 ,12);
        g.setColor(new Color(188, 238, 104, alpha));
        g.fill(rect);

        g.setTransform(oldTransform);
        g.setFont(new Font("Arial",0,10));
        g.setTransform(oldTransform);
    }
}

class MyPage implements Printable{
    int alpha = 255;
    boolean printRectangle = false;
    Rectangle[] textRectangles;

    MyPage(Rectangle[] textRectangles, int alpha, boolean printRectangle) {
        this.textRectangles = textRectangles;
        this.alpha = alpha;
        this.printRectangle = printRectangle;
    }

    @Override
    public int print(Graphics graphics, PageFormat pageFormat,
            int pageIndex) throws PrinterException {

        Graphics2D g2d = (Graphics2D) graphics;

        g2d.setPaint(Color.black);
        g2d.translate(10, 10);
        g2d.scale(0.96732026, 0.96732026);

        for(Rectangle r : textRectangles) {
            Test.drawText(g2d, r);
        }

        if(printRectangle) {
            Test.drawBox(g2d, new Rectangle(4156, 942, 3728, 1216), alpha);
        }

        return Printable.PAGE_EXISTS;
    }
}
役に立ちましたか?

解決

これは、Javaのバグによって引き起こされます。http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7146409

回避策は、幅と高さが0に設定されているが、グラフィックカラーが255未満の色に設定された最初のページに長方形を印刷することです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top