import java.awt.*;
import java.awt.event.*;
import java.io.*;

import com.lowagie.text.*;
import com.lowagie.text.pdf.*;

class PatternTest extends Frame
{
	public static void main(String[] s)
	{
		PatternTest t = new PatternTest();
	}

	int h=170;
	int w=225;
	public PatternTest()
	{

        addWindowListener(
            new WindowAdapter()
            {
                public void windowClosing(WindowEvent we)
                {
					PatternTest.bUsePattern = false;
                    generatePDF();

					PatternTest.bUsePattern = true;
                    generatePDF();

                    System.exit(0);
                }
            }
        );

		setSize(w,h);
		show();
	}

	java.awt.Image img = null;
	private static boolean bUsePattern = false;

	public void paint(Graphics g)
	{
		loadImg();
		int iImageWidth = img.getWidth(this);
		int iImageHeight = img.getHeight(this);


		int iY = 0;
		while (iY < h)
		{
			int iX = 0;
			while (iX < w)
			{
				g.drawImage(img, iX, iY, this);
				iX += iImageWidth;
			}
			iY += iImageHeight;
		}
		g.drawString("Close window to generate PDF doc",5, h-10);
	}

	private void loadImg()
	{
		if (img == null)
		{
			img = Toolkit.getDefaultToolkit().getImage("web.gif");
			try
			{
				MediaTracker mediaTracker = new MediaTracker(this);
				mediaTracker.addImage(img, 0);
				mediaTracker.waitForID(0);
			}
			catch(InterruptedException iex)
			{
				iex.printStackTrace();
				img = null;
			}
		}
	}

	private void usePattern(PdfContentByte cb) throws Exception
	{
		com.lowagie.text.Image iTextImg = com.lowagie.text.Image.getInstance("file:///d:\\espresso\\swing\\web.gif");

		float iImageWidth = iTextImg.scaledWidth();
		float iImageHeight = iTextImg.scaledHeight();


		PdfPatternPainter pattern = cb.createPattern(iImageWidth, iImageHeight, iImageWidth, iImageHeight);
		pattern.addImage(iTextImg, iImageWidth, 0f, 0f, iImageHeight, 0f, 0f);
		cb.setPatternFill(pattern);
		cb.setGrayStroke(1f);
		cb.rectangle(0f, 0f, w, h);//not possible to get wallpaper within the margins only.
		cb.fillStroke();
	}
	void generatePDF()
	{
		com.lowagie.text.Rectangle rPage = new com.lowagie.text.Rectangle(w, h);
        Document document = new Document(rPage, 0.0f, 0.0f, 0.0f, 0.0f);
		String sOutputFileName = bUsePattern ? "UsesPattern.pdf" : "ImageReplicated.pdf";

        try
        {

            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(sOutputFileName));

            document.open();

            PdfContentByte cb = writer.getDirectContent();
            Graphics2D g2 = cb.createGraphics(w, h, new DefaultFontMapper());

			if (bUsePattern)
			{
				//USE PATTERN
				usePattern(cb);

			}
			else
			{
				//REPLICATE IMAGES
				paint(g2);
			}

            g2.dispose();
            document.close();
			System.out.println(sOutputFileName+" successfully generated!!!");
        }
        catch(Exception e)
        {
			e.printStackTrace();
			System.out.println("Failed to generate "+sOutputFileName);
		}
	}
}


