Am 20.08.2017 um 10:25 schrieb chitgoks:
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?
Yes. First save the graphics state, then modify it, do your stuff, then
restore the graphics state.
Btw please concentrate on one single solution. Post the code for that
and upload the PDF and explain what went wrong. Currently you've posted
code for one solution and we are discussing another.
Tilman
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
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]