如何使用iTextSharp制作图像不可编辑?

时间:2017-05-26 13:07:12

标签: pdf itext watermark pdfstamper pdf-annotations

我的目标是在 3D PDF上标记图像,其行为类似于水印(最终用户无法选择,编辑,调整大小或删除图像)。< / p>

我尝试制作如下所示的注释,但是输出PDF上的图像(&#34; ClassificationBlock.png&#34;参考资料中)可以调整大小并删除。这是&#34; PdfAnnotation&#34;的固有行为。矩形或是否有我可以定义的属性,以保持图像基本上只读?

using (PdfStamper stamp = new PdfStamper(reader, fs))

。 。

                Rectangle stampRect2 = null;

                System.Drawing.Image imageBTM2 = System.Drawing.Image.FromHbitmap(Properties.Resources.ClassificationBlock.GetHbitmap());
                Image stampImage2 = iTextSharp.text.Image.GetInstance(imageBTM2, System.Drawing.Imaging.ImageFormat.Png);

                Rectangle location2 = new Rectangle(0, 0, stampImage2.Width, stampImage2.Height);
                PdfAnnotation pdfStamp2 = PdfAnnotation.CreateStamp(stamp.Writer, location2, null, "ImageText");
                stampImage2.SetAbsolutePosition(0, 0);
                PdfAppearance app2 = stamp.GetOverContent(1).CreateAppearance(stampImage2.Width, stampImage2.Height);
                app2.AddImage(stampImage2);
                pdfStamp2.SetAppearance(PdfName.N, app2);
                pdfStamp2.SetPage();
                stamp.AddAnnotation(pdfStamp2, 1);
                stampRect2 = location2;

                stamp.FormFlattening = true;

                stamp.Close();
                reader.Close();
                fs.Close();

我也通过模仿其他用户通过pdfContentBytes尝试水印文本来尝试它,但我无法将图像显示在PDF上。

                    stamp.FormFlattening = false;
                    iTextSharp.text.Rectangle pageRectangle = reader.GetPageSizeWithRotation(1);
                    PdfContentByte pdfData = stamp.GetOverContent(1);
                    pdfData.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 10);
                    PdfGState graphicsState = new PdfGState();
                    graphicsState.FillOpacity = 0.5F;
                    pdfData.SetGState(graphicsState);
                    pdfData.BeginText();

                    System.Drawing.Image imageBTM2 = System.Drawing.Image.FromHbitmap(Properties.Resources.TEKLAPDF_InstructionBlock.GetHbitmap());
                    iTextSharp.text.Image stampImage2 = iTextSharp.text.Image.GetInstance(imageBTM2, System.Drawing.Imaging.ImageFormat.Png);

                    float width = pageRectangle.Width;
                    float height = pageRectangle.Height;
                    stampImage2.ScaleToFit(width, height);
                    stampImage2.SetAbsolutePosition(width / 2 - stampImage2.Width / 2, height / 2 - stampImage2.Height / 2);
                    stampImage2.SetAbsolutePosition(50, 50);
                    stampImage2.Rotation = 0;

                    pdfData.AddImage(stampImage2);

                    pdfData.EndText();

有关如何最好地完成此任务的任何想法?这让我发疯了。

EDIT ********

这些是我目前所追求的途径。关于如何&#34;水印&#34;的任何想法3D PDF?

                //Stamp Image Method (works on 2D PDF and 3D PDF BUT results in EDITABLE stamp) 

                System.Drawing.Image imageBTM2 = System.Drawing.Image.FromHbitmap(Properties.Resources.ClassificationBlock.GetHbitmap());
                Image stampImage2 = iTextSharp.text.Image.GetInstance(imageBTM2, System.Drawing.Imaging.ImageFormat.Png);

                Rectangle stampRect2 = null;
                Rectangle location2 = new Rectangle(0, 0, stampImage2.Width, stampImage2.Height);
                PdfAnnotation pdfStamp2 = PdfAnnotation.CreateStamp(stamp.Writer, location2, null, "ImageText");
                stampImage2.SetAbsolutePosition(0, 0);
                PdfAppearance app2 = stamp.GetUnderContent(1).CreateAppearance(stampImage2.Width, stampImage2.Height);
                app2.AddImage(stampImage2);
                pdfStamp2.SetAppearance(PdfName.N, app2);
                pdfStamp2.SetPage();
                stamp.AddAnnotation(pdfStamp2, 1);
                stampRect2 = location2;


                //Watermark Layering Method (works only on 2D PDF)
                var layers = stamp.GetPdfLayers();

                var imgLayer = new PdfLayer("StackoverflowImage", stamp.Writer);
                PdfContentByte cb = stamp.GetUnderContent(1);
                cb.BeginLayer(imgLayer);

                stampImage2.ScalePercent(100f);
                stampImage2.SetAbsolutePosition(pageWidth/2, pageHeight/2);
                cb.AddImage(stampImage2);

                cb.EndLayer();


                //Jan's Watermark method (works only on 2D PDF)

                PdfContentByte over = stamp.GetOverContent(1);
                stampImage2.SetAbsolutePosition(pageWidth / 2, pageHeight / 2);
                PdfLayer imgLayer = new PdfLayer("StackoverflowImage", stamp.Writer);
                imgLayer.OnPanel = false;
                over.BeginLayer(imgLayer);
                over.AddImage(stampImage2);
                over.EndLayer();


                stamp.Close();
                reader.Close();

2 个答案:

答案 0 :(得分:0)

首先关闭:您很可能无法阻止选择图像。

第二:我在Java中使用itext,所以你可能最终会将方法名称的第一个字符大写... ...

对于其余部分或您的问题,您可以尝试将此图片添加到图层:

    PdfContentByte over = stamp.getOverContent(1)
    Image img = ...//code to get your image;
    img.setAbsolutePosition(x, y); //at your postion
    PdfLayer imgLayer = new PdfLayer("StackoverflowImage", stamper.getWriter());
    imgLayer.setOnPanel(false);
    over.beginLayer(imgLayer);
    over.addImage(img);
    over.endLayer();

答案 1 :(得分:0)

解决了!使用如上所述的“Stamp Image Method”,我只需要更改标记本身的属性(将FLAGS更改为LOCKED和READ-ONLY)。这会导致标记位于3D PDF图层上方且无法调整大小,编辑或删除。所以代码现在是:

                //Stamp Image Method 

                System.Drawing.Image imageBTM2 = System.Drawing.Image.FromHbitmap(Properties.Resources.ClassificationBlock.GetHbitmap());
                Image stampImage2 = iTextSharp.text.Image.GetInstance(imageBTM2, System.Drawing.Imaging.ImageFormat.Png);

                Rectangle stampRect2 = null;
                Rectangle location2 = new Rectangle(0, 0, stampImage2.Width, stampImage2.Height);
                PdfAnnotation pdfStamp2 = PdfAnnotation.CreateStamp(stamp.Writer, location2, null, "ImageText");

                pdfStamp2.Flags = iTextSharp.text.pdf.PdfAnnotation.FLAGS_LOCKED;
                pdfStamp2.Flags = iTextSharp.text.pdf.PdfAnnotation.FLAGS_READONLY;

                stampImage2.SetAbsolutePosition(0, 0);
                PdfAppearance app2 = stamp.GetUnderContent(1).CreateAppearance(stampImage2.Width, stampImage2.Height);
                app2.AddImage(stampImage2);
                pdfStamp2.SetAppearance(PdfName.N, app2);
                pdfStamp2.SetPage();
                stamp.AddAnnotation(pdfStamp2, 1);
                stampRect2 = location2;