Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在iTextSharp中为带有水印的文档加下划线_C#_Pdf_Itext_Pspdfkit - Fatal编程技术网

C# 在iTextSharp中为带有水印的文档加下划线

C# 在iTextSharp中为带有水印的文档加下划线,c#,pdf,itext,pspdfkit,C#,Pdf,Itext,Pspdfkit,我有一个添加了水印的pdf文档。结果是好的,但如果我尝试在结果pdf中加下划线,水印会显示为文本文档的一部分,因此加下划线的结果是错误的。 这里是我用来应用水印的代码: using (System.IO.MemoryStream memWatermark = new MemoryStream(pdfWatermark)) using (System.IO.MemoryStream memIn = new MemoryStream(pdfin)) using (System.IO.MemorySt

我有一个添加了水印的pdf文档。结果是好的,但如果我尝试在结果pdf中加下划线,水印会显示为文本文档的一部分,因此加下划线的结果是错误的。
这里是我用来应用水印的代码:

using (System.IO.MemoryStream memWatermark = new MemoryStream(pdfWatermark))
using (System.IO.MemoryStream memIn = new MemoryStream(pdfin))
using (System.IO.MemoryStream memOut = new MemoryStream())
{
    memWatermark.Position = 0;
    memIn.Position = 0;
    memOut.Position = 0;
    PdfReader reader = new PdfReader(memIn);
    PdfReader wmReader = new PdfReader(memWatermark);

    int j = wmReader.NumberOfPages;
    if (wmReader.NumberOfPages > 0) 
    {       
        Rectangle wmSize = wmReader.GetPageSize(1);
        int wmRotation = wmReader.GetPageRotation(1);

        using (Document doc = new Document(wmSize))
        {
            PdfWriter writer = PdfWriter.GetInstance(doc, memOut);
            doc.Open();

            PdfImportedPage waterMarkPage = writer.GetImportedPage(wmReader, 1);
            PdfImportedPage currentPage;
            for (int i = 1; i <= reader.NumberOfPages; i++)
            {
                currentPage = writer.GetImportedPage(reader, i);

                //Add the first file to coordinates 0,0
                if (wmRotation == 90 || wmRotation == 270)
                {
                    writer.DirectContent.AddTemplate(currentPage, 0, -1f, 1f, 0, 0, wmReader.GetPageSizeWithRotation(i).Height);
                }
                else
                {
                    writer.DirectContent.AddTemplate(currentPage, 1f, 0, 0, 1f, 0, 0);
                }

                // set transparency for watermark
                var gstate = new PdfGState { FillOpacity = 0.2f, StrokeOpacity = 0.4f };
                writer.DirectContent.SaveState();
                writer.DirectContent.SetGState(gstate);

                //Since we don't call NewPage the next call will operate on the same page
                if (wmRotation == 90 || wmRotation == 270)
                {
                    writer.DirectContent.AddTemplate(waterMarkPage, 0, -1f, 1f, 0, 0, wmReader.GetPageSizeWithRotation(1).Height);
                }
                else
                {
                    writer.DirectContent.AddTemplate(waterMarkPage, 1f, 0, 0, 1f, 0, 0);
                }

                // reset transparency state to default before adding next page
                writer.DirectContent.RestoreState();

                // now move to following page
                if (i < reader.NumberOfPages)
                {
                    doc.NewPage();
                }
            }

            // flush writer but leave the stream open!
            writer.Flush();
            writer.CloseStream = false;
        }
    }
    memOut.Position = 0;
    if (memOut.Length > 0)
    {
        pdfout = new byte[memOut.Length];
        pdfout = memOut.ToArray();
        done = true;
    }
}
使用(System.IO.MemoryStream memWatermark=new MemoryStream(pdfWatermark))
使用(System.IO.MemoryStream memIn=新的MemoryStream(pdfin))
使用(System.IO.MemoryStream memOut=new MemoryStream())
{
memWatermark.Position=0;
memIn.Position=0;
memOut.Position=0;
PdfReader reader=新PdfReader(memIn);
PdfReader wmReader=新PdfReader(Mem水印);
int j=wmReader.NumberOfPages;
如果(wmReader.NumberOfPages>0)
{       
矩形wmSize=wmReader.GetPageSize(1);
int wmRotation=wmReader.GetPageRotation(1);
使用(文档文档=新文档(wmSize))
{
PdfWriter writer=PdfWriter.GetInstance(doc,memOut);
doc.Open();
PdfImportedPage-waterMarkPage=writer.GetImportedPage(wmReader,1);
PDF导入页面当前页面;

对于(int i=1;i我找到了这个解决方案。在图像中转换水印的pdf页面,我添加该图像并将其添加到最终pdf的每个页面。我使用库将pdf页面转换为PNG图像。
下面是代码:

using (System.IO.MemoryStream memIn = new MemoryStream(pdfin))
using (System.IO.MemoryStream memOut = new MemoryStream())
{
    byte[] image = null;

    using (System.IO.MemoryStream memWatermark = new MemoryStream(pdfWatermark))                                        
    using (var document = PdfiumViewer.PdfDocument.Load(memWatermark))
    {
       using (var ms = new MemoryStream())
       {
           document.Render(0, 300, 300, true).Save(ms, System.Drawing.Imaging.ImageFormat.Png);
           image = ms.ToArray();
       }
    }

    PdfReader reader = new PdfReader(memIn);
    int n = reader.NumberOfPages;
    PdfStamper stamper = new PdfStamper(reader, memOut);


    // transparency
    PdfGState gs1 = new PdfGState();
    gs1.StrokeOpacity = 0.4f;
    gs1.FillOpacity = 0.2f;

    // properties
    PdfContentByte over;
    iTextSharp.text.Rectangle pagesize;
    float x, y;


    stamper.FormFlattening = true;
    stamper.FreeTextFlattening = true;

    iTextSharp.text.Rectangle wmSize = reader.GetPageSize(1);
    int wmRotation = reader.GetPageRotation(1);

    // image watermark
    var img = iTextSharp.text.Image.GetInstance(image);
    float w = img.ScaledWidth;
    float h = img.ScaledHeight;


    using (Document doc = new Document(wmSize))
    {
        PdfWriter writer = PdfWriter.GetInstance(doc, memOut);
        doc.Open();

        PdfImportedPage currentPage;
        for (int i = 1; i <= reader.NumberOfPages; i++)
        {
            pagesize = reader.GetPageSizeWithRotation(i);
            over = writer.DirectContent;

            currentPage = writer.GetImportedPage(reader, i);
            if (wmRotation == 90 || wmRotation == 270)
                over.AddTemplate(currentPage, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(i).Height);
            else
                over.AddTemplate(currentPage, 1f, 0, 0, 1f, 0, 0);

            x = (pagesize.Left + pagesize.Right) / 2;
            y = (pagesize.Top + pagesize.Bottom) / 2;
            over.SaveState();
            over.SetGState(gs1);

            var pageRotation = reader.GetPageRotation(i);
            if (pageRotation == 90 || pageRotation == 270)
            {
                if (pageRotation == 90)
                {
                    img.RotationDegrees = 180f;
                    img.SetAbsolutePosition(0, 0);
                    over.AddImage(img);
                }
                else
                {
                    img.RotationDegrees = -90f;
                    img.SetAbsolutePosition(-(y / 2), (x / 2));
                    over.AddImage(img);
                }
            }
            else
                over.AddImage(img, w, 0, 0, h, x - (w / 2), y - (h / 2));

            over.RestoreState();

            // now move to following page
            if (i < reader.NumberOfPages)
            {
                doc.NewPage();
            }
        }

        // flush writer but leave the stream open!
        writer.Flush();
        writer.CloseStream = false;
    }

    memOut.Position = 0;
    if (memOut.Length > 0)
    {
        pdfout = new byte[memOut.Length];
        pdfout = memOut.ToArray();
        done = true;
    }

    stamper.Close();
    reader.Close();
}
使用(System.IO.MemoryStream memIn=new MemoryStream(pdfin))
使用(System.IO.MemoryStream memOut=new MemoryStream())
{
字节[]图像=空;
使用(System.IO.MemoryStream Mem水印=新的MemoryStream(pdfWatermark))
使用(var document=PdfiumViewer.PdfDocument.Load(memWatermark))
{
使用(var ms=new MemoryStream())
{
document.Render(03003000,true).Save(ms,System.Drawing.Imaging.ImageFormat.Png);
image=ms.ToArray();
}
}
PdfReader reader=新PdfReader(memIn);
int n=reader.NumberOfPages;
PdfStamper压模=新PdfStamper(读卡器、备忘录);
//透明度
PdfGState gs1=新的PdfGState();
gs1.StrokeOpacity=0.4f;
gs1.1不透明度=0.2f;
//性质
PdfContentByte超过;
iTextSharp.text.Rectangle页面大小;
浮动x,y;
stamper.FormFlatting=真;
stamper.FreeTextFlatting=true;
iTextSharp.text.Rectangle wmSize=reader.GetPageSize(1);
int wmRotation=reader.GetPageRotation(1);
//图像水印
var img=iTextSharp.text.Image.GetInstance(Image);
float w=img.ScaledWidth;
浮动h=img.标度高度;
使用(文档文档=新文档(wmSize))
{
PdfWriter writer=PdfWriter.GetInstance(doc,memOut);
doc.Open();
PDF导入页面当前页面;
对于(int i=1;i 0)
{
pdfout=新字节[memOut.Length];
pdfout=memOut.ToArray();
完成=正确;
}
压模关闭();
reader.Close();
}

下划线”是否意味着添加签名?您还需要显示该代码,因为您声明添加水印本身会产生所需的结果,但在向文档添加更多内容时会中断。@Filburt我正在使用Android上的pspdfkit sdk编辑最终pdf(原始+水印)。“下划线”意思是在文档文本上做批注和下划线,而不是签名。感谢您的澄清。重要的是您提到了pspdfkit,因为人们可能会觉得您正在使用itextsharp做下划线部分。首先,您选择了一个破坏性的水印例程,该例程会删除所有不存在的交互内容推荐的方法是这样做的。这是设计完成的吗?此外,您将水印页面叠加到每个文档页面上。因此,如果原始水印PDF的内容带有下划线,则其叠加表示也会带有下划线。如果您不希望水印干扰,请使用非干扰性水印模板开始不幸的是,这不是我写的代码,我想做这件事的人不知道他到底做了什么。我不确定我是否理解你的解决方案,请你在网上给我一个参考,以了解我需要做什么?