java - 如何给pdf添加水印(itext7.1.2 java)

标签 java itext7

这是我遵循一个示例的代码。

我对代码做了一些修改。

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)

发生了什么?什么是单位值(value)?怎么改呢?

这是主要代码:

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

这意味着您使用的框架假设某个值应该属于UnitValue类,但结果是一个Integer .

这里有点猜测:你有类似的代码

canvas.setProperty(Property.FONT_SIZE, 60);

上面的代码最终会将一个Integer对象放入一些“属性映射”中。最有可能的是,您没有正确使用该 API。

含义:答案归结为您研究您正在使用的产品的 API 文档。您必须了解如何正确设置这些属性参数。

查看javadoc对于 UnitValue,看起来这个类用于以某种方式表示位置。因此,我将首先查看处理“定位”的属性。

关于java - 如何给pdf添加水印(itext7.1.2 java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51931854/

相关文章:

java - 检查字符串数组中的元音

java - 带有java的Firebase admin sdk无法连接

java - 代码中的私有(private)方法位置 (Java)

java - 如何从 JNA 调用 ALSA 分配#define?

java - 我尝试使用 itext7 与 eclipse 生成 pdf 文件。但是当我在其上添加页面时,它将输出错误“java.lang.NullPointerException”

java - 如何在iText7中为单个页面设置页面标签?

java - 在Google App Engine java中使用ajax获取Json数据

java - Html2Pdf 转换器禁用文本选择

java - iText7 setRotation() 无法正常工作

java - 将表添加到 itext 7 pdf 时出现 IndexOutOfBoundsException