C# PDF文件中的水印隐藏在图像后面

C# PDF文件中的水印隐藏在图像后面,c#,pdf,itextsharp,C#,Pdf,Itextsharp,我想使用以下方法将水印添加到现有PDF: 第三个答案有效,但如果PDF包含图像,则水印隐藏在其后面。有关此类问题,请咨询。这本书包含了以前在StackOverflow上发布和回答的数百个问题,包括一些来自我们的封闭问题追踪者的答案。这是一个以前没有在StackOverflow上发布的答案: 如果PDF中有不透明形状(例如图像,但也有彩色形状),则需要在现有内容的顶部添加水印: PdfContentByte canvas = pdfStamper.getOverContent(i); publ

我想使用以下方法将水印添加到现有PDF:


第三个答案有效,但如果PDF包含图像,则水印隐藏在其后面。

有关此类问题,请咨询。这本书包含了以前在StackOverflow上发布和回答的数百个问题,包括一些来自我们的封闭问题追踪者的答案。这是一个以前没有在StackOverflow上发布的答案:

如果PDF中有不透明形状(例如图像,但也有彩色形状),则需要在现有内容的顶部添加水印:

PdfContentByte canvas = pdfStamper.getOverContent(i);
public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    int n = reader.getNumberOfPages();
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    PdfContentByte under = stamper.getUnderContent(1);
    Font f = new Font(FontFamily.HELVETICA, 15);
    Phrase p = new Phrase(
        "This watermark is added UNDER the existing content", f);
    ColumnText.showTextAligned(under, Element.ALIGN_CENTER, p, 297, 550, 0);
    PdfContentByte over = stamper.getOverContent(1);
    p = new Phrase("This watermark is added ON TOP OF the existing content", f);
    ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 297, 500, 0);
    p = new Phrase(
        "This TRANSPARENT watermark is added ON TOP OF the existing content", f);
    over.saveState();
    PdfGState gs1 = new PdfGState();
    gs1.setFillOpacity(0.5f);
    over.setGState(gs1);
    ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 297, 450, 0);
    over.restoreState();
    stamper.close();
    reader.close();
}
现在文本将覆盖图像,但它可能隐藏一些重要信息。如果你想避免这种情况,你需要引入透明度

我已经写了一个简单的例子来说明如何做到这一点。它被称为 让我们看看结果:

首先,我在现有内容下添加文本“此水印添加在现有内容下”。 部分文本被隐藏(正如您在问题中所指出的)。 然后我在现有内容的顶部添加文本“此水印添加在现有内容的顶部”。这可能就足够了,除非您担心覆盖现有内容会丢失一些重要信息。 在这种情况下,请看我如何添加文本“此透明水印添加在现有内容之上”:

一些额外的提示和技巧:

  • 更改图形状态时,请始终使用
    saveState()
    restoreState()
    。如果您不这样做,您可能会得到不希望的效果,例如受您所做更改影响的其他内容(例如,您不希望所有内容都变得透明)
  • 文本的默认渲染模式是“填充”,因此我更改了填充不透明度
  • 在本例中,我定义了50%(0.5f)的填充不透明度。如果要更改文本的透明度,请选择介于0.0f和1.0f之间的任意值

    • 有关此类问题,请咨询。这本书包含了以前在StackOverflow上发布和回答的数百个问题,包括一些来自我们的封闭问题追踪者的答案。这是一个以前没有在StackOverflow上发布的答案:

      如果PDF中有不透明形状(例如图像,但也有彩色形状),则需要在现有内容的顶部添加水印:

      PdfContentByte canvas = pdfStamper.getOverContent(i);
      
      public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
          PdfReader reader = new PdfReader(src);
          int n = reader.getNumberOfPages();
          PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
          PdfContentByte under = stamper.getUnderContent(1);
          Font f = new Font(FontFamily.HELVETICA, 15);
          Phrase p = new Phrase(
              "This watermark is added UNDER the existing content", f);
          ColumnText.showTextAligned(under, Element.ALIGN_CENTER, p, 297, 550, 0);
          PdfContentByte over = stamper.getOverContent(1);
          p = new Phrase("This watermark is added ON TOP OF the existing content", f);
          ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 297, 500, 0);
          p = new Phrase(
              "This TRANSPARENT watermark is added ON TOP OF the existing content", f);
          over.saveState();
          PdfGState gs1 = new PdfGState();
          gs1.setFillOpacity(0.5f);
          over.setGState(gs1);
          ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 297, 450, 0);
          over.restoreState();
          stamper.close();
          reader.close();
      }
      
      现在文本将覆盖图像,但它可能隐藏一些重要信息。如果你想避免这种情况,你需要引入透明度

      我已经写了一个简单的例子来说明如何做到这一点。它被称为 让我们看看结果:

      首先,我在现有内容下添加文本“此水印添加在现有内容下”。 部分文本被隐藏(正如您在问题中所指出的)。 然后我在现有内容的顶部添加文本“此水印添加在现有内容的顶部”。这可能就足够了,除非您担心覆盖现有内容会丢失一些重要信息。 在这种情况下,请看我如何添加文本“此透明水印添加在现有内容之上”:

      一些额外的提示和技巧:

      • 更改图形状态时,请始终使用
        saveState()
        restoreState()
        。如果您不这样做,您可能会得到不希望的效果,例如受您所做更改影响的其他内容(例如,您不希望所有内容都变得透明)
      • 文本的默认渲染模式是“填充”,因此我更改了填充不透明度
      • 在本例中,我定义了50%(0.5f)的填充不透明度。如果要更改文本的透明度,请选择介于0.0f和1.0f之间的任意值

      为什么否决这个问题?这是一个真正的问题。当然,没有代码示例,但是代码示例在另一个问题中。为什么要否决这个问题?这是一个真正的问题。诚然,没有代码示例,但代码示例在另一个问题中。很酷,它可以工作。谢谢,我还有另一个问题。这是否可能只是将文本框放在pdf的任何位置并保存,然后新的pdf将使用相同位置的文本创建?如果您有新问题,请发布新问题。确保你的问题清楚。您的意思是问:是否可以将占位符添加到PDF中,以便我们可以将此PDF用作模板,并使用占位符的位置添加文本?如果是这样,您的问题将是重复的,答案可以在中找到。在询问StackOverflow问题时,您应该已经阅读了文档(您可能因为违反该规则而获得2张反对票).所以我需要在这里做什么冷却它的工作..谢谢,我还有一个问题,这是不是可以把一个文本框放在pdf的任何地方,然后保存,然后新的pdf将创建在相同位置的文本?如果你有一个新问题,请发布一个新问题。确保你的问题清楚。您的意思是问:是否可以将占位符添加到PDF中,以便我们可以将此PDF用作模板,并使用占位符的位置添加文本?如果是这样,您的问题将是重复的,答案可以在中找到。在询问StackOverflow的问题时,您应该已经阅读了文档(您可能因为违反该规则而获得了2张反对票)。所以我需要在这里做什么