PDF操作:
- 旋转
- 删除
- 合并
- 拆分
- 转成图片
- 导出内嵌资源图片
- 两页合并成一页
- 添加、去除密码
- 添加水印
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
源码地址