// a page
COSDictionary page = new COSDictionary();
page.setItem(COSName.TYPE, COSName.PAGE);
page.setItem(COSName.PARENT, doc.createObject(pages));
COSArray mediaBox = new COSArray();
mediaBox.add( new COSInteger(0));
mediaBox.add( new COSInteger(0));
mediaBox.add( new COSInteger(612));
mediaBox.add( new COSInteger(792));
page.setItem(COSName.getPDFName("MediaBox"), mediaBox);
byte[] bytes = ("BT /F1 24 Tf 100 100 Td (" + message + ") Tj ET").getBytes();
COSDictionary streamDict = new COSDictionary();
streamDict.setItem(COSName.LENGTH, new COSInteger(bytes.length));
COSStream contents = new COSStream(streamDict,doc.getScratchFile());
OutputStream output = contents.createUnfilteredStream();
output.write(bytes);
output.close();
page.setItem(COSName.CONTENTS, doc.createObject(contents));
COSDictionary resources = new COSDictionary();
// the procset
COSArray procSet = new COSArray();
procSet.add(COSName.getPDFName("PDF"));
procSet.add(COSName.getPDFName("Text"));
resources.setItem(COSName.getPDFName("ProcSet"), doc.createObject(procSet));
// the font
COSDictionary font = new COSDictionary();
font.setItem(COSName.TYPE, COSName.FONT);
font.setItem(COSName.SUBTYPE, COSName.getPDFName("Type1"));
font.setItem(COSName.getPDFName("Name"), COSName.getPDFName("F1"));
font.setItem(COSName.getPDFName("BaseFont"), COSName.getPDFName("Helvetica"));
COSDictionary fontDict = new COSDictionary();
fontDict.setItem(COSName.getPDFName("F1"), doc.createObject(font));
resources.setItem(COSName.getPDFName("Font"), fontDict);
page.setItem(COSName.RESOURCES, resources);
// now add the page
pagesArray.add(doc.createObject(page));
pages.setItem(COSName.KIDS, pagesArray);
pages.setItem(COSName.COUNT, new COSInteger(pagesArray.size()));
// the catalog dict
COSDictionary catalog = new COSDictionary();
catalog.setItem(COSName.TYPE, COSName.CATALOG);
catalog.setItem(COSName.PAGES, doc.createObject(pages));