hi tilman i dont understand though. the reason why i save the graphic state is so that i could rotate the watermark text to vertical and restore it so the page's original contents will not be rotated.
or i did it the wrong way? please advise thank you On Sun, Aug 20, 2017 at 4:20 PM, Tilman Hausherr <[email protected]> wrote: > You first call "cs.setGraphicsStateParameters(gs)" and then save the > graphics state. So the setting will be kept even after you've called > "cs.restoreGraphicsState();". > > Tilman > > Am 20.08.2017 um 09:33 schrieb chitgoks: > >> hi tilman >> >> yes. the watermark is appended to an existing pdf. and my 5th parameter is >> true >> >> i just want it not to be selectable. prepend would have worked. but for an >> existing page, what happens is that since i made the watermark text >> transparent, the page's text also gets transparent. >> >> this is my code. watermarks is an arraylist of string. max of 3. >> >> PDFont font = PDType1Font.HELVETICA; >> float fontSize = 80f; >> PDPageTree pages = pdfDocument.getPages(); >> >> PDExtendedGraphicsState gs = new PDExtendedGraphicsState(); >> gs.setNonStrokingAlphaConstant(0.3f); >> PDPage page = pages.get(0); >> >> try (PDPageContentStream cs = new PDPageContentStream(pdfDocument, page, >> AppendMode.APPEND, true, true)) { >> cs.setFont(font, fontSize); >> cs.setNonStrokingColor(Color.GRAY); >> cs.setGraphicsStateParameters(gs); >> for (int w=0; w<watermark.size(); w++) { >> float stringWidth = font.getStringWidth(watermark.get(w)) / 1000 * >> fontSize; >> float fontHeight = 15; >> cs.saveGraphicsState(); >> cs.beginText(); >> if (watermark.size() == 1) >> cs.transform(Matrix.getRotateInstance(Math.toRadians(270), >> (page.getCropBox().getWidth() - (fontHeight / 2)) / 2, >> (page.getCropBox().getHeight() + stringWidth) / 2)); >> else if (watermark.size() == 2) { >> cs.transform(Matrix.getRotateInstance(Math.toRadians(270), >> (page.getCropBox().getWidth() / 2) - (w == 0 ? -(fontHeight / 2) : >> fontHeight), >> (page.getCropBox().getHeight() + stringWidth) / 2)); >> } >> else { >> float fontHeightValueToUse = fontHeight / 2; >> if (w == 0) >> fontHeightValueToUse = -(fontHeight * 2); >> else if (w == 2) >> fontHeightValueToUse = fontHeight * 3; >> >> cs.transform(Matrix.getRotateInstance(Math.toRadians(270), >> (page.getCropBox().getWidth() - fontHeightValueToUse) / 2, >> (page.getCropBox().getHeight() + stringWidth) / 2)); >> } >> cs.showText(watermark.get(w)); >> cs.endText(); >> cs.restoreGraphicsState(); >> } >> } catch (Exception e) { >> >> } >> >> Website/Java Games: http://www.chitgoks.com >> My Blogs: >> http://tech.chitgoks.com >> http://wuhtevah.chitgoks.com >> http://disneyusa.blogspot.com >> >> On Sun, Aug 20, 2017 at 2:56 PM, Tilman Hausherr <[email protected]> >> wrote: >> >> Am 20.08.2017 um 08:38 schrieb chitgoks: >>> >>> Hi gilad. thank you for replying >>>> >>>> there should still be some way to do this right? if not the content >>>> stream >>>> then i guess the only other way is via overlays >>>> >>>> Are you aware that you can always add a content stream to an existing >>> page? Either prepend or append. When appending, use the constructor with >>> 5 >>> parameters and set the last to true. For a watermark, prepend is probably >>> better. >>> >>> Tilman >>> >>

