你好,水印怎么这样显示,不应该是悬悬浮透明显示嘛?




isSemitrasparent 设置成false显示效果类似,没看出太大差异。用的aspose-words-21.5.0-jdk17.jar

@SalesDhorde 我已经测试了 21.5 版,看起来和预期的一样。您可以通过创建带有水印的文档并将 "Semitrasparent "设置为 false 来检查。然后打开 MS Word,手动设置该属性。

8e1c7e5e2ee77dee44d67ab5a80f43d.png (86.7 KB)

水印还是下沉状态,不应该是显示在文档上面吗?

@SalesDhorde 水印会插入文档标题,即文档主体内容的下方。这与在 MS Word 中插入水印的行为相同。要在内容前面插入水印,必须在正文中插入水印,但在这种情况下,必须在文档的每一页上都插入水印。但在这种情况下,由于水印是一个简单的形状,最终用户可以像处理文档中的普通形状一样处理它。您需要保护您的文档,并将其设置为只读以限制编辑。这对您来说是一个好的解决方案吗?

您好,不是很懂您说的,我这边就是想在文档里面插入水印,水印会浮现在文字的上浮,而不是下方而且被遮挡,能实现吗?能否提供示例代码

@SalesDhorde 您可以使用以下代码在文本顶部添加水印:

Document doc = new Document("input.docx");

// 确定文件中图形的最大 ZOrder 值。
int zOrder = 0;
for (Shape shape : (Iterable<Shape>) doc.getChildNodes(NodeType.SHAPE, true))
{
    zOrder = Math.max(zOrder, shape.getZOrder());
}
zOrder++;

// 创建水印形状。
Shape watermark = new Shape(doc, ShapeType.TEXT_PLAIN_TEXT);
watermark.setName("WaterMark");
// 设置水印文本。
watermark.getTextPath().setText("In Front Watermark");
watermark.getTextPath().setBold(true);
watermark.getTextPath().setSize(100);
watermark.getTextPath().setFontFamily("Arial");
watermark.setWidth(500);
watermark.setHeight(100);
watermark.getFill().setForeColor(Color.LIGHT_GRAY);
watermark.getFill().setTransparency(0.5);
watermark.setStrokeColor(Color.LIGHT_GRAY);
watermark.getStroke().setTransparency(0.5);
// 文字将从左下角指向右上角。
watermark.setRotation(45);
// 将水印置于页面中心。
watermark.setRelativeHorizontalPosition(RelativeHorizontalPosition.PAGE);
watermark.setRelativeVerticalPosition(RelativeVerticalPosition.PAGE);
watermark.setWrapType(WrapType.NONE);
watermark.setHorizontalAlignment(HorizontalAlignment.CENTER);
watermark.setVerticalAlignment(VerticalAlignment.CENTER);
watermark.setZOrder(zOrder);

LayoutCollector layoutCollector = new LayoutCollector(doc);
int pageToInsert = 1;
for (Paragraph para : (Iterable<Paragraph>) doc.getChildNodes(NodeType.PARAGRAPH, true))
{
    // 只处理主体部分的段落。
    if (para.getAncestor(NodeType.BODY) == null)
        continue;

    int paraPage = layoutCollector.getEndPageIndex(para);
    if (paraPage == pageToInsert)
    {
        pageToInsert++;
        para.appendChild(watermark.deepClone(true));
    }
}

doc.save("output.docx");

75bf530b112d6958b2e74e2f3075d59.png (47.1 KB)
你好,
1、上午验证的那个结果:水印可以删除,可以移动 ,能否固定不被删除呢
2、按照之前提供的api添加水印方式,水印会被表格和图表遮挡,在word手动插入表格水印不会被遮挡
这两个问题是否可以解决,如果支持请提供示例代码

@SalesDhorde

  1. 正如我在之前的文章中所说,MS Word 只在页眉/页脚添加水印,因此水印会在文本下方。如果需要在文本上方添加水印,可以使用形状,但在这种情况下,需要保护文档以防止形状被删除。

  2. 不清楚你想要什么结果。能否提供预期输出结果?

1718327852218.png (34.7 KB)

我希望输入的结果是这样的,能实现吗?添加水印之后,不可以移动,删除,悬浮在文字上方。

@SalesDhorde 您可以使用以下代码:

Document doc = new Document("input.docx");

for (Section sect : doc.getSections())
{
    Shape watermark = createWatermark(doc, sect);

    insertWatermarkIntoHeader(watermark, sect, HeaderFooterType.HEADER_PRIMARY);
    insertWatermarkIntoHeader(watermark, sect, HeaderFooterType.HEADER_FIRST);
    insertWatermarkIntoHeader(watermark, sect, HeaderFooterType.HEADER_EVEN);
}

doc.save("output.docx");


private static Shape createWatermark(Document doc, Section currentSection) throws Exception {
    PageSetup pageSetup = currentSection.getPageSetup();

    Shape watermark = new Shape(doc, ShapeType.TEXT_PLAIN_TEXT);
    watermark.setName("WaterMark");
    watermark.getTextPath().setText("In Front Watermark");
    watermark.getTextPath().setBold(true);
    watermark.getTextPath().setSize(100);
    watermark.getTextPath().setFontFamily("Arial");
    watermark.setWidth(500);
    watermark.setHeight(100);
    watermark.getFill().setForeColor(Color.LIGHT_GRAY);
    watermark.getFill().setTransparency(0.7);
    watermark.setStrokeColor(Color.LIGHT_GRAY);
    watermark.getStroke().setTransparency(0.7);
    watermark.setRotation(-45);
    watermark.setWrapType(WrapType.NONE);
    watermark.setBehindText(true);
    watermark.setRelativeHorizontalPosition(RelativeHorizontalPosition.PAGE);
    watermark.setRelativeVerticalPosition(RelativeVerticalPosition.PAGE);
    double left = pageSetup.getPageWidth() / 3 - pageSetup.getLeftMargin() - pageSetup.getRightMargin();
    watermark.setLeft(left);
    watermark.setTop(pageSetup.getPageHeight() / 2);

    return watermark;
}

private static void insertWatermarkIntoHeader(Shape watermark, Section sect, int headerType) {
    HeaderFooter header = sect.getHeadersFooters().getByHeaderFooterType(headerType);
    if (header == null) {
        header = new HeaderFooter(sect.getDocument(), headerType);
        sect.getHeadersFooters().add(header);
    }

    Paragraph watermarkPara = (Paragraph) header.getChild(NodeType.PARAGRAPH, 0, true);
    if (watermarkPara == null)
        watermarkPara = new Paragraph(sect.getDocument());

    watermarkPara.appendChild(watermark.deepClone(true));
    header.appendChild(watermarkPara.deepClone(true));
}