Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Printing 使用alpha颜色的Java打印可生成空白页面_Printing_Java 6 - Fatal编程技术网

Printing 使用alpha颜色的Java打印可生成空白页面

Printing 使用alpha颜色的Java打印可生成空白页面,printing,java-6,Printing,Java 6,我遇到了一个问题,当我使用的alpha颜色不是100%时,整个页面将无法打印 比如说 我有两页p1,p2 我有一种alpha设置为40%的颜色,叫做c1 我有相同的颜色,但100%alphac2 我有一个矩形r,可能打印在页面上,也可能不打印在页面上 我也有一些测试文本打印在这两个 如果p1不打印r,p2使用c2打印r,p2打印良好 如果p1不打印r,p2使用c1打印r,p2不打印 如果p1使用c1打印r,p2使用c1打印r,p2打印良好 下面是一个示例应用程序来演示这一点: import

我遇到了一个问题,当我使用的alpha颜色不是100%时,整个页面将无法打印

比如说

  • 我有两页p1p2
  • 我有一种alpha设置为40%的颜色,叫做c1
  • 我有相同的颜色,但100%alphac2
  • 我有一个矩形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错误引起的:

解决方法是在第一页打印矩形,宽度和高度设置为0,但图形颜色设置为alpha小于255的颜色