Re: Java: how to use xulrunner to convert html to postscript?

Daniel Oliveira <[email protected]> Thu, 20 Feb 2014 07:16:50 -0800 (PST)
Newsgroups gmane.comp.mozilla.devel.embedding
Message-ID <[email protected]>
Em quarta-feira, 19 de fevereiro de 2014 14h28min14s UTC-3, Daniel Oliveira  escreveu:
> Hello,
> 
> 
> 
>    I wonder if is possible,use xulrunner to convert html to postscript or pcl in java? and how would I do this implementation with java 7,  firefox 26 and xulrunner 1.80.0.1 26? Thanks in advance
> 
> 
> 
> Daniel Oliveira

I believe that when you have to print a document in browser, it did not just send that document to the printer, it converts into a common format printing (PCL believe) because there are printers (as is my case) not acceptance any MIME Types therefore I needed of a converser an html document to postscript so that I can manage this impression. But I found a plausible solution, I'll post the code below, briefly I incorporated xulrunner10 using eclipse SWT and converted the result into a png image for printing. My job now is to find a more current version of xulrunner compatible with Eclipse SWT 4.3 to interpret the latest features of html.

Download eclipse SWT (http://ftp.mozilla.org/pub/mozilla.org/xulrunner/releases/11.0/runtimes/)
 and add in eclipse project 

Download Xulrunner 10 (http://www.eclipse.org/swt/)
 and extract to C:\xulrunner


package core;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

import org.apache.commons.io.IOUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

import core.ImageConverter;

public class BrowserSWT {

	public BrowserSWT(){
		
		final Display display = new Display();
	    final Shell shell = new Shell(display);
	    shell.setText("My Browser");
	    shell.setSize(500, 500);
	    shell.setLayout(new GridLayout(1,false));
		
		Browser browser = new Browser(shell, SWT.MOZILLA);
		
		InputStream input = null;
		String html = null;
		try {
			
			input = new FileInputStream(new File("src/teste.html"));
			html = IOUtils.toString(input,"UTF-8");	
			
		} catch (FileNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		browser.setText(html);
	
		browser.setLayoutData(new GridData(GridData.FILL_BOTH));
		
		shell.open();
	    while (!shell.isDisposed()) {
	      if (!display.readAndDispatch()){
	        display.sleep();
	      }
	    }
	    display.dispose();
	    
		Image img = new Image(display, 500, 500);
        GC gc = new GC(img);
        browser.print(gc);
        gc.dispose();
        
        BufferedImage imageNew = null;
        
        ImageConverter converter = new ImageConverter();
        
        imageNew = converter.convertToAWT(img.getImageData());
        
        JLabel label = new JLabel(new ImageIcon(imageNew));
	
        JOptionPane.showMessageDialog(null, label, "Ingresso",JOptionPane.PLAIN_MESSAGE, null);
	}
	
	
	public static void main(String[] args){
		
		System.setProperty("org.eclipse.swt.browser.XULRunnerPath", "C:\\xulrunner");//-Dorg.eclipse.swt.browser.XULRunnerPath=C:\xulrunner
		
		BrowserSWT browser = new BrowserSWT();
	}
}

############### Converter SWT Image to AWT BufferImage ####################

package core;

import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.DirectColorModel;
import java.awt.image.IndexColorModel;
import java.awt.image.WritableRaster;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;

public class ImageConverter {

	  public BufferedImage convertToAWT(ImageData data) {
	    ColorModel colorModel = null;
	    PaletteData palette = data.palette;
	    if (palette.isDirect) {
	      colorModel = new DirectColorModel(data.depth, palette.redMask,
	          palette.greenMask, palette.blueMask);
	      BufferedImage bufferedImage = new BufferedImage(colorModel,
	          colorModel.createCompatibleWritableRaster(data.width,
	              data.height), false, null);
	      WritableRaster raster = bufferedImage.getRaster();
	      int[] pixelArray = new int[3];
	      for (int y = 0; y < data.height; y++) {
	        for (int x = 0; x < data.width; x++) {
	          int pixel = data.getPixel(x, y);
	          RGB rgb = palette.getRGB(pixel);
	          pixelArray[0] = rgb.red;
	          pixelArray[1] = rgb.green;
	          pixelArray[2] = rgb.blue;
	          raster.setPixels(x, y, 1, 1, pixelArray);
	        }
	      }
	      return bufferedImage;
	    } else {
	      RGB[] rgbs = palette.getRGBs();
	      byte[] red = new byte[rgbs.length];
	      byte[] green = new byte[rgbs.length];
	      byte[] blue = new byte[rgbs.length];
	      for (int i = 0; i < rgbs.length; i++) {
	        RGB rgb = rgbs[i];
	        red[i] = (byte) rgb.red;
	        green[i] = (byte) rgb.green;
	        blue[i] = (byte) rgb.blue;
	      }
	      if (data.transparentPixel != -1) {
	        colorModel = new IndexColorModel(data.depth, rgbs.length, red,
	            green, blue, data.transparentPixel);
	      } else {
	        colorModel = new IndexColorModel(data.depth, rgbs.length, red,
	            green, blue);
	      }
	      BufferedImage bufferedImage = new BufferedImage(colorModel,
	          colorModel.createCompatibleWritableRaster(data.width,
	              data.height), false, null);
	      WritableRaster raster = bufferedImage.getRaster();
	      int[] pixelArray = new int[1];
	      for (int y = 0; y < data.height; y++) {
	        for (int x = 0; x < data.width; x++) {
	          int pixel = data.getPixel(x, y);
	          pixelArray[0] = pixel;
	          raster.setPixel(x, y, pixelArray);
	        }
	      }
	      return bufferedImage;
	    }
	  }

	  public ImageData convertToSWT(BufferedImage bufferedImage) {
	    if (bufferedImage.getColorModel() instanceof DirectColorModel) {
	      DirectColorModel colorModel = (DirectColorModel) bufferedImage
	          .getColorModel();
	      PaletteData palette = new PaletteData(colorModel.getRedMask(),
	          colorModel.getGreenMask(), colorModel.getBlueMask());
	      ImageData data = new ImageData(bufferedImage.getWidth(),
	          bufferedImage.getHeight(), colorModel.getPixelSize(),
	          palette);
	      WritableRaster raster = bufferedImage.getRaster();
	      int[] pixelArray = new int[3];
	      for (int y = 0; y < data.height; y++) {
	        for (int x = 0; x < data.width; x++) {
	          raster.getPixel(x, y, pixelArray);
	          int pixel = palette.getPixel(new RGB(pixelArray[0],
	              pixelArray[1], pixelArray[2]));
	          data.setPixel(x, y, pixel);
	        }
	      }
	      return data;
	    } else if (bufferedImage.getColorModel() instanceof IndexColorModel) {
	      IndexColorModel colorModel = (IndexColorModel) bufferedImage
	          .getColorModel();
	      int size = colorModel.getMapSize();
	      byte[] reds = new byte[size];
	      byte[] greens = new byte[size];
	      byte[] blues = new byte[size];
	      colorModel.getReds(reds);
	      colorModel.getGreens(greens);
	      colorModel.getBlues(blues);
	      RGB[] rgbs = new RGB[size];
	      for (int i = 0; i < rgbs.length; i++) {
	        rgbs[i] = new RGB(reds[i] & 0xFF, greens[i] & 0xFF,
	            blues[i] & 0xFF);
	      }
	      PaletteData palette = new PaletteData(rgbs);
	      ImageData data = new ImageData(bufferedImage.getWidth(),
	          bufferedImage.getHeight(), colorModel.getPixelSize(),
	          palette);
	      data.transparentPixel = colorModel.getTransparentPixel();
	      WritableRaster raster = bufferedImage.getRaster();
	      int[] pixelArray = new int[1];
	      for (int y = 0; y < data.height; y++) {
	        for (int x = 0; x < data.width; x++) {
	          raster.getPixel(x, y, pixelArray);
	          data.setPixel(x, y, pixelArray[0]);
	        }
	      }
	      return data;
	    }
	    return null;
	  }

	  static ImageData createSampleImage(Display display) {
	    Image image = new Image(display, 100, 100);
	    Rectangle bounds = image.getBounds();
	    GC gc = new GC(image);
	    gc.setBackground(display.getSystemColor(SWT.COLOR_BLUE));
	    gc.fillRectangle(bounds);
	    gc.setBackground(display.getSystemColor(SWT.COLOR_GREEN));
	    gc.fillOval(0, 0, bounds.width, bounds.height);
	    gc.setForeground(display.getSystemColor(SWT.COLOR_RED));
	    gc.drawLine(0, 0, bounds.width, bounds.height);
	    gc.drawLine(bounds.width, 0, 0, bounds.height);
	    gc.dispose();
	    ImageData data = image.getImageData();
	    image.dispose();
	    return data;
	  }
	  
}


Thanks!

Daniel Oliveira