Hi,
This is all very confusing. Here's some code that creates a PDF with 2
patterns. The code is a bit messy because I found a lot of small
roadblocks. Ultimately, a more cleaner version of this (after some
improvements in PDFBox) will be used as "official" example.
import java.io.IOException;
import java.io.OutputStream;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.cos.COSStream;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.color.PDColor;
import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
import org.apache.pdfbox.pdmodel.graphics.color.PDPattern;
import org.apache.pdfbox.pdmodel.graphics.pattern.PDTilingPattern;
import org.apache.pdfbox.util.Charsets;
/**
*
* @author Tilman Hausherr
*/
public class CreatePatterns
{
public static void main(String[] args) throws IOException
{
PDDocument doc = new PDDocument();
PDPage page = new PDPage();
doc.addPage(page);
page.setResources(new PDResources());
PDColorSpace patternCS1 = PDColorSpace.create(COSName.PATTERN,
page.getResources());
page.getResources().put(COSName.getPDFName("R9"), patternCS1);
PDPageContentStream pcs = new PDPageContentStream(doc, page);
//pcs.setNonStrokingColorSpace(patternCS);
// Colored pattern
// Table 75 spec
PDTilingPattern tilingPattern1 = new PDTilingPattern(new
COSStream()); //TODO new PDTilingPattern() must create a stream, not a
dictionary!
tilingPattern1.setBBox(new PDRectangle(0, 0, 10, 10));
tilingPattern1.setPatternType(1); //TODO check if default
tilingPattern1.setPaintType(PDTilingPattern.PAINT_COLORED);
tilingPattern1.setTilingType(PDTilingPattern.TILING_CONSTANT_SPACING);
tilingPattern1.setXStep(10);
tilingPattern1.setYStep(10);
tilingPattern1.getCOSObject().setItem(COSName.TYPE,
COSName.PATTERN); //TODO check if default
//TODO param name "resourceDictionary" for
PDTilingPattern(resourceDictionary) is misleading
tilingPattern1.setResources(new PDResources()); //TODO should
be default, required according to spec
// when it is missing Adobe Reader does nothing LOL
COSName patName1 = page.getResources().add(tilingPattern1);
//TODO Problem: there's no way to create something like a
PDPageContentStream
OutputStream os1 =
tilingPattern1.getContentStream().createOutputStream();
os1.write("1 0 0 RG 0 0 m 10 10 l s".getBytes(Charsets.US_ASCII));
os1.close();
PDColor pdColour1 = new PDColor(
// new float[]{0,1,0},
new float[0],
patName1,
patternCS1);
pcs.addRect(0, 0, 500, 700);
pcs.setNonStrokingColor(pdColour1);
pcs.fill();
// Uncolored pattern
PDTilingPattern tilingPattern2 = new PDTilingPattern(new
COSStream());
tilingPattern2.setBBox(new PDRectangle(0, 0, 10, 10));
tilingPattern2.setPatternType(1);
tilingPattern2.setPaintType(PDTilingPattern.PAINT_UNCOLORED);
tilingPattern2.setTilingType(PDTilingPattern.TILING_NO_DISTORTION);
tilingPattern2.setXStep(10);
tilingPattern2.setYStep(10);
tilingPattern2.getCOSObject().setItem(COSName.TYPE,
COSName.PATTERN); //TODO check if default
tilingPattern2.setResources(new PDResources());
COSName patName2 = page.getResources().add(tilingPattern2);
OutputStream os2 =
tilingPattern2.getContentStream().createOutputStream();
os2.write("0 10 m 10 0 l s".getBytes(Charsets.US_ASCII));
os2.close();
PDColorSpace patternCS2 = new PDPattern(null,
PDDeviceRGB.INSTANCE); //TODO weird - factory can't be used?
PDColor pdColour2 = new PDColor(
new float[]{0,1,0},
patName2,
patternCS2);
pcs.addRect(100, 100, 500, 500);
pcs.setNonStrokingColor(pdColour2);
pcs.fill();
pcs.close();
doc.save("patterns.pdf");
doc.close();
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]