iTextSharp的:有没有办法复制链接时导入页面? [英] Itextsharp: Is There Any Way To Copy Links When Import Pages?

查看:235
本文介绍了iTextSharp的:有没有办法复制链接时导入页面?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我工作的一个项目,我需要编辑PDF的显示前

我需要


  • 添加水印

  • 编辑权限(锁定避免复制/粘贴和另存为')

  • 编辑观众preferences

和我做到了......与工作除了一件事精细,原始文件的链接不会在新文件中工作...任何想法?

请注意:其实,这是我的code(我使用iTextSharp的)

 私人无效loadPdf()
    {
        如果(Request.QueryString.HasKeys())
        {
            如果(Request.QueryString.GetKey(0)==thepath与&&放大器; Request.QueryString.GetKey(1)==isprintable与&&放大器; Request.QueryString.GetKey(2)==型)
            {
                #区域kuak
                文档DOC =新的文档();
                PdfReader pdfReader =新PdfReader(的Request.QueryString [thepath]);
                使用(MemoryStream的MemoryStream的=新的MemoryStream())
                {
                    PdfWriter pdfWriter = PdfWriter.GetInstance(文件,MemoryStream的);
                    pdfWriter.Viewer preferences = PdfWriter.PageModeUseOutlines;
                    //pdfWriter.Viewer$​​p$pferences = PdfWriter.PageLayoutTwoColumnLeft; /// Despliega EL docuemnto带削去德奥哈斯
                    pdfWriter.Viewer preferences = PdfWriter.PageLayoutOneColumn;
                    pdfWriter.Viewer preferences = PdfWriter.HideToolbar;
                    //pdfWriter.Viewer$​​p$pferences = PdfWriter.HideWindowUI; /// quita洛杉矶滚动ŸEL面板德拉derecha古兰经contiene洛杉矶书签Ÿ拉斯buskedas迪登特鲁德尔PDF
                    如果(的Request.QueryString [isprintable] ==N)
                    {
                        pdfWriter.Viewer preferences = PdfWriter.HideMenubar;
                        System.Text.UTF8Encoding编码=新System.Text.UTF8Encoding();
                        pdfWriter.SetEncryption(NULL,encoding.GetBytes(mYpAssss),0,PdfWriter.STRENGTH40BITS);
                    }
                    doc.Open();
                    PdfContentByte pdfContentByte = pdfWriter.DirectContent;
                    doc.AddDocListener(pdfWriter);
                    对于(INT页= 1;页< = pdfReader.NumberOfPages;网页++)
                    {
                        //doc.SetPageSize(pdfReader.GetPageSize(page));
                        doc.SetPageSize(pdfReader.GetPageSizeWithRotation(页));
                        doc.NewPage();
                        PdfImportedPage pdfImportedPage = pdfWriter.GetImportedPage(pdfReader,页);
                        INT腐烂= pdfReader.GetPageRotation(页);
                        如果(腐== || 90腐== 270)
                            pdfContentByte.AddTemplate(pdfImportedPage,0,-1.0F,1.0F,0,0,pdfReader.GetPageSizeWithRotation(页).Height);
                        其他
                            pdfContentByte.AddTemplate(pdfImportedPage,1.​​0F,0,0,1.0F,0,0);
                        字符串theId = findId();
                        如果(isWatermarkNeeded(theId))
                        {
                            #REGION添加文字水印
                            //pdfContentByte.BeginText();
                            //iTextSharp.text.Rectangle的pageSize = pdfReader.GetPageSizeWithRotation(页);
                            // BASEFONT BASEFONT = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD,System.Text.Encoding.ASCII.EncodingName,FALSE);
                            //pdfContentByte.SetFontAndSize(baseFont,200);
                            // BaseColor baseColor =新BaseColor(255,0,0,20);
                            //pdfContentByte.SetColorFill(baseColor);
                            //浮动textAngle =(浮点)GetHypotenuseAngleInDegreesFrom(pageSize.Height,pageSize.Width);
                            //pdfContentByte.ShowTextAligned(PdfContentByte.ALIGN_CENTER,草稿,350,pageSize.Height / 2,textAngle);
                            //pdfContentByte.EndText();
                            #endregion
                            #区域添加图片水印                            字符串fechaExp =埃斯特旺斯这份执行:+ GetExpirationDate(theId).ToShortDateString();
                            pdfContentByte.BeginText();
                            //iTextSharp.text.Image IMG = iTextSharp.text.Image.GetInstance(使用Server.Mappath(〜/图片/ watermark3.png));
                            iTextSharp.text.Image IMG = iTextSharp.text.Image.GetInstance(ImageCheck.CreatePicture(@C:\\用户\\ MYUSER \\桌面\\ watermark.png,fechaExp).ToArray());
                            img.SetAbsolutePosition(0,0);
                            pdfContentByte.AddImage(IMG);
                            pdfContentByte.EndText();
                            #endregion
                        }                    }
                    pdfReader.Close();
                    doc.Close();
                    字节[] =内容memoryStream.ToArray();
                    Response.ContentType =应用程序/ PDF
                    Response.AddHeader(内容长度,content.Length.ToString());
                    Response.BinaryWrite(内容);
                }
                #endregion
            }
            其他
            {
                //干草查询字符串亲无corresponden CON洛杉矶阙本身necesita
            }
        }
        其他
        {
            //没有本质enviaron洛杉矶查询字符串
        }
    }


解决方案

您必须得到从原始PDF链接

  VAR链接= reader.GetLinks(PAGENUMBER);

,并将其写入到新的PDF

 的foreach(在链接VAR链接)
                    {
                        VAR注释= link.CreateAnnotation(pdfWriter);
                        writer.AddAnnotation(注释);
                    }

I'm working on a project where i need to edit pdf's before display it

I need

  • add a watermark
  • edit permissions ( lock for avoid 'copy/paste' and 'save as' )
  • edit viewer preferences

And i did it... and work fine except for one thing, the links in the original file does not work in the new file... any idea?

NOTE: Actually, this is my code ( i'm using itextsharp )

    private void loadPdf()
    {
        if (Request.QueryString.HasKeys())
        {
            if (Request.QueryString.GetKey(0) == "thepath" && Request.QueryString.GetKey(1) == "isprintable" && Request.QueryString.GetKey(2) == "type")
            {
                #region kuak
                Document doc = new Document();
                PdfReader pdfReader = new PdfReader(Request.QueryString["thepath"]);
                using (MemoryStream memoryStream = new MemoryStream())
                {
                    PdfWriter pdfWriter = PdfWriter.GetInstance(doc, memoryStream);
                    pdfWriter.ViewerPreferences = PdfWriter.PageModeUseOutlines;
                    //pdfWriter.ViewerPreferences = PdfWriter.PageLayoutTwoColumnLeft;  /// Despliega el docuemnto en pares de hojas
                    pdfWriter.ViewerPreferences = PdfWriter.PageLayoutOneColumn;
                    pdfWriter.ViewerPreferences = PdfWriter.HideToolbar;
                    //pdfWriter.ViewerPreferences = PdfWriter.HideWindowUI; /// quita los scrollbars y el panel de la derecha qur contiene los bookmarks y las buskedas dentro del pdf
                    if (Request.QueryString["isprintable"] == "n")
                    {
                        pdfWriter.ViewerPreferences = PdfWriter.HideMenubar;
                        System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
                        pdfWriter.SetEncryption(null, encoding.GetBytes("mYpAssss"), 0, PdfWriter.STRENGTH40BITS);
                    }
                    doc.Open();
                    PdfContentByte pdfContentByte = pdfWriter.DirectContent;
                    doc.AddDocListener(pdfWriter);
                    for (int page = 1; page <= pdfReader.NumberOfPages; page++)
                    {
                        //doc.SetPageSize(pdfReader.GetPageSize(page));
                        doc.SetPageSize(pdfReader.GetPageSizeWithRotation(page));
                        doc.NewPage();
                        PdfImportedPage pdfImportedPage = pdfWriter.GetImportedPage(pdfReader, page);
                        int rot = pdfReader.GetPageRotation(page);
                        if (rot == 90 || rot == 270)
                            pdfContentByte.AddTemplate(pdfImportedPage, 0, -1.0F, 1.0F, 0, 0, pdfReader.GetPageSizeWithRotation(page).Height);
                        else
                            pdfContentByte.AddTemplate(pdfImportedPage, 1.0F, 0, 0, 1.0F, 0, 0);
                        string theId = findId();
                        if (isWatermarkNeeded(theId))
                        {
                            #region ADD TEXT WATERMARK
                            //pdfContentByte.BeginText();
                            //iTextSharp.text.Rectangle pageSize = pdfReader.GetPageSizeWithRotation(page);
                            //BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, System.Text.Encoding.ASCII.EncodingName, false);
                            //pdfContentByte.SetFontAndSize(baseFont, 200);
                            //BaseColor baseColor = new BaseColor(255, 0, 0, 20);
                            //pdfContentByte.SetColorFill(baseColor);
                            //float textAngle = (float)GetHypotenuseAngleInDegreesFrom(pageSize.Height, pageSize.Width);
                            //pdfContentByte.ShowTextAligned(PdfContentByte.ALIGN_CENTER, "DRAFT", 350, pageSize.Height / 2, textAngle);
                            //pdfContentByte.EndText();
                            #endregion
                            #region ADD IMAGE WATERMARK

                            string fechaExp = "Este documento vence: " + GetExpirationDate(theId).ToShortDateString();
                            pdfContentByte.BeginText();
                            //iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(Server.MapPath("~/images/watermark3.png"));
                            iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(ImageCheck.CreatePicture(@"C:\Users\myUser\Desktop\watermark.png", fechaExp).ToArray());
                            img.SetAbsolutePosition(0, 0);
                            pdfContentByte.AddImage(img);
                            pdfContentByte.EndText();
                            #endregion
                        }

                    }
                    pdfReader.Close();
                    doc.Close();
                    byte[] content = memoryStream.ToArray();
                    Response.ContentType = "application/pdf";
                    Response.AddHeader("content-length", content.Length.ToString());
                    Response.BinaryWrite(content);
                }
                #endregion
            }
            else
            {
                //hay querystring pro no corresponden con los que se necesita
            }
        }
        else
        {
            //no se enviaron los querystring
        }


    }

解决方案

You have to get the links from original PDF

var links = reader.GetLinks(pageNumber);

And write them to the new PDF

 foreach (var link in links)
                    {
                        var annotation = link.CreateAnnotation(pdfWriter);
                        writer.AddAnnotation(annotation);
                    }

这篇关于iTextSharp的:有没有办法复制链接时导入页面?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆