如何给pdf加水印(itext7.1.2 java)
how to add watermark to pdf(itext7.1.2 java)
这是我跟着一个样本的代码。
我的代码稍微修改了一下。
public class MyEventHandler implements IEventHandler {
@Override
public void handleEvent(Event event) {
// TODO Auto-generated method stub
PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
PdfDocument pdfDoc = docEvent.getDocument();
PdfPage page = docEvent.getPage();
PdfCanvas pdfCanvas = new PdfCanvas(
page.newContentStreamBefore(), page.getResources(), pdfDoc);
DeviceRgb colorWatermark = new DeviceRgb(220,36,31);
//Add watermark
Canvas canvas = new Canvas(pdfCanvas, pdfDoc, page.getPageSize());
canvas.setProperty(Property.FONT_COLOR, colorWatermark);
canvas.setProperty(Property.FONT_SIZE, 60);
try {
canvas.setProperty(Property.FONT, PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H",true));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
canvas.showTextAligned(new Paragraph("CONFIDENTIAL"),
298, 421, pdfDoc.getPageNumber(page),
TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45);
pdfCanvas.release();
}
}
当代码转到行时:canvas.showTextAligned()
抛出异常:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.Integer cannot be cast to com.itextpdf.layout.property.UnitValue
at com.itextpdf.layout.renderer.AbstractRenderer.getPropertyAsUnitValue(AbstractRenderer.java:405)
at com.itextpdf.layout.renderer.TextRenderer.layout(TextRenderer.java:196)
at com.itextpdf.layout.renderer.LineRenderer.layout(LineRenderer.java:327)
at com.itextpdf.layout.renderer.ParagraphRenderer.layout(ParagraphRenderer.java:205)
at com.itextpdf.layout.renderer.BlockRenderer.layout(BlockRenderer.java:219)
at com.itextpdf.layout.renderer.RootRenderer.addChild(RootRenderer.java:287)
at com.itextpdf.layout.renderer.CanvasRenderer.addChild(CanvasRenderer.java:89)
at com.itextpdf.layout.RootElement.createAndAddRendererSubTree(RootElement.java:377)
at com.itextpdf.layout.RootElement.add(RootElement.java:106)
at com.itextpdf.layout.RootElement.showTextAligned(RootElement.java:364)
at com.schindler.zhangzhiwei.quote.action.MyEventHandler.handleEvent(MyEventHandler.java:56)
发生了什么事?什么是单位价值?怎么改?
这是主要代码:
try {
writer = new PdfWriter(new File(openSaveDialog()));
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
pdf = new PdfDocument(writer);
pdf.addEventHandler(PdfDocumentEvent.END_PAGE, new MyEventHandler());
这里:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.Integer cannot be cast to com.itextpdf.layout.property.UnitValue
这意味着您正在使用的框架假设某个值应该是classUnitValue
,但结果却是Integer
.
这里有点猜测:你有像
这样的代码
canvas.setProperty(Property.FONT_SIZE, 60);
上面的代码最终会将一个 Integer
对象放入某些 "property map" 中。很可能,您没有正确使用API。
含义:答案归结为您研究所用产品的 API 文档。您必须了解如何正确 设置这些属性 参数。
从查看 UnitValue 的 javadoc 来看,这个 class 似乎用于以某种方式表示位置。因此,我将从查看处理 "positioning" 的属性开始。
我已经解决了问题finally.i放弃canvas的方法。然后,我将document
参数传给了MyEventHandler
。使用下面的句子:document.add(new Paragraph("Hello World").setFixedPosition(298, 421, 100).setRotationAngle(45).setFontColor(colorWatermark).setFontSize(100));
这是我跟着一个样本的代码。
我的代码稍微修改了一下。
public class MyEventHandler implements IEventHandler {
@Override
public void handleEvent(Event event) {
// TODO Auto-generated method stub
PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
PdfDocument pdfDoc = docEvent.getDocument();
PdfPage page = docEvent.getPage();
PdfCanvas pdfCanvas = new PdfCanvas(
page.newContentStreamBefore(), page.getResources(), pdfDoc);
DeviceRgb colorWatermark = new DeviceRgb(220,36,31);
//Add watermark
Canvas canvas = new Canvas(pdfCanvas, pdfDoc, page.getPageSize());
canvas.setProperty(Property.FONT_COLOR, colorWatermark);
canvas.setProperty(Property.FONT_SIZE, 60);
try {
canvas.setProperty(Property.FONT, PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H",true));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
canvas.showTextAligned(new Paragraph("CONFIDENTIAL"),
298, 421, pdfDoc.getPageNumber(page),
TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45);
pdfCanvas.release();
}
}
当代码转到行时:canvas.showTextAligned()
抛出异常:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.Integer cannot be cast to com.itextpdf.layout.property.UnitValue
at com.itextpdf.layout.renderer.AbstractRenderer.getPropertyAsUnitValue(AbstractRenderer.java:405)
at com.itextpdf.layout.renderer.TextRenderer.layout(TextRenderer.java:196)
at com.itextpdf.layout.renderer.LineRenderer.layout(LineRenderer.java:327)
at com.itextpdf.layout.renderer.ParagraphRenderer.layout(ParagraphRenderer.java:205)
at com.itextpdf.layout.renderer.BlockRenderer.layout(BlockRenderer.java:219)
at com.itextpdf.layout.renderer.RootRenderer.addChild(RootRenderer.java:287)
at com.itextpdf.layout.renderer.CanvasRenderer.addChild(CanvasRenderer.java:89)
at com.itextpdf.layout.RootElement.createAndAddRendererSubTree(RootElement.java:377)
at com.itextpdf.layout.RootElement.add(RootElement.java:106)
at com.itextpdf.layout.RootElement.showTextAligned(RootElement.java:364)
at com.schindler.zhangzhiwei.quote.action.MyEventHandler.handleEvent(MyEventHandler.java:56)
发生了什么事?什么是单位价值?怎么改?
这是主要代码:
try {
writer = new PdfWriter(new File(openSaveDialog()));
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
pdf = new PdfDocument(writer);
pdf.addEventHandler(PdfDocumentEvent.END_PAGE, new MyEventHandler());
这里:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.Integer cannot be cast to com.itextpdf.layout.property.UnitValue
这意味着您正在使用的框架假设某个值应该是classUnitValue
,但结果却是Integer
.
这里有点猜测:你有像
这样的代码canvas.setProperty(Property.FONT_SIZE, 60);
上面的代码最终会将一个 Integer
对象放入某些 "property map" 中。很可能,您没有正确使用API。
含义:答案归结为您研究所用产品的 API 文档。您必须了解如何正确 设置这些属性 参数。
从查看 UnitValue 的 javadoc 来看,这个 class 似乎用于以某种方式表示位置。因此,我将从查看处理 "positioning" 的属性开始。
我已经解决了问题finally.i放弃canvas的方法。然后,我将document
参数传给了MyEventHandler
。使用下面的句子:document.add(new Paragraph("Hello World").setFixedPosition(298, 421, 100).setRotationAngle(45).setFontColor(colorWatermark).setFontSize(100));