操作PDF的方法

PDF的内容提取、转换见上篇

PDF操作:

  1. 旋转
  2. 删除
  3. 合并
  4. 拆分
  5. 转成图片
  6. 导出内嵌资源图片
  7. 两页合并成一页
  8. 添加、去除密码
  9. 添加水印

PDF旋转某一页

复制代码
 var document = pdfViewer1.Document;
 int page = pdfViewer1.Renderer.Page;
//判断pdf旋转方向
 var rotate = (int)document.GetRotation(page);
 if (rotate < 3)
     rotate++;
 else
     rotate = 0;
 pdfViewer1.Document = null;
//向下一个方向旋转
 document.RotatePage(page, (PdfRotation)rotate);
 var memoryStream = new MemoryStream();
 document.Save(memoryStream);
 pdfViewer1.Document = PdfDocument.Load(this, memoryStream);
 pdfViewer1.Renderer.Page = page;
//如需要保存
复制代码
//document.Save(路径);

PDF删除某一页

复制代码
   int page = pdfViewer1.Renderer.Page;
   pdfViewer1.Document.DeletePage(page);

pdf合并 如需保存请直接保存文件

复制代码
 var file = "";
 using (var form = new OpenFileDialog())
 {
     form.Filter = "PDF Files (*.pdf)|*.pdf|All Files (*.*)|*.*";
     form.RestoreDirectory = true;
     form.Title = "Open PDF File";

     if (form.ShowDialog(this) != DialogResult.OK)
     {
         Dispose();
         return;
     }
     file = form.FileName;
 }
 var document = pdfViewer1.Document;
 var doc = PdfSupport.MergePDF(document, OpenDocument(file));
 {
     if (doc != null)
     {
         pdfViewer1.Document = null;
         pdfViewer1.Document = doc;
     }
 }
//打开pdf
 private PdfDocument OpenDocument(string fileName)
 {
     try
     {   // Remove ReadOnly attribute from the copy.
         File.SetAttributes(fileName, File.GetAttributes(fileName) & ~FileAttributes.ReadOnly);
         return PdfDocument.Load(this, new MemoryStream(File.ReadAllBytes(fileName)));
     }
     catch (Exception ex)
     {
         MessageBox.Show(this, ex.Message, Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
         return null;
     }
 }

拆分PDF,拆分PDF支持指定拆分

复制代码
 var path = Path.Combine(Path.GetDirectoryName(fileName), Path.GetFileNameWithoutExtension(fileName));
 if (!Directory.Exists(path))
 {
     Directory.CreateDirectory(path);
 }
 var document = pdfViewer1.Document;
 {
     for (int i = 0; i < document.PageCount; i++)
     {
         var filePath = Path.Combine(path, $"{i}.pdf");
      ///eg. "1,1,1,1" 4个1页
      /// "1-3" 第1页到第3页
      /// "1,3" 第1页、第3页
         using (var doc = PdfSupport.GetPDFPage(document, i + 1))
         {
             doc.Save(filePath);
         }
     }
 }

PDF转成图片

复制代码
  var document = pdfViewer1.Document;
  var path = Path.Combine(Path.GetDirectoryName(fileName), Path.GetFileNameWithoutExtension(fileName));
  if (!Directory.Exists(path))
  {
      Directory.CreateDirectory(path);
  }
  var dpiX = 96 * 2;
  var dpiY = 96 * 2;
  for (int i = 0; i < document.PageCount; i++)
  {
      using (var image = document.Render(i, (int)document.PageSizes[i].Width * 4 / 3, (int)document.PageSizes[i].Height * 4 / 3, dpiX, dpiY, PdfRotation.Rotate0, PdfRenderFlags.Annotations | PdfRenderFlags.CorrectFromDpi))
      {
          image.Save(Path.Combine(path, i + ".png"));
      }
  }

导出PDF内嵌资源

复制代码
  var path = Path.Combine(Path.GetDirectoryName(fileName), Path.GetFileNameWithoutExtension(fileName));
  if (!Directory.Exists(path))
  {
      Directory.CreateDirectory(path);
  }
  using (var memoryStream = new MemoryStream())
  {
      pdfViewer1.Document.Save(memoryStream);
      var document = PdfReader.Open(memoryStream);
      var imageCount = 0;
      // Iterate the pages.
      foreach (var page in document.Pages)
      {
          // Get the resources dictionary.
          var resources = page.Elements.GetDictionary("/Resources");
          if (resources == null)
              continue;

          // Get the external objects dictionary.
          var xObjects = resources.Elements.GetDictionary("/XObject");
          if (xObjects == null)
              continue;

          var items = xObjects.Elements.Values;
          // Iterate the references to external objects.
          foreach (var item in items)
          {
              var reference = item as PdfReference;
              if (reference == null)
                  continue;

              var xObject = reference.Value as PdfDictionary;
              // Is external object an image?
              if (xObject != null && xObject.Elements.GetString("/Subtype") == "/Image")
              {
                  PDFHelper.ExportImage(xObject, path, ref imageCount);
              }
          }
      }
  }
               

两页合并成一页

复制代码
  using (var stream = new MemoryStream())
  {
      pdfViewer1.Document.Save(stream);
      stream.Position = 0;

      // Create the output document.
      var outputDocument = new PdfSharp.Pdf.PdfDocument();
      var outputmemoryStream = new MemoryStream();
      // Show single pages.
      // (Note: one page contains two pages from the source document)
      outputDocument.PageLayout = PdfPageLayout.SinglePage;

      var font = new XFont("微软雅黑", 8, XFontStyle.Regular);
      var format = new XStringFormat();
      format.Alignment = XStringAlignment.Center;
      format.LineAlignment = XLineAlignment.Far;

      // Open the external document as XPdfForm object.
      var form = XPdfForm.FromStream(stream);

      for (var idx = 0; idx < form.PageCount; idx += 2)
      {
          // Add a new page to the output document.
          var page = outputDocument.AddPage();
          page.Orientation = PageOrientation.Landscape;
          double width = page.Width;
          double height = page.Height;

          var gfx = XGraphics.FromPdfPage(page);

          // Set the page number (which is one-based).
          form.PageNumber = idx + 1;

          var box = new XRect(0, 0, width / 2, height);
          // Draw the page identified by the page number like an image.
          gfx.DrawImage(form, box);

          // Write page number on each page.
          box.Inflate(0, -10);
          gfx.DrawString(String.Format("- {0} -", idx + 1),
              font, XBrushes.Red, box, format);

          if (idx + 1 >= form.PageCount)
              continue;

          // Set the page number (which is one-based).
          form.PageNumber = idx + 2;

          box = new XRect(width / 2, 0, width / 2, height);
          // Draw the page identified by the page number like an image.
          gfx.DrawImage(form, box);

          // Write page number on each page.
          box.Inflate(0, -10);
          gfx.DrawString(String.Format("- {0} -", idx + 2),
              font, XBrushes.Red, box, format);
      }
      outputDocument.Save(outputmemoryStream);
      pdfViewer1.Document = null;
      pdfViewer1.Document = PdfDocument.Load(this, outputmemoryStream);
  }
        

添加、去除密码

复制代码
//添加密码
    using (var form = new PasswordForm())
    {
        if (form.ShowDialog(this) == DialogResult.OK)
        {
            var path = Path.Combine(Path.GetDirectoryName(fileName), Path.GetFileNameWithoutExtension(fileName));
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
            var txt = form.Password;
            using (var stream = new MemoryStream())
            {
                pdfViewer1.Document.Save(stream);
                stream.Position = 0;
                // Open an existing document. Providing an unrequired password is ignored.
                var document = PdfReader.Open(stream);

                var securitySettings = document.SecuritySettings;

                // Setting one of the passwords automatically sets the security level to 
                // PdfDocumentSecurityLevel.Encrypted128Bit.
                securitySettings.UserPassword = txt;
                //securitySettings.OwnerPassword = "owner";

                // Don't use 40 bit encryption unless needed for compatibility.
                //securitySettings.DocumentSecurityLevel = PdfDocumentSecurityLevel.Encrypted40Bit;

                // Restrict some rights.
                securitySettings.PermitAccessibilityExtractContent = false;
                securitySettings.PermitAnnotations = false;
                securitySettings.PermitAssembleDocument = false;
                securitySettings.PermitExtractContent = false;
                securitySettings.PermitFormsFill = true;
                securitySettings.PermitFullQualityPrint = false;
                securitySettings.PermitModifyDocument = true;
                securitySettings.PermitPrint = false;

                // Save the document...
                document.Save(Path.Combine(path, Path.GetFileName(fileName)));
            }
        }
    }
复制代码
//去除密码
   using (var form = new PasswordForm())
   {
       if (form.ShowDialog(this) == DialogResult.OK)
       {
           var path = Path.Combine(Path.GetDirectoryName(fileName), Path.GetFileNameWithoutExtension(fileName));
           if (!Directory.Exists(path))
           {
               Directory.CreateDirectory(path);
           }
           var txt = form.Password;
           using (var stream = new MemoryStream())
           {
               pdfViewer1.Document.Save(stream);
               stream.Position = 0;
               // Open an existing document. Providing an unrequired password is ignored.
               var document = PdfReader.Open(stream, txt, PdfDocumentOpenMode.Modify);
               document.SecuritySettings.DocumentSecurityLevel = PdfSharp.Pdf.Security.PdfDocumentSecurityLevel.None;
               document.Save(Path.Combine(path, Path.GetFileName(fileName)));
           }
       }
   }

添加水印

复制代码
   using (var stream = new MemoryStream())
   {
       pdfViewer1.Document.Save(stream);
       stream.Position = 0;
       var font = new XFont("微软雅黑", fontsize, XFontStyle.Regular, XPdfFontOptions.UnicodeDefault);
       var document = PdfReader.Open(stream);

       // Set version to PDF 1.4 (Acrobat 5) because we use transparency.
       if (document.Version < 14)
           document.Version = 14;

       for (var idx = 0; idx < document.Pages.Count; idx++)
       {
           var page = document.Pages[idx];
           var gfx = XGraphics.FromPdfPage(page);
           var size = gfx.MeasureString(watermark, font);
           gfx.TranslateTransform(page.Width / 2, page.Height / 2);
           gfx.RotateTransform(-Math.Atan(page.Height / page.Width) * 180 / Math.PI);
           gfx.TranslateTransform(-page.Width / 2, -page.Height / 2);
           if (waterIndex == 0)
           {
               var format = new XStringFormat();
               format.Alignment = XStringAlignment.Near;
               format.LineAlignment = XLineAlignment.Near;
               XBrush brush = new XSolidBrush(XColor.FromArgb(color));
               gfx.DrawString(watermark, font, brush,
                   new XPoint((page.Width - size.Width) / 2, (page.Height - size.Height) / 2),
                   format);
           }
           else if (waterIndex == 1)
           {
               var path = new XGraphicsPath();
               var format = new XStringFormat();
               format.Alignment = XStringAlignment.Near;
               format.LineAlignment = XLineAlignment.Near;
               path.AddString(watermark, font.FontFamily, XFontStyle.BoldItalic, fontsize,
               new XPoint((page.Width - size.Width) / 2, (page.Height - size.Height) / 2),
                   format);
               var pen = new XPen(XColor.FromArgb(color), 2);
               gfx.DrawPath(pen, path);
           } 
           if (waterIndex == 2)
           {
               var path = new XGraphicsPath();
               var format = new XStringFormat();
               format.Alignment = XStringAlignment.Near;
               format.LineAlignment = XLineAlignment.Near;
               path.AddString(watermark, font.FontFamily, XFontStyle.BoldItalic, fontsize,
                   new XPoint((page.Width - size.Width) / 2, (page.Height - size.Height) / 2),
                   format);                 
               var pen = new XPen(XColor.FromArgb(50, 75, 0, 130), 3);
               XBrush brush = new XSolidBrush(XColor.FromArgb(color));
               gfx.DrawPath(pen, brush, path);
           }
       }
       var outputmemoryStream = new MemoryStream();
       document.Save(outputmemoryStream);
       pdfViewer1.Document = null;
       pdfViewer1.Document = PdfDocument.Load(this, outputmemoryStream);
   }

阿里云下载:https://www.aliyundrive.com/s/o4KTpMLQyU9

具体使用方法请仓库自取

欢迎Start、PR
源码地址

相关推荐
牧马人win19 分钟前
Dapper轻量级扩展库SmartDapper
.net·dapper
吹牛不交税1 小时前
安装Framework4.0时提示:Microsoft .NET Framework 4 已是此操作系统的一部分。不需要安装 .NET Framework
microsoft·.net
tiantangzhixia1 小时前
Master PDF Linux 平台的 5.9.35 版本安装与自用
linux·pdf·master pdf
无风听海2 小时前
.NET10之ASP.NET Core的Filter管线
java·asp.net·.net
无风听海2 小时前
.NET10之从进程角度理解dotnet run
.net
开开心心就好1 天前
发票合并打印工具,多页布局设置实时预览
linux·运维·服务器·windows·pdf·harmonyos·1024程序员节
软件工程小施同学1 天前
区块链论文速读 CCF A--VLDB 2025 (1) 附pdf下载
pdf·区块链
缺点内向2 天前
C#: 告别繁琐!轻松移除Word文档中的文本与图片水印
c#·自动化·word·.net
2501_930707782 天前
使用 C# .NET 从 PowerPoint 演示文稿中提取背景图片
c#·powerpoint·.net
向上的车轮2 天前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net