No title Revision 356536623839 (Sat Jan 07 2017 at 16:34) - Diff Link to this snippet: https://friendpaste.com/3r6AGc3fAl600NuiWfrb6O Embed: manni perldoc borland colorful default murphy trac fruity autumn bw emacs pastie friendly Show line numbers Wrap lines 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208import java.io.File;import java.io.IOException;import java.util.Date;import java.util.Iterator;import org.apache.commons.io.FileUtils;import org.apache.commons.lang3.time.StopWatch;import de.intarsys.pdf.cds.CDSRectangle;import de.intarsys.pdf.content.CSContent;import de.intarsys.pdf.content.TextState;import de.intarsys.pdf.content.common.CSCreator;import de.intarsys.pdf.cos.COSArray;import de.intarsys.pdf.cos.COSObject;import de.intarsys.pdf.font.PDFont;import de.intarsys.pdf.font.PDFontType1;import de.intarsys.pdf.font.outlet.FontFactoryException;import de.intarsys.pdf.parser.COSLoadException;import de.intarsys.pdf.pd.PDDocument;import de.intarsys.pdf.pd.PDExtGState;import de.intarsys.pdf.pd.PDForm;import de.intarsys.pdf.pd.PDPage;import de.intarsys.pdf.pd.PDPageNode;import de.intarsys.pdf.pd.PDPageTree;import de.intarsys.pdf.pd.PDXObject;import de.intarsys.pdf.st.EnumWriteMode;import de.intarsys.tools.locator.FileLocator;public class SelfWaterMarkingJpod { /** * @param args * @throws IOException * @throws FontFactoryException * @throws COSLoadException */ public static void main(String[] args) throws IOException, FontFactoryException, COSLoadException { StopWatch runTestTime; int pages = 1000000; runTestTime = runTest(pages,100,1000,5000,5000, -1); System.out.println("Total time: " +runTestTime.toSplitString()+ " "+(pages*1.0d/runTestTime.getTime())*1000+" p/s"); } private static StopWatch runTest(int i, int j, int k, int l, int m, int n) throws FontFactoryException, IOException, COSLoadException { StopWatch stopWatch = new StopWatch(); stopWatch.start(); new SelfWaterMarkingJpod().run(i,j,k,l,m,n); stopWatch.split(); stopWatch.stop(); return stopWatch; } private static final float halfSqrt2 = (float) (0.5 * Math.sqrt(2)); private int i; private static PDForm createForm() { PDForm form = (PDForm) PDForm.META.createNew(); PDFont font = PDFontType1.createNew(PDFontType1.FONT_Helvetica); PDExtGState extGState = (PDExtGState) PDExtGState.META.createNew(); extGState.setStrokingAlphaConstant(0.6f); extGState.setNonStrokingAlphaConstant(0.2f); CSCreator creator = CSCreator.createNew(form); creator.textBegin(); creator.setExtendedState(null, extGState); creator.setNonStrokeColorRGB(1.0f, 204f / 256f, 0); // orange creator.setStrokeColorRGB(1.0f, 204f / 256f, 0); creator.textSetFont(null, font, 80); creator.setLineWidth(2.0f); creator.textSetTransform(halfSqrt2, halfSqrt2, -halfSqrt2, halfSqrt2, 80, 0); creator.textSetRenderingMode(TextState.RENDERING_MODE_FILL_STROKE); creator.textShow("COPIA CONFORME"); creator.textEnd(); creator.close(); form.setBoundingBox(new CDSRectangle(0, 0, 600, 600)); return form; } private void run(int iterations, int nodeEvery, int saveEvery, int sampleEvery, int resetEvery, int stopAt) throws FontFactoryException, IOException, COSLoadException { StopWatch stopWatch = new StopWatch(); stopWatch.start(); String path = "output_"+new Date().getTime()+".pdf"; File file = new File(path); if(file.exists()) { FileUtils.forceDelete(file); } FileUtils.copyFile(new File("adobe_supplement_iso32000.pdf"),file); FileLocator locator = new FileLocator(path); PDDocument fromDocument = PDDocument.createFromLocator(locator); try { PDPageTree pageTree = fromDocument.getPageTree(); fromDocument.setWriteModeHint(EnumWriteMode.INCREMENTAL); PDForm form = createForm(); //singleDeepPage(pageTree, form); navigateCosTree(pageTree, form, fromDocument); } catch (Exception e) { e.printStackTrace(); FileUtils.forceDelete(file); } finally { fromDocument.close(); fromDocument = null; } } private void singleDeepPage(PDPageTree pageTree, PDForm form) throws IOException { i = 0; COSArray cosKidsL1 = pageTree.cosGetField(PDPageTree.DK_Kids).asArray(); Iterator iterratorL1 = cosKidsL1.iterator(); PDPageNode nodeL1 = (PDPageNode) PDPageNode.META.createFromCos((COSObject) iterratorL1.next()); COSArray cosKidsL2 = nodeL1.cosGetField(PDPageTree.DK_Kids).asArray(); Iterator iterratorL2 = cosKidsL2.iterator(); PDPageNode nodeL2 = (PDPageNode) PDPageNode.META.createFromCos((COSObject) iterratorL2.next()); waterMarkThePage(nodeL2, form); } private void navigateCosTree(PDPageNode node, PDForm form,PDDocument fromDocument) { COSArray cosKids = getKidsIterator(node); if(cosKids==null) { return; } Iterator iterrator = cosKids.iterator(); while (iterrator.hasNext()) { PDPageNode origPageNode = (PDPageNode) PDPageNode.META .createFromCos((COSObject) iterrator.next()); PDPage page = origPageNode.getFirstPage(); navigateCosTree(origPageNode,form,fromDocument); try { if(true){ waterMarkThePage(page, form); fromDocument.save(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } i++; } //return node; } private COSArray getKidsIterator(PDPageNode pageNode) { return pageNode.cosGetField(PDPageTree.DK_Kids).asArray(); } private void waterMarkThePage(PDPageNode origPageNode, PDForm form) throws IOException { // TODO Auto-generated method stub PDPage page = origPageNode.getFirstPage(); CSContent content = CSContent.createNew(); CSCreator creator = CSCreator.createFromContent(content, page); CDSRectangle rect = page.getCropBox(); float formWidth = form.getBoundingBox().getWidth(); float scale = 1f; float offsetY = (rect.getHeight() - (formWidth * scale)) / 2; float offsetX = (rect.getWidth() - (formWidth * scale)) / 2; creator.saveState(); creator.transform(scale, 0, 0, scale, offsetX, offsetY); creator.doXObject(null, form); creator.restoreState(); creator.close(); page.cosAddContents(content.createStream()); }}