【问题标题】:Watermark a pdf document with itext 7 instead of iTextSharp使用 itext 7 代替 iTextSharp 为 pdf 文档添加水印
【发布时间】:2018-07-12 21:37:56
【问题描述】:

这是我的 itextsharp 代码,运行良好。它在 pdf 文件的每页中间显示“仅引用”。

 iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(Server.MapPath(@"~\Content\WaterMarkQuoteOnly.png"));

                PdfReader readerOriginalDoc = new PdfReader(File(all, "application/pdf").FileContents);
                int n = readerOriginalDoc.NumberOfPages;
                img.SetAbsolutePosition(0, 300);
                PdfGState _state = new PdfGState()
                {
                    FillOpacity = 0.1F,
                    StrokeOpacity = 0.1F
                };
                using (MemoryStream ms = new MemoryStream())
                {
                    using (PdfStamper stamper = new PdfStamper(readerOriginalDoc, ms, '\0', true))
                    {
                        for (int i = 1; i <= n; i++)
                        {
                            PdfContentByte content = stamper.GetOverContent(i);
                            content.SaveState();
                            content.SetGState(_state);
                            content.AddImage(img);
                            content.RestoreState();
                        }
                    }
                    //return ms.ToArray();
                    all = ms.GetBuffer();
                }

这是我的新itext 7代码,这也显示了水印但是位置不对。看到您无法将图像添加到画布,但您必须在图像上设置位置时添加 ImageData,我感到很沮丧。图像也小得多,而且从后到前。

var imagePath = Server.MapPath(@"~\Content\WaterMarkQuoteOnly.png");

                var tranState = new iText.Kernel.Pdf.Extgstate.PdfExtGState();
                tranState.SetFillOpacity(0.1f);
                tranState.SetStrokeOpacity(0.1f);

                ImageData myImageData = ImageDataFactory.Create(imagePath, false);
                Image img = new Image(myImageData);
                img.SetFixedPosition(0, 300);                                            

                var reader = new PdfReader(new MemoryStream(all));
                var doc = new PdfDocument(reader);
                int pages = doc.GetNumberOfPages();

                using (var ms = new MemoryStream())
                {
                    var writer = new PdfWriter(ms);
                    var newdoc = new PdfDocument(writer);

                    for (int i = 1; i <= pages; i++)
                    {
                        //get existing page
                        PdfPage page = doc.GetPage(i);
                        //copy page to new document
                        newdoc.AddPage(page.CopyTo(newdoc)); ;
                        //get our new page
                        PdfPage newpage = newdoc.GetPage(i);
                        Rectangle pageSize = newpage.GetPageSize();
                        //get canvas based on new page
                        var canvas = new PdfCanvas(newpage);
                        //write image data to new page
                        canvas.SaveState().SetExtGState(tranState);
                        canvas.AddImage(myImageData, pageSize, true);
                        canvas.RestoreState();
                    }
                    newdoc.Close();
                    all = ms.GetBuffer();
                    ms.Flush();
                }

【问题讨论】:

    标签: c# .net pdf itext


    【解决方案1】:

    您对PdfDocument 对象做了一些奇怪的事情,而且您还使用了错误的AddImage() 方法。

    我不是 C# 开发人员,所以我用 Java 重写了您的示例。我拿了这个 PDF 文件:

    我拍了这张照片:

    然后我使用透明度将图像添加到 PDF 文件中,结果如下:

    执行此操作的代码非常简单:

    public void createPdf(String src, String dest) throws IOException {
        PdfExtGState tranState = new PdfExtGState();
        tranState.setFillOpacity(0.1f);
        ImageData img = ImageDataFactory.create(IMG);
    
        PdfReader reader = new PdfReader(src);
        PdfWriter writer = new PdfWriter(dest);
        PdfDocument pdf = new PdfDocument(reader, writer);
        for (int i = 1; i <= pdf.getNumberOfPages(); i++) {
            PdfPage page = pdf.getPage(i);
            PdfCanvas canvas = new PdfCanvas(page);
            canvas.saveState().setExtGState(tranState);
            canvas.addImage(img, 36, 600, false);
            canvas.restoreState();
        }
        pdf.close();
    }
    

    由于某种原因,您创建了两个 PdfDocument 实例。这是没有必要的。您还使用了 AddImage() 方法传递了一个 Rectangle 来调整图像大小。还要确保不要将图像添加为内联图像,因为这会增加文件大小。

    我不知道您使用的是哪种编程语言。例如:我不习惯使用var 创建的变量,例如var tranState。不过,您应该很容易适应我的 Java 代码。只是把小写变成大写而已。

    【讨论】:

    • 谢谢。我不想更改 562 X 432 像素的图像大小,我只想将其显示在中心。好吧,图片上写着“仅引用”,但它是颠倒的,这就是我的意思。
    • 不管我说canvas.AddImage(myImageData, 0,0, false);或 canvas.AddImage(myImageData, 600,500, false);它总是在左上角显示得很小??
    • 布鲁诺,这段代码在 v5 img.SetAbsolutePosition(0, 300);没有实现与此 canvas.AddImage(myImageData, 0, 300, false); 相同的东西你能告诉我如何实现同样的目标吗?谢谢。
    • 这很奇怪。我会尝试重现它。您使用的是哪个版本的 iText 7?通常,图像的大小不应该改变(我查看了源代码),并且您传递的两个值是 x 和 y 坐标。
    • 我使用的是 7.0.1.0 社区版。谢谢。
    猜你喜欢
    • 2017-12-03
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多