Free Support Forum - aspose.com

Aspose.words for java可以将文字水印置于最上层吗?


#1

想问下aspose.words for java 在给word加文字水印的时候,可以把水印加到页面最上层吗 ?现在给的样例代码都是将文字水印加到底层,如果word中有图片,图片就把文字水印给挡住。具体可以怎么操作呢


#2

关注此问题 谢谢!@chenxf


#3

@chenxf, @hzjianglf,

出现问题是因为水印形状位于页眉页脚内部,主要内容是在体内故事中(请参阅Story类)。 如果使用Microsoft Word 2019插入水印,您将观察到相同的行为。 文档页眉/页脚的所有内容始终位于文档的主要内容之后。

但是,您可以通过在每个页面中手动插入水印来解决此问题。 您可以通过将光标移动到文档每页中的第一个Run,然后将这些Runs作为水印的锚点来实现。 请参阅以下代码,例如:

Document doc = new Document("e:\\temp\\TEST.doc");

Node[] runs = doc.getChildNodes(NodeType.RUN, true).toArray();
for (int i = 0; i < runs.length; i++)
{
    Run run = (Run)runs[i];
    int length = run.getText().length();

    Run currentNode = run;
    for (int x = 1; x < length; x++)
    {
        currentNode = SplitRun(currentNode, 1);
    }
}

DocumentBuilder builder = new DocumentBuilder(doc);
PageSetup ps = builder.getPageSetup();

NodeCollection smallRuns = doc.getChildNodes(NodeType.RUN, true);
LayoutCollector collector = new LayoutCollector(doc);

int pageIndex = 1;
for (int i=0; i< smallRuns.getCount() ; i++) {
    Run run = (Run) smallRuns.get(i);
    if (collector.getStartPageIndex(run) == pageIndex) {
        Shape watermark = new Shape(doc, ShapeType.TEXT_PLAIN_TEXT);
        watermark.setRelativeHorizontalPosition(RelativeHorizontalPosition.PAGE);
        watermark.setRelativeVerticalPosition(RelativeVerticalPosition.PAGE);

        watermark.setWidth(300);
        watermark.setHeight(70);
        watermark.setHorizontalAlignment(HorizontalAlignment.CENTER);
        watermark.setVerticalAlignment(VerticalAlignment.CENTER);

        watermark.setRotation(-40);
        watermark.getFill().setColor(Color.GRAY);
        watermark.setStrokeColor(Color.GRAY);

        watermark.getTextPath().setText("watermarkText");
        watermark.getTextPath().setFontFamily("Arial");

        watermark.setName("WaterMark_" + i + "");
        watermark.setWrapType(WrapType.NONE);

        builder.moveTo(run);
        builder.insertNode(watermark);

        pageIndex++;
    }
}

doc.save("e:\\Temp\\awjava-19.5.docx");

private static Run SplitRun(Run run, int position) throws Exception {
    Run afterRun = (Run) run.deepClone(true);
    afterRun.setText(run.getText().substring(position));
    run.setText(run.getText().substring(0, position));
    run.getParentNode().insertAfter(afterRun, run);
    return afterRun;
}

#4

@awais.hafeez 谢谢,太好了!