【问题标题】:Watermark in itextsharp is not displaying properlyitextsharp 中的水印无法正确显示
【发布时间】:2014-06-27 05:01:01
【问题描述】:

我正在使用 iTextSharp 将数据填充到在 OpenOffice 中创建的 PDF 模板。它填充得很好,我得到了正确的 PDF,Watermark 没有正确显示。

下面是我的代码:

public void addWaterMark(PdfStamper stamper, int pageNumber, Watermark watermark)
    {
        List<WatermarkField> watermarkFields = watermark.getWatermarkFieldAsReference();
        for (WatermarkField watermarkField : watermarkFields) {
            // setting font and font size for the watermark text
            Font FONT = new Font(FontFamily.HELVETICA, watermarkField.getFontSize(), Font.BOLD, new GrayColor(0.75f));
            // setting alignment for the watermark
            ColumnText.showTextAligned(stamper.getUnderContent(pageNumber), Element.ALIGN_CENTER, new Phrase(watermarkField.getText(), FONT), watermarkField.getXDirection(), watermarkField.getYDirection(), watermarkField.getRotation());
        }

    } 

当我放入背景文本框时,会隐藏水印。
当我放入前景水印时隐藏了文本。
两条屏幕短裤都附在下面。

请给我建议解决方案。 谢谢。

【问题讨论】:

  • 你期待什么?显然,前景中的某些东西被覆盖,而背景中的某些东西被覆盖。话虽如此,您可以通过使用大纲书写或透明度来减少前景中的书写量。
  • This answer 在其他内容中包含使用仅大纲的过度内容标记的代码。它使用 iText/Java,但应该很容易翻译成 iTextSharp/C#。
  • mkl 是正确的 getUnderContent() 是罪魁祸首。如果您不希望现有内容覆盖水印,则需要 getOverContent()。当然:如果您不想用水印覆盖现有内容,则需要使其透明,如 mkl 对stackoverflow.com/questions/20351916/…的回答中所述@
  • @mkl 我的问题是当我使用getOverContent() 时,标签文本被覆盖(在模板中)。 Strock 没问题,但客户不接受。
  • 客户不接受 - 那么他会接受什么?透明度?

标签: java pdf itextsharp itext


【解决方案1】:

this answer 中已经有一些关于如何添加水印的想法(在下方内容中,在上方内容中,在下方内容中和位图之前的上方内容中。,,,)。

缺失的用例,over content 中的透明标记,可以这样生成:

void addSimpleTransparentPatternToOverContent(File source, File target) throws IOException, DocumentException
{
    PdfReader reader = new PdfReader(source.getPath());
    OutputStream os = new FileOutputStream(target);
    PdfStamper stamper = new PdfStamper(reader, os);

    PdfPatternPainter painter = stamper.getOverContent(1).createPattern(200, 150);
    painter.setColorFill(BaseColor.GREEN);
    painter.beginText();
    painter.setTextMatrix(AffineTransform.getTranslateInstance(0, 50));
    painter.setFontAndSize(BaseFont.createFont(), 100);
    painter.showText("Test");
    painter.endText();

    PdfGState state = new PdfGState();
    state.setFillOpacity(0.5f);

    for (int i = reader.getNumberOfPages(); i > 0; i--)
    {
        PdfContentByte overContent = stamper.getOverContent(i);

        overContent.setGState(state);
        overContent.setColorFill(new PatternColor(painter));
        overContent.rectangle(200, 300, 200, 150);
        overContent.fill();
    }

    stamper.close();
    os.close();
}

本着其他答案的精神,该标记是使用一种模式生成的,以防止水印出现在复制和粘贴输出中。

您可以通过在state.setFillOpacity(0.5f) 中选择不同的值来更改透明度/不透明度。

【讨论】:

    【解决方案2】:

    这是实际的代码。

    public void addWaterMark(PdfStamper stamper, int pageNumber, Watermark watermark){
        List<WatermarkField> watermarkFields = watermark.getWatermarkFieldAsReference();
        PdfReader reader = stamper.getReader();
        Rectangle pageSize = reader.getPageSize(1);
        BaseFont font = BaseFont.createFont(BaseFont.HELVETICA_BOLD, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);
    
        PdfPatternPainter painter = stamper.getOverContent(1).createPattern(pageSize.getWidth(), pageSize.getHeight());
        painter.setColorStroke(new BaseColor(192, 192, 192));
        painter.setLineDash(0.4f, 0.4f, 0.2f);
        painter.beginText();
        painter.setTextMatrix(AffineTransform.getTranslateInstance(0, 50));
        for (WatermarkField watermarkField : watermarkFields) {
            painter.setFontAndSize(font, watermarkField.getFontSize());
            painter.showTextAlignedKerned(Element.ALIGN_MIDDLE, watermarkField.getText(), watermarkField.getXDirection(), watermarkField.getYDirection(),
            watermarkField.getRotation());
        }
        painter.endText();
        PdfGState state = new PdfGState();
        state.setFillOpacity(0.2f);
        PdfContentByte overContent = stamper.getOverContent(pageNumber);
        overContent.setGState(state);
        overContent.setColorFill(new PatternColor(painter));
        overContent.rectangle(pageSize.getLeft(), pageSize.getBottom(), pageSize.getWidth(), pageSize.getHeight());
        overContent.fill();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 2020-09-25
      • 2017-12-01
      • 1970-01-01
      • 2013-04-23
      • 2012-05-06
      • 2012-11-11
      相关资源
      最近更新 更多