using ComPDFKit.PDFPage; using ComPDFKitViewer.PdfViewer; using ImageMagick.Formats; using ImTools; using Microsoft.Office.Core; using PDF_Master.CustomControl; using PDF_Master.EventAggregators; using PDF_Master.Helper; using PDF_Master.Model; using PDF_Master.Model.Dialog.HomePageToolsDialogs.HomePagePrinter; using Prism.Commands; using Prism.Events; using Prism.Mvvm; using Prism.Regions; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Drawing.Printing; using System.IO; using System.Linq; using System.Printing; using System.Reflection; using System.Threading.Tasks; using System.Windows; using System.Windows.Annotations; using System.Windows.Controls; using System.Windows.Forms; using System.Windows.Media.Imaging; using System.Windows.Shell; using static Dropbox.Api.TeamLog.PaperDownloadFormat; using static PDF_Master.ViewModels.Dialog.HomePageToolsDialogs.HomePagePrinter.HomePagePrinterDocumentContentViewModel; namespace PDF_Master.ViewModels.Dialog.HomePageToolsDialogs.HomePagePrinter { public class HomePagePrinterDocumentContentViewModel : BindableBase, INavigationAware { private CPDFViewer PDFViewer; private PrintQueue documentPrintQueue; private PrintDocument printDocument = new PrintDocument(); public PrintSettingsInfo PrintSettingsInfo; public IEventAggregator printDocumentEvent; private string Unicode = null; #region 打印过程中一些参数需要在函数外定义 /// /// 海报模式:打印纸 /// int posterPrintPaperIndex = 0; /// /// 海报模式,水平纸张数 /// public int HorizonPaperCount = 0; /// /// 海报模式,垂直纸张数 /// public int VerticalPaperCount = 0; /// /// 海报模式,单页总纸张数 /// public int WholeCountSinglePage = 0; /// ///海报模式当前水平纸 /// public int HorizonPaperIndex = 0; /// ///海报模式当前垂直纸 /// public int VerticalPaperIndex = 0; /// /// 海报模式,总打印纸张数 /// public int WholePaperCountModPoster = 0; /// /// 海报模式渲染出来的纸张,只有第一次进入和每次翻页才重新渲染,减少渲染次数 /// public Bitmap PosterCurrentBitmap = null; /// /// 同理,海报模式实际被拆分的纸张,更改过比例,添加了白边 /// public Bitmap DisplayBitmap = null; /// /// 海报模式,由预览决定的比例 /// public double PosterRatio = 0; #endregion /// /// 转存防卡顿 /// public class DocumentSettingsInfo { public int DocumentWidth = 0; public int DocumentHeight = 0; public Margins margins = new Margins(); public Rectangle DocumentBounds = new Rectangle(); public bool DocumentLandscape = false; public bool DocumentColor = false; public bool IsSettingsChanged = true; } public DocumentSettingsInfo documentSettingsInfo = new DocumentSettingsInfo(); /// /// 记录打印设置改变前的总页数,用于判断是否需要跳转第一页,仅当总页数改变时跳转 /// int PreviousPrintedPageCount = 0; public int PrintIndex; /// ///打印纸dpi100, PDF dpi 72,需要缩放 /// public double PDFToMediaDpiRatio = 100.0 / 72.0; public double mmToDpiRatio = 100 / 25.4; Bitmap blankPageBitmap; Bitmap blankPageBitmapForPrint; private string _paperWidth; public string PaperWidth { get => _paperWidth; set => SetProperty(ref _paperWidth, value); } private string _paperHeight; public string PaperHeight { get => _paperHeight; set => SetProperty(ref _paperHeight, value); } private string _viewBoxWidth; public string ViewBoxWidth { get => _viewBoxWidth; set => SetProperty(ref _viewBoxWidth, value); } private string _viewBoxHeight; public string ViewBoxHeight { get => _viewBoxHeight; set => SetProperty(ref _viewBoxHeight, value); } private BitmapSource _bitmapSource; /// /// 渲染后的图 /// public BitmapSource BitmapSource { get { return _bitmapSource; } set { SetProperty(ref _bitmapSource, value); } } private int _targetPaperIndex = 1; public int TargetPaperIndex { get => _targetPaperIndex; set { SetProperty(ref _targetPaperIndex, value); JumpToSelectedPage(); } } /// /// 目标纸张 /// TargetPaper[纸张编号]=正确的纸张 /// public List TargetPaperList = new List(); /// /// 打印的总页数 /// private int _printedPageCount; public int PrintedPageCount { get => _printedPageCount; set => SetProperty(ref _printedPageCount, value); } private Visibility _errorPageTxtVisibility = Visibility.Collapsed; public Visibility ErrorPageTxtVisibility { get => _errorPageTxtVisibility; set => SetProperty(ref _errorPageTxtVisibility, value); } /// /// 手动双面打印 /// public bool IsManualDuplex = false; public DelegateCommand TurnPageCommand { get; set; } public DelegateCommand JumpPageCommand { get; set; } public HomePagePrinterDocumentContentViewModel(IEventAggregator eventAggregator) { this.printDocumentEvent = eventAggregator; printDocumentEvent.GetEvent().Subscribe(RecvPrintSettingsInfo, e => e.Unicode == Unicode); printDocumentEvent.GetEvent().Subscribe(RecvPrintQueue, e => e.Unicode == Unicode); printDocumentEvent.GetEvent().Subscribe(RecvLabel, e => e.Unicode == Unicode); TurnPageCommand = new DelegateCommand(TurnPage); JumpPageCommand = new DelegateCommand(JumpPage); } public void TurnPage(object e) { var btn = e as System.Windows.Controls.Button; if (btn != null) { if (btn.Name == "PrePageBtn") { if (TargetPaperIndex >= 2) { TargetPaperIndex--; } } else { if (TargetPaperIndex < PrintedPageCount) { TargetPaperIndex++; } } } } public void RecvPrintQueue(PrintQueueWithUnicode printQueueWithUnicode) { if (printQueueWithUnicode.printQueue != null) { PrintIndex = 0; this.documentPrintQueue = printQueueWithUnicode.printQueue; var printDocument = new PrintDocument(); var printTicket = new PrintTicket(); printDocument.PrinterSettings.PrinterName = printQueueWithUnicode.printQueue.Name; if (PrintSettingsInfo.EnumPrintOrientation == EnumPrintOrientation.StatusPortrait) { printDocument.DefaultPageSettings.Landscape = false; } else if (PrintSettingsInfo.EnumPrintOrientation == EnumPrintOrientation.StatusLandscape) { printDocument.DefaultPageSettings.Landscape = true; } if (!PrintSettingsInfo.IsGrayscale && printQueueWithUnicode.printQueue.GetPrintCapabilities().OutputColorCapability.Contains(OutputColor.Color)) { printDocument.DefaultPageSettings.Color = true; } else { printDocument.DefaultPageSettings.Color = false; } if (PrintSettingsInfo.PrintModInfo.EnumDuplexPrintMod == EnumDuplexPrintMod.StatusFlipLongEdge || PrintSettingsInfo.PrintModInfo.EnumDuplexPrintMod == EnumDuplexPrintMod.StatusFlipShortEdge || PrintSettingsInfo.PrintModInfo.EnumPrintMod == EnumPrintMod.StatusBooklet) { ///无阶段,自动双面打印 ///已在起始时验证 if (printQueueWithUnicode.EnumBothSidesStage == EnumBothSidesStage.StatusNone) { if (PrintSettingsInfo.PrintModInfo.EnumDuplexPrintMod == EnumDuplexPrintMod.StatusFlipLongEdge) { ///Fix 13346: Duplex.Vertical, 这个是长边翻页 printDocument.PrinterSettings.Duplex = Duplex.Vertical; } else { ///Fix 13346: Duplex.Horizontal, 这个是短边翻页 printDocument.PrinterSettings.Duplex = Duplex.Horizontal; } } else { printDocument.PrinterSettings.Duplex = Duplex.Simplex; IsManualDuplex = true; //TODO 手动双面打印,先印单数页再印双数页 if (printQueueWithUnicode.EnumBothSidesStage == EnumBothSidesStage.StatusFrontSide) { PrintIndex = 0; } else { PrintIndex = 1; } } } //海报模式,预设单面打印 else { printDocument.PrinterSettings.Duplex = Duplex.Simplex; } printQueueWithUnicode.printQueue.DefaultPrintTicket = printTicket; printDocument.DefaultPageSettings.PaperSize = PrintSettingsInfo.PrintDocument.DefaultPageSettings.PaperSize; PaperSource pkSource; List paperSources = new List(); paperSources.Clear(); for (int i = 0; i < printDocument.PrinterSettings.PaperSources.Count; i++) { pkSource = printDocument.PrinterSettings.PaperSources[i]; paperSources.Add(pkSource); } ///纸盒不为空,实体打印机默认设置纸盒序号0(主纸盒) if (paperSources.Count != 0) { printDocument.DefaultPageSettings.PaperSource = paperSources[0]; } if (PrintSettingsInfo.Copies <= printQueueWithUnicode.printQueue.GetPrintCapabilities().MaxCopyCount && PrintSettingsInfo.Copies > 0) { printDocument.PrinterSettings.Copies = (short)PrintSettingsInfo.Copies; } else if (PrintSettingsInfo.Copies > printQueueWithUnicode.printQueue.GetPrintCapabilities().MaxCopyCount) { PrintSettingsInfo.Copies = (int)printQueueWithUnicode.printQueue.GetPrintCapabilities().MaxCopyCount; } else { PrintSettingsInfo.Copies = 1; } posterPrintPaperIndex = 0; printDocument.PrintPage += PrintDocumentByCurrentSettings; printDocument.PrinterSettings.PrintFileName = PDFViewer.Document.FileName; try { printDocument.Print(); } catch { MessageBoxEx.Show("另一个进程正在占用该打印机或发生未知错误"); } finally { printDocument.Dispose(); } } } private void RecvLabel(LabelWithUnicode labelWithUnicode) { if (PrintSettingsInfo.PrintModInfo.EnumPrintMod == EnumPrintMod.StatusPoster) { var posterInfo = (PosterInfo)PrintSettingsInfo.PrintModInfo; posterInfo.Label = labelWithUnicode.Label.ToString(); PrintSettingsInfo.PrintModInfo = posterInfo; } } private Bitmap Crop(Bitmap src, Rectangle rectangle) { Bitmap targetBitmap = new Bitmap(rectangle.Width, rectangle.Height); using (Graphics g = Graphics.FromImage(targetBitmap)) { g.DrawImage(src, new Rectangle(0, 0, targetBitmap.Width, targetBitmap.Height), rectangle, GraphicsUnit.Pixel); } return targetBitmap; } #region 打印各个模式 private void PrintDocumentModSize(PrintPageEventArgs e) { ///Fix 13337 : ///打印的宽度和高度是1/100英寸 ///图片的宽度和高度是像素 ///假如打印机DPI宽高600,图片宽高600px ///那么用DrawImage打印图片的时候, 就会把图片600像素的宽,理解为了600百分之一英寸(6英寸),数值没变,只是单位的理解不一样 ///于是打印6英寸宽,需要跨度6*600DPI=3600像素, 但是图片本身只有600像素,于是就把图片的宽放大到3600像素,同理高也是这样,需要放大. ///放大以后的位图就会出现锯齿 ///所以如果要打印6英寸的一条线,DPI为600的情况下, 需要准备6 * 600 = 3600像素的线条,然后告诉打印机要打印的宽度是600(百分之一英寸) , 打印图像的3600像素, 元素图像的单位是像素. ///关键代码 e.Graphics.DrawImage(printBitmap, realBound, new Rectangle(0, 0, printBitmap.Width, printBitmap.Height), GraphicsUnit.Pixel); ///其他三个模式也一样 int widthDpiRatio; int heightDpiRatio; ///TODO 可扩展:高低分辨率打印 if (true) { widthDpiRatio = (int)e.Graphics.DpiX / 100; heightDpiRatio = (int)e.Graphics.DpiY / 100; } SizeInfo sizeInfo = (SizeInfo)PrintSettingsInfo.PrintModInfo; CPDFPage cPDFPage = PDFViewer.Document.PageAtIndex(PrintSettingsInfo.PageRangeList[PrintIndex]); Rectangle realBound = new Rectangle(documentSettingsInfo.margins.Left * widthDpiRatio, documentSettingsInfo.margins.Top * heightDpiRatio, e.PageBounds.Width - documentSettingsInfo.margins.Left - documentSettingsInfo.margins.Right, e.PageBounds.Height - documentSettingsInfo.margins.Top - documentSettingsInfo.margins.Bottom); System.Drawing.Point startPoint = new System.Drawing.Point(0, 0); blankPageBitmapForPrint = new Bitmap((int)documentSettingsInfo.DocumentWidth * widthDpiRatio, (int)documentSettingsInfo.DocumentHeight * heightDpiRatio); /////听说有效 ////e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; ////e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; ////e.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half; if (cPDFPage != null) { Bitmap printBitmap = new Bitmap((int)(float.Parse(PaperWidth)) * widthDpiRatio, (int)float.Parse(PaperHeight) * heightDpiRatio); Bitmap bitmap = ToolMethod.RenderPageBitmapNoWait(PDFViewer.Document, (int)(cPDFPage.PageSize.Width * PDFToMediaDpiRatio * widthDpiRatio), (int)(cPDFPage.PageSize.Height * PDFToMediaDpiRatio * heightDpiRatio), PrintSettingsInfo.PageRangeList[PrintIndex], PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (PrintSettingsInfo.IsGrayscale) { bitmap = ToGray(bitmap, 0); } ///< summary > /// 自适应模式 /// if (sizeInfo.EnumSizeType == EnumSizeType.StatusAdaptive) { int resizedHeight = 0; int resizedWidth = 0; ///重设大小 if ((float)bitmap.Height / (float)bitmap.Width >= (float.Parse(PaperHeight) / float.Parse(PaperWidth))) { resizedHeight = (int)(float.Parse(PaperHeight) * mmToDpiRatio) * widthDpiRatio; resizedWidth = (int)((float.Parse(PaperHeight) / bitmap.Height * bitmap.Width) * mmToDpiRatio) * heightDpiRatio; } else { resizedWidth = (int)(float.Parse(PaperWidth) * mmToDpiRatio) * widthDpiRatio; resizedHeight = (int)((float.Parse(PaperWidth) / bitmap.Width * bitmap.Height) * mmToDpiRatio) * heightDpiRatio; } /// 直接调整bitmap会引起内存问题,所以先这样处理.... Bitmap resizedBitmap = new Bitmap(bitmap, resizedWidth, resizedHeight); startPoint.X = (blankPageBitmapForPrint.Width - resizedWidth) / 2; startPoint.Y = (blankPageBitmapForPrint.Height - resizedHeight) / 2; printBitmap = CombineBitmap(blankPageBitmapForPrint, resizedBitmap, startPoint); resizedBitmap.Dispose(); if (IsManualDuplex && PrintIndex % 2 == 1 && sizeInfo.EnumDuplexPrintMod == EnumDuplexPrintMod.StatusFlipShortEdge) { printBitmap.RotateFlip(RotateFlipType.Rotate180FlipNone); } e.Graphics.DrawImage(printBitmap, realBound, new Rectangle(0, 0, printBitmap.Width, printBitmap.Height), GraphicsUnit.Pixel); } else if (sizeInfo.EnumSizeType == EnumSizeType.StatusActural) { startPoint.X = (blankPageBitmapForPrint.Width - bitmap.Width) / 2; startPoint.Y = (blankPageBitmapForPrint.Height - bitmap.Height) / 2; printBitmap = CombineBitmap(blankPageBitmapForPrint, bitmap, startPoint); if (IsManualDuplex && PrintIndex % 2 == 1 && sizeInfo.EnumDuplexPrintMod == EnumDuplexPrintMod.StatusFlipShortEdge) { printBitmap.RotateFlip(RotateFlipType.Rotate180FlipNone); } e.Graphics.DrawImage(printBitmap, realBound, new Rectangle(0, 0, printBitmap.Width, printBitmap.Height), GraphicsUnit.Pixel); } else if (sizeInfo.EnumSizeType == EnumSizeType.StatusCustomized) { bitmap = Resize(bitmap, (int)(bitmap.Width * (sizeInfo.DisplayRatio / 100.0)), (int)(bitmap.Height * (sizeInfo.DisplayRatio / 100.0))); startPoint.X = (blankPageBitmapForPrint.Width - bitmap.Width) / 2; startPoint.Y = (blankPageBitmapForPrint.Height - bitmap.Height) / 2; printBitmap = CombineBitmap(blankPageBitmapForPrint, bitmap, startPoint); if (IsManualDuplex && PrintIndex % 2 == 1 && sizeInfo.EnumDuplexPrintMod == EnumDuplexPrintMod.StatusFlipShortEdge) { printBitmap.RotateFlip(RotateFlipType.Rotate180FlipNone); } e.Graphics.DrawImage(printBitmap, realBound, new Rectangle(0, 0, printBitmap.Width, printBitmap.Height), GraphicsUnit.Pixel); } bitmap.Dispose(); printBitmap.Dispose(); blankPageBitmapForPrint.Dispose(); GC.Collect(); //手动双面打印,且页码不为1 if (IsManualDuplex && PrintSettingsInfo.PageRangeList.Count != 1) { if (PrintIndex < PrintedPageCount - 2) { PrintIndex += 2; e.HasMorePages = true; } else { e.HasMorePages = false; if (PrintIndex % 2 == 0) { this.printDocumentEvent.GetEvent().Publish(new FinishedFrontSide { Unicode = this.Unicode }); } } } //单面打印 else { if (PrintIndex < PrintedPageCount - 1) { PrintIndex++; e.HasMorePages = true; } else { e.HasMorePages = false; } } } } ///无论是拆分还是平铺,页面缩放比例都会在预览中完成 ///先渲染整图 ///得到effective域大小 ///根据effective的量和重叠量计算开始的bitmap ///加字和标记 ///字加在顶部,标记加在四角 ///结束后翻页 ///对于Tile页数不定,但是比例相等 ///对于split页数固定,但是比例变化 ///平铺模式: ///从第一页开始,先计算当前页总纸张数 ///根据纸张数打印 ///打印到位时页数进一 ///页数到顶,纸数到顶打印结束 ///当一页只有一张纸的时候,注意特殊处理 /// ///内存问题: ///1、只有每次翻页才重新取整张图。 ///取到的图片先不急着放大。 ///根据原图大小取得图片,并进行处理后,进行放大 ///再绘制到打印纸上 private void PrintDocumentModPoster(PrintPageEventArgs e) { PosterInfo posterInfo = (PosterInfo)PrintSettingsInfo.PrintModInfo; var pageBound = documentSettingsInfo.DocumentBounds; int widthDpiRatio; int heightDpiRatio; ///TODO 可扩展:高低分辨率打印 if (true) { //当前模式放大程度过高引发异常,暂时采用低质量打印 widthDpiRatio = (int)e.Graphics.DpiX / 100; heightDpiRatio = (int)e.Graphics.DpiY / 100; if (widthDpiRatio > 2) { widthDpiRatio = 2; heightDpiRatio = 2; } } double effectiveHeight; double effectiveWidth; double PreviewWidth; double PreviewHeight; System.Drawing.Point startPoint = new System.Drawing.Point(0, 0); ///计算有效打印区域 if (PrintSettingsInfo.EnumPrintOrientation == EnumPrintOrientation.StatusPortrait) { effectiveHeight = documentSettingsInfo.DocumentHeight; effectiveWidth = documentSettingsInfo.DocumentWidth; } else { effectiveHeight = documentSettingsInfo.DocumentWidth; effectiveWidth = documentSettingsInfo.DocumentHeight; } effectiveHeight -= 2 * posterInfo.OverLap * mmToDpiRatio; effectiveWidth -= 2 * posterInfo.OverLap * mmToDpiRatio; if (posterInfo.HasLabel || posterInfo.HasCutMarks) { effectiveHeight -= 40; effectiveWidth -= 40; } effectiveHeight *= heightDpiRatio; effectiveWidth *= widthDpiRatio; ///平铺模式下: if (posterInfo.EnumPosterMod == EnumPosterMod.StatusTile) { CPDFPage cPDFPage = PDFViewer.Document.PageAtIndex(PrintSettingsInfo.PageRangeList[posterPrintPaperIndex]); if (cPDFPage != null) { ///仅当每一页第一张纸打印时,进行一次渲染,,更换打印底图 if (HorizonPaperIndex == 0 && VerticalPaperIndex == 0) { PosterCurrentBitmap = ToolMethod.RenderPageBitmapNoWait(PDFViewer.Document, (int)(cPDFPage.PageSize.Width * PDFToMediaDpiRatio * (posterInfo.TileRatio / 100.0) * widthDpiRatio), (int)(cPDFPage.PageSize.Height * PDFToMediaDpiRatio * (posterInfo.TileRatio / 100.0) * heightDpiRatio), PrintSettingsInfo.PageRangeList[posterPrintPaperIndex], PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (PrintSettingsInfo.IsGrayscale) { PosterCurrentBitmap = ToGray(PosterCurrentBitmap, 0); } HorizonPaperCount = (int)Math.Ceiling((double)PosterCurrentBitmap.Width / effectiveWidth); VerticalPaperCount = (int)Math.Ceiling(((double)PosterCurrentBitmap.Height / effectiveHeight)); WholeCountSinglePage = HorizonPaperCount * VerticalPaperCount;//每一轮的总页数 if (WholeCountSinglePage != 0) { PreviewWidth = (double)(effectiveWidth * HorizonPaperCount); PreviewHeight = (double)(effectiveHeight * VerticalPaperCount); DisplayBitmap = new Bitmap((int)PreviewWidth, (int)PreviewHeight); } else { PreviewWidth = effectiveWidth; PreviewHeight = effectiveHeight; DisplayBitmap = new Bitmap((int)effectiveWidth, (int)effectiveHeight); } //取到和渲染一样的Bitmap startPoint.X = (int)((PreviewWidth - PosterCurrentBitmap.Width) / 2); startPoint.Y = (int)((PreviewHeight - PosterCurrentBitmap.Height) / 2); DisplayBitmap = CombineBitmap(DisplayBitmap, PosterCurrentBitmap, startPoint); } if (WholeCountSinglePage > 1) { /////当前页未打印完 if (HorizonPaperIndex * VerticalPaperIndex < WholeCountSinglePage - 1) { ///取有效尺寸和重叠,边沿合并 ///有效尺寸+重叠边 Rectangle rectangle = new Rectangle((int)(HorizonPaperIndex * effectiveWidth), (int)(VerticalPaperIndex * effectiveHeight), (int)effectiveWidth, (int)effectiveHeight); ///左重叠 if (HorizonPaperIndex != 0) { rectangle.Location = new System.Drawing.Point((int)(rectangle.Location.X - posterInfo.OverLap * mmToDpiRatio * widthDpiRatio), rectangle.Location.Y); } ///上重叠 if (VerticalPaperIndex != 0) { rectangle.Size = new System.Drawing.Size(rectangle.Size.Width, (int)(rectangle.Size.Height + posterInfo.OverLap * mmToDpiRatio * heightDpiRatio)); } ///右重叠 if (HorizonPaperIndex != HorizonPaperCount) { rectangle.Size = new System.Drawing.Size((int)(rectangle.Size.Width + posterInfo.OverLap * mmToDpiRatio * widthDpiRatio), rectangle.Size.Height); } ///下重叠 if (VerticalPaperIndex != VerticalPaperCount) { rectangle.Location = new System.Drawing.Point(rectangle.Location.X, (int)(rectangle.Location.Y - posterInfo.OverLap * mmToDpiRatio * heightDpiRatio)); } ///当存在边沿时 int margin = 0; ///Label和CutMarks /// if (posterInfo.HasLabel || posterInfo.HasCutMarks) { margin = 20; } if (posterInfo.HasLabel) { string sign = null; if (posterInfo.Label == null || posterInfo.Label == "") { sign = string.Format("({0},{1}) -{2} -{3}.pdf {4} {5}", HorizonPaperIndex + 1, VerticalPaperIndex + 1, PrintIndex + 1, PDFViewer.Document.FileName, System.DateTime.Today.ToString("yyyy/MM/dd"), System.DateTime.Now.ToString("HH:mm:ss")); } else { sign = posterInfo.Label; } e.Graphics.DrawString(sign, new Font("Helvetica", 10.0f), System.Drawing.Brushes.Black, margin + 5, 0); } if (posterInfo.HasCutMarks) { System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Black, 2); //除了四角之外都要添加裁切标记 if (!(HorizonPaperIndex == 0 && VerticalPaperIndex == 0)) { e.Graphics.DrawRectangle(pen, new Rectangle(-margin, -margin, 2 * margin, 2 * margin)); } if (!(HorizonPaperIndex == HorizonPaperCount - 1 && VerticalPaperIndex == 0)) { e.Graphics.DrawRectangle(pen, new Rectangle(pageBound.Width - margin, -margin, margin * 2, margin * 2)); } if (!(HorizonPaperIndex == 0 && VerticalPaperIndex == VerticalPaperCount - 1)) { e.Graphics.DrawRectangle(pen, new Rectangle(-margin, pageBound.Height - margin, margin * 2, margin * 2)); } if (!(HorizonPaperIndex == HorizonPaperCount - 1 && VerticalPaperIndex == VerticalPaperCount - 1)) { e.Graphics.DrawRectangle(pen, new Rectangle(pageBound.Width - margin, (int)pageBound.Height - margin, margin * 2, margin * 2)); } pen.Dispose(); } Bitmap currentPrintBitmap = Crop(DisplayBitmap, rectangle); e.Graphics.DrawImage(currentPrintBitmap, new Rectangle(margin, margin, pageBound.Width - 2 * margin, pageBound.Height - 2 * margin), new Rectangle(0, 0, currentPrintBitmap.Width, currentPrintBitmap.Height), GraphicsUnit.Pixel); currentPrintBitmap.Dispose(); } ///三种进位:当前列,当前行,当前页 if (HorizonPaperIndex < HorizonPaperCount - 1) { HorizonPaperIndex++; e.HasMorePages = true; } else if (VerticalPaperIndex < VerticalPaperCount - 1) { HorizonPaperIndex = 0; VerticalPaperIndex++; e.HasMorePages = true; } else if (posterPrintPaperIndex < PrintedPageCount - 1) { ///当前总文件未打印完 posterPrintPaperIndex++; PosterCurrentBitmap.Dispose(); DisplayBitmap.Dispose(); GC.Collect(); GC.WaitForPendingFinalizers(); HorizonPaperIndex = 0; VerticalPaperIndex = 0; e.HasMorePages = true; } else { HorizonPaperIndex = 0; VerticalPaperIndex = 0; e.HasMorePages = false; } } //当一页只有一张打印纸的时候 else { e.Graphics.DrawImage(DisplayBitmap, new Rectangle(0, 0, pageBound.Width, pageBound.Height), new Rectangle(0, 0, DisplayBitmap.Width, DisplayBitmap.Height), GraphicsUnit.Pixel); if (posterPrintPaperIndex < PrintedPageCount - 1) { ///当前总文件未打印完 posterPrintPaperIndex++; PosterCurrentBitmap.Dispose(); DisplayBitmap.Dispose(); GC.Collect(); GC.WaitForPendingFinalizers(); HorizonPaperIndex = 0; VerticalPaperIndex = 0; e.HasMorePages = true; } else { e.HasMorePages = false; } } } } /// 拆分模式 /// 该模式下 /// 渲染图片到指定大小 /// 直接计算所有需要打印的纸张数 /// 计算单页打印的纸张数 /// 进位 /// 根据当前水平垂直序号裁切图片 /// 继续打印表征:当前纸张序号小于总计纸张序号 else { int wholeCountSinglePage = posterInfo.HorizontalSheetNumber * posterInfo.VerticalSheetNumber;//每一轮的总页数 WholePaperCountModPoster = wholeCountSinglePage * PrintedPageCount;//总计打印纸数 int PrintPageIndex = PrintIndex / wholeCountSinglePage;//当前打印纸张所在海报页 从0开始 int PrintIndexInCurrentPage = PrintIndex % wholeCountSinglePage;//当前海报页中,打印纸的序号 从0开始 HorizonPaperIndex = PrintIndexInCurrentPage % HorizonPaperCount;//行中的第几个 VerticalPaperIndex = PrintIndexInCurrentPage / HorizonPaperCount;//第几行 CPDFPage cPDFPage = PDFViewer.Document.PageAtIndex(PrintSettingsInfo.PageRangeList[PrintPageIndex]);//取得当前海报页 PreviewWidth = (double)(effectiveWidth * HorizonPaperCount); PreviewHeight = (double)(effectiveHeight * VerticalPaperCount); DisplayBitmap = new Bitmap((int)PreviewWidth, (int)PreviewHeight); double resizedHeight = 0; double resizedWidth = 0; if ((cPDFPage.PageSize.Height / cPDFPage.PageSize.Width) >= PreviewHeight / PreviewWidth) { resizedHeight = PreviewHeight; resizedWidth = PreviewHeight / cPDFPage.PageSize.Height * cPDFPage.PageSize.Width; } else { resizedWidth = PreviewWidth; resizedHeight = PreviewWidth / cPDFPage.PageSize.Width * cPDFPage.PageSize.Height; } if ((HorizonPaperIndex == 0 && VerticalPaperIndex == 0) || HorizonPaperCount * VerticalPaperCount == 1) { PosterCurrentBitmap = ToolMethod.RenderPageBitmapNoWait(PDFViewer.Document, (int)resizedWidth, (int)resizedHeight, PrintSettingsInfo.PageRangeList[PrintPageIndex], PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); } startPoint.X = (int)((PreviewWidth - PosterCurrentBitmap.Width) / 2); startPoint.Y = (int)((PreviewHeight - PosterCurrentBitmap.Height) / 2); if (PrintSettingsInfo.IsGrayscale) { PosterCurrentBitmap = ToGray(PosterCurrentBitmap, 0); } DisplayBitmap = CombineBitmap(DisplayBitmap, PosterCurrentBitmap, startPoint); ///取有效尺寸和重叠,边沿合并 ///有效尺寸+重叠边 Rectangle rectangle = new Rectangle((int)(HorizonPaperIndex * effectiveWidth), (int)(VerticalPaperIndex * effectiveHeight), (int)effectiveWidth, (int)effectiveHeight); ///左重叠 if (HorizonPaperIndex != 0) { rectangle.Location = new System.Drawing.Point((int)(rectangle.Location.X - posterInfo.OverLap * mmToDpiRatio * widthDpiRatio), rectangle.Location.Y); } ///上重叠 if (VerticalPaperIndex != 0) { rectangle.Size = new System.Drawing.Size(rectangle.Size.Width, (int)(rectangle.Size.Height + posterInfo.OverLap * mmToDpiRatio * heightDpiRatio)); } ///右重叠 if (HorizonPaperIndex != HorizonPaperCount) { rectangle.Size = new System.Drawing.Size((int)(rectangle.Size.Width + posterInfo.OverLap * mmToDpiRatio * widthDpiRatio), rectangle.Size.Height); } ///下重叠 if (VerticalPaperIndex != VerticalPaperCount) { rectangle.Location = new System.Drawing.Point(rectangle.Location.X, (int)(rectangle.Location.Y - posterInfo.OverLap * mmToDpiRatio * heightDpiRatio)); } ///当存在边沿时 int margin = 0; ///Label和CutMarks /// if (posterInfo.HasLabel || posterInfo.HasCutMarks) { margin = 20; } if (posterInfo.HasLabel) { string sign = null; if (posterInfo.Label == null || posterInfo.Label == "") { ///Fix 13366: (行、列)文件名 时间 日期) sign = string.Format("({0},{1}) -{2} -{3}.pdf {4} {5}", HorizonPaperIndex + 1, VerticalPaperIndex + 1, PrintIndex + 1, PDFViewer.Document.FileName, System.DateTime.Today.ToString("yyyy/MM/dd"), System.DateTime.Now.ToString("HH:mm:ss")); } else { sign = posterInfo.Label; } e.Graphics.DrawString(sign, new Font("Helvetica", 10.0f), System.Drawing.Brushes.Black, margin + 5, 0); } if (posterInfo.HasCutMarks) { System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Black, 2); //除了四角之外都要添加裁切标记 if (!(HorizonPaperIndex == 0 && VerticalPaperIndex == 0)) { e.Graphics.DrawRectangle(pen, new Rectangle(-margin, -margin, 2 * margin, 2 * margin)); } if (!(HorizonPaperIndex == HorizonPaperCount - 1 && VerticalPaperIndex == 0)) { e.Graphics.DrawRectangle(pen, new Rectangle(pageBound.Width - margin, -margin, margin * 2, margin * 2)); } if (!(HorizonPaperIndex == 0 && VerticalPaperIndex == VerticalPaperCount - 1)) { e.Graphics.DrawRectangle(pen, new Rectangle(-margin, (int)pageBound.Height - margin, margin * 2, margin * 2)); } if (!(HorizonPaperIndex == HorizonPaperCount - 1 && VerticalPaperIndex == VerticalPaperCount - 1)) { e.Graphics.DrawRectangle(pen, new Rectangle(pageBound.Width - margin, (int)pageBound.Height - margin, margin * 2, margin * 2)); } pen.Dispose(); } Bitmap currentPrintBitmap = Crop(DisplayBitmap, rectangle); e.Graphics.DrawImage(currentPrintBitmap, new Rectangle(margin, margin, pageBound.Width - 2 * margin, pageBound.Height - 2 * margin), new Rectangle(0, 0, currentPrintBitmap.Width, currentPrintBitmap.Height), GraphicsUnit.Pixel); currentPrintBitmap.Dispose(); if (PrintIndex < WholePaperCountModPoster - 1) { PrintIndex++; if (PrintIndex % wholeCountSinglePage == 0) { PosterCurrentBitmap.Dispose(); DisplayBitmap.Dispose(); GC.Collect(); GC.WaitForPendingFinalizers(); } e.HasMorePages = true; } else { e.HasMorePages = false; } } } /// /// 优化内存的小册子模式 /// /// private void PrintDocumentModMultiple(PrintPageEventArgs e) { MultipleInfo multipleInfo = (MultipleInfo)PrintSettingsInfo.PrintModInfo; int widthDpiRatio; int heightDpiRatio; ///TODO 可扩展:高低分辨率打印 if (true) { widthDpiRatio = (int)e.Graphics.DpiX / 100; heightDpiRatio = (int)e.Graphics.DpiY / 100; } int singlePageHeight; int singlePageWidth; ///打印纸实际上可画范围 Rectangle realBound = new Rectangle(documentSettingsInfo.margins.Left, documentSettingsInfo.margins.Top, e.PageBounds.Width - documentSettingsInfo.margins.Left - documentSettingsInfo.margins.Right, e.PageBounds.Height - documentSettingsInfo.margins.Top - documentSettingsInfo.margins.Bottom); ///每一个PDF页实际可用的范围 singlePageHeight = realBound.Height / multipleInfo.VerticalPageNumber; singlePageWidth = realBound.Width / multipleInfo.HorizontalPageNumber; ///起画点 System.Drawing.Point startPoint = new System.Drawing.Point(0, 0); int currentPage = 0; int startPage = PrintSettingsInfo.PageRangeList[PrintIndex * (multipleInfo.VerticalPageNumber) * (multipleInfo.HorizontalPageNumber)]; int resizedHeight = 0; int resizedWidth = 0; bool isNoSrcPage = false; Bitmap pageBitmap; ///水平 if (multipleInfo.EnumPageOrder == EnumPageOrder.StatusHorizontalOrder || multipleInfo.EnumPageOrder == EnumPageOrder.StatusHorizontalReverseOrder) { for (int tempVerticalIndex = 0; tempVerticalIndex < multipleInfo.VerticalPageNumber; tempVerticalIndex++) { startPoint.Y = tempVerticalIndex * singlePageHeight; for (int tempHorizontalIndex = 0; tempHorizontalIndex < multipleInfo.HorizontalPageNumber; tempHorizontalIndex++) { try { currentPage = PrintSettingsInfo.PageRangeList[PrintIndex * (multipleInfo.VerticalPageNumber) * (multipleInfo.HorizontalPageNumber) + (tempVerticalIndex * multipleInfo.HorizontalPageNumber) + tempHorizontalIndex]; } catch { //当前文档打印结束 break; } //横向 if (multipleInfo.EnumPageOrder == EnumPageOrder.StatusHorizontalOrder) { startPoint.X = tempHorizontalIndex * singlePageWidth; } //横向倒序 else { startPoint.X = (multipleInfo.HorizontalPageNumber - tempHorizontalIndex - 1) * singlePageWidth; } CPDFPage cPDFPage = PDFViewer.Document.PageAtIndex(currentPage); if (cPDFPage == null) { isNoSrcPage = true; break; } ///这些渲染都使用WidthDpi ///防止横竖Dpi不同引发图片拉伸 pageBitmap = ToolMethod.RenderPageBitmapNoWait(PDFViewer.Document, (int)(cPDFPage.PageSize.Width * widthDpiRatio), (int)(cPDFPage.PageSize.Height * widthDpiRatio), currentPage, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (multipleInfo.IsAutoRotate) { if ((cPDFPage.PageSize.Height / cPDFPage.PageSize.Width > 1 && (double)singlePageHeight / singlePageWidth < 1) || (cPDFPage.PageSize.Height / cPDFPage.PageSize.Width < 1 && (double)singlePageHeight / singlePageWidth > 1)) { pageBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); } } ///重设大小 ///计算出应有的大小,但是不马上应用 if ((float)pageBitmap.Height / (float)pageBitmap.Width >= ((float)singlePageHeight / (float)singlePageWidth)) { resizedHeight = (int)(singlePageHeight * 0.96); resizedWidth = (int)((float)singlePageHeight / pageBitmap.Height * pageBitmap.Width * 0.96); } else { resizedWidth = (int)(singlePageWidth * 0.96); resizedHeight = (int)((float)singlePageWidth / pageBitmap.Width * pageBitmap.Height * 0.96); } startPoint.X += (singlePageWidth - resizedWidth) / 2; startPoint.Y += (singlePageHeight - resizedHeight) / 2; if (PrintSettingsInfo.IsGrayscale) { pageBitmap = ToGray(pageBitmap, 0); } e.Graphics.DrawImage(pageBitmap, new Rectangle(realBound.X + startPoint.X, realBound.Y + startPoint.Y, resizedWidth, resizedHeight), new Rectangle(0, 0, pageBitmap.Width, pageBitmap.Height), GraphicsUnit.Pixel); //绘制边界 if (PrintSettingsInfo.IsPrintPageBorde) { System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Black, 2); e.Graphics.DrawRectangle(pen, new Rectangle(realBound.X + startPoint.X - 2, realBound.Y + startPoint.Y - 2, resizedWidth + 4, resizedHeight + 4)); pen.Dispose(); } pageBitmap.Dispose(); startPoint.Y -= (singlePageHeight - resizedHeight) / 2; } if (isNoSrcPage) { isNoSrcPage = false; break; } } } ///垂直 else { for (int tempHorizontalIndex = 0; tempHorizontalIndex < multipleInfo.HorizontalPageNumber; tempHorizontalIndex++) { //纵向,垂直排列时先移位 if (multipleInfo.EnumPageOrder == EnumPageOrder.StatusVerticalOrder) { startPoint.X = tempHorizontalIndex * singlePageWidth; } //纵向倒序 else { startPoint.X = (multipleInfo.HorizontalPageNumber - tempHorizontalIndex - 1) * singlePageWidth; } for (int tempVerticalIndex = 0; tempVerticalIndex < multipleInfo.VerticalPageNumber; tempVerticalIndex++) { startPoint.Y = tempVerticalIndex * singlePageHeight; try { currentPage = PrintSettingsInfo.PageRangeList[PrintIndex * (multipleInfo.VerticalPageNumber) * (multipleInfo.HorizontalPageNumber) + (tempHorizontalIndex * multipleInfo.VerticalPageNumber) + tempVerticalIndex]; } catch { break; } CPDFPage cPDFPage = PDFViewer.Document.PageAtIndex(currentPage); if (cPDFPage == null) { isNoSrcPage = true; break; } pageBitmap = ToolMethod.RenderPageBitmapNoWait(PDFViewer.Document, (int)(cPDFPage.PageSize.Width * widthDpiRatio), (int)(cPDFPage.PageSize.Height * widthDpiRatio), currentPage, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (multipleInfo.IsAutoRotate) { if ((cPDFPage.PageSize.Height / cPDFPage.PageSize.Width > 1 && (double)singlePageHeight / singlePageWidth < 1) || (cPDFPage.PageSize.Height / cPDFPage.PageSize.Width < 1 && (double)singlePageHeight / singlePageWidth > 1)) { pageBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); } } ///重设大小 ///计算出应有的大小,但是不马上应用 if ((float)pageBitmap.Height / (float)pageBitmap.Width >= ((float)singlePageHeight / (float)singlePageWidth)) { resizedHeight = (int)(singlePageHeight * 0.96); resizedWidth = (int)((float)singlePageHeight / pageBitmap.Height * pageBitmap.Width * 0.96); } else { resizedWidth = (int)(singlePageWidth * 0.96); resizedHeight = (int)((float)singlePageWidth / pageBitmap.Width * pageBitmap.Height * 0.96); } startPoint.X += (singlePageWidth - resizedWidth) / 2; startPoint.Y += (singlePageHeight - resizedHeight) / 2; if (PrintSettingsInfo.IsGrayscale) { pageBitmap = ToGray(pageBitmap, 0); } e.Graphics.DrawImage(pageBitmap, new Rectangle(realBound.X + startPoint.X, realBound.Y + startPoint.Y, resizedWidth, resizedHeight), new Rectangle(0, 0, pageBitmap.Width, pageBitmap.Height), GraphicsUnit.Pixel); //绘制边界 if (PrintSettingsInfo.IsPrintPageBorde) { System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Black, 2); e.Graphics.DrawRectangle(pen, new Rectangle(realBound.X + startPoint.X - 2, realBound.Y + startPoint.Y - 2, resizedWidth + 4, resizedHeight + 4)); pen.Dispose(); } pageBitmap.Dispose(); startPoint.X -= (singlePageWidth - resizedWidth) / 2; } if (isNoSrcPage) { isNoSrcPage = false; break; } } if (IsManualDuplex && PrintIndex % 2 == 1 && multipleInfo.EnumDuplexPrintMod == EnumDuplexPrintMod.StatusFlipShortEdge) { } if (IsManualDuplex) { if (PrintIndex < PrintedPageCount - 2) { PrintIndex += 2; e.HasMorePages = true; } else { e.HasMorePages = false; if (PrintIndex % 2 == 0) { this.printDocumentEvent.GetEvent().Publish(new FinishedFrontSide { Unicode = this.Unicode }); } } } //单面打印 else { if (PrintIndex < PrintedPageCount - 1) { PrintIndex++; e.HasMorePages = true; } else { e.HasMorePages = false; } } } } private void PrintDocumentModBooklet(PrintPageEventArgs e) { BookletInfo bookletInfo = (BookletInfo)PrintSettingsInfo.PrintModInfo; int widthDpiRatio; int heightDpiRatio; ///TODO 可扩展:高低分辨率打印 if (true) { widthDpiRatio = (int)e.Graphics.DpiX / 100; heightDpiRatio = (int)e.Graphics.DpiY / 100; } Bitmap printBitmap; Rectangle realBound = new Rectangle(documentSettingsInfo.margins.Left, documentSettingsInfo.margins.Top, e.PageBounds.Width - documentSettingsInfo.margins.Left - documentSettingsInfo.margins.Right, e.PageBounds.Height - documentSettingsInfo.margins.Top - documentSettingsInfo.margins.Bottom); double singlePageHeight; double singlePageWidth; if (PrintSettingsInfo.EnumPrintOrientation == EnumPrintOrientation.StatusPortrait) { singlePageHeight = (double)documentSettingsInfo.DocumentHeight; singlePageWidth = (double)(documentSettingsInfo.DocumentWidth / 2); } else { singlePageHeight = (double)documentSettingsInfo.DocumentWidth; singlePageWidth = (double)(documentSettingsInfo.DocumentHeight / 2); } System.Drawing.Point startPoint = new System.Drawing.Point(0, 0); int maxPaperNumber = (PDFViewer.Document.PageCount % 4 == 0) ? (PDFViewer.Document.PageCount / 4) : (PDFViewer.Document.PageCount / 4 + 1); Bitmap leftBitmap = null; Bitmap rightBitmap = null; int resizedHeight = 0; int resizedWidth = 0; CPDFPage leftPage = null; CPDFPage rightPage = null; int leftPageIndex = 0; int rightPageIndex = 0; /// ///左装订与右装订顺序相反 ///左装订: /// if (bookletInfo.EnumBookletBinding == EnumBookletBinding.StatusLeft) { ///奇数页: ///右面为页面序号 ///左面为[(总打印纸数*4)+1-打印页右侧页序号] if ((TargetPaperList[PrintIndex + 1] + 1) % 2 == 1) { try { leftPageIndex = PrintSettingsInfo.PageRangeList[maxPaperNumber * 4 - TargetPaperList[PrintIndex + 1] - 1]; leftPage = PDFViewer.Document.PageAtIndex(leftPageIndex); } catch { leftPage = null; } //左面 if (leftPage != null) { leftBitmap = ToolMethod.RenderPageBitmapNoWait(PDFViewer.Document, (int)leftPage.PageSize.Width, (int)leftPage.PageSize.Height, leftPageIndex, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (bookletInfo.IsAutoRotate) { if ((leftPage.PageSize.Height / leftPage.PageSize.Width > 1 && (double)singlePageHeight / singlePageWidth < 1) || (leftPage.PageSize.Height / leftPage.PageSize.Width < 1 && (double)singlePageHeight / singlePageWidth > 1)) { leftBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); } } ///重设大小 if (((float)leftBitmap.Height / leftBitmap.Width) >= singlePageHeight / singlePageWidth) { resizedHeight = (int)(singlePageHeight * 0.96); resizedWidth = (int)(singlePageHeight / leftBitmap.Height * leftBitmap.Width * 0.96); } else { resizedWidth = (int)(singlePageWidth * 0.96); resizedHeight = (int)(singlePageWidth / leftBitmap.Width * leftBitmap.Height * 0.96); } startPoint.X = (int)(singlePageWidth - resizedWidth) / 2; startPoint.Y = (int)(singlePageHeight - resizedHeight) / 2; if (PrintSettingsInfo.IsGrayscale) { leftBitmap = ToGray(leftBitmap, 0); } e.Graphics.DrawImage(leftBitmap, new Rectangle(realBound.X + startPoint.X, realBound.Y + startPoint.Y, resizedWidth, resizedHeight), new Rectangle(0, 0, leftBitmap.Width, leftBitmap.Height), GraphicsUnit.Pixel); if (PrintSettingsInfo.IsPrintPageBorde) { System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Black, 2); e.Graphics.DrawRectangle(pen, new Rectangle(realBound.X + startPoint.X - 2, realBound.Y + startPoint.Y - 2, resizedWidth + 4, resizedHeight + 4)); pen.Dispose(); } } ///右面 /// try { rightPageIndex = PrintSettingsInfo.PageRangeList[TargetPaperList[PrintIndex + 1]]; rightPage = PDFViewer.Document.PageAtIndex(rightPageIndex); } catch { rightPage = null; rightPage = null; } if (rightPage != null) { startPoint.X = (int)singlePageWidth; rightBitmap = ToolMethod.RenderPageBitmapNoWait(PDFViewer.Document, (int)rightPage.PageSize.Width * widthDpiRatio, (int)rightPage.PageSize.Height * heightDpiRatio, rightPageIndex, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (bookletInfo.IsAutoRotate) { if ((rightPage.PageSize.Height / rightPage.PageSize.Width > 1 && (double)singlePageHeight / singlePageWidth < 1) || (rightPage.PageSize.Height / rightPage.PageSize.Width < 1 && (double)singlePageHeight / singlePageWidth > 1)) { rightBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); } } ///重设大小 if (((float)rightBitmap.Height / rightBitmap.Width) >= singlePageHeight / singlePageWidth) { resizedHeight = (int)(singlePageHeight * 0.96); resizedWidth = (int)(singlePageHeight / rightBitmap.Height * rightBitmap.Width * 0.96); } else { resizedWidth = (int)(singlePageWidth * 0.96); resizedHeight = (int)(singlePageWidth / rightBitmap.Width * rightBitmap.Height * 0.96); } startPoint.X += (int)(singlePageWidth - resizedWidth) / 2; startPoint.Y = (int)(singlePageHeight - resizedHeight) / 2; if (PrintSettingsInfo.IsGrayscale) { rightBitmap = ToGray(leftBitmap, 0); } e.Graphics.DrawImage(rightBitmap, new Rectangle(realBound.X + startPoint.X, realBound.Y + startPoint.Y, resizedWidth, resizedHeight), new Rectangle(0, 0, rightBitmap.Width, rightBitmap.Height), GraphicsUnit.Pixel); if (PrintSettingsInfo.IsPrintPageBorde) { System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Black, 2); e.Graphics.DrawRectangle(pen, new Rectangle(realBound.X + startPoint.X - 2, realBound.Y + startPoint.Y - 2, resizedWidth + 4, resizedHeight + 4)); pen.Dispose(); } } } ///偶数页 else { ///左侧 try { leftPageIndex = PrintSettingsInfo.PageRangeList[TargetPaperList[PrintIndex + 1]]; leftPage = PDFViewer.Document.PageAtIndex(leftPageIndex); } catch { leftPage = null; } if (leftPage != null) { leftBitmap = ToolMethod.RenderPageBitmapNoWait(PDFViewer.Document, (int)leftPage.PageSize.Width * widthDpiRatio, (int)leftPage.PageSize.Height * heightDpiRatio, leftPageIndex, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (bookletInfo.IsAutoRotate) { if ((leftPage.PageSize.Height / leftPage.PageSize.Width > 1 && (double)singlePageHeight / singlePageWidth < 1) || (leftPage.PageSize.Height / leftPage.PageSize.Width < 1 && (double)singlePageHeight / singlePageWidth > 1)) { leftBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); } } ///重设大小 if (((float)leftBitmap.Height / leftBitmap.Width) >= singlePageHeight / singlePageWidth) { resizedHeight = (int)(singlePageHeight * 0.96); resizedWidth = (int)(singlePageHeight / leftBitmap.Height * leftBitmap.Width * 0.96); } else { resizedWidth = (int)(singlePageWidth * 0.96); resizedHeight = (int)(singlePageWidth / leftBitmap.Width * leftBitmap.Height * 0.96); } startPoint.X = (int)(singlePageWidth - resizedWidth) / 2; startPoint.Y = (int)(singlePageHeight - resizedHeight) / 2; if (PrintSettingsInfo.IsGrayscale) { leftBitmap = ToGray(leftBitmap, 0); } e.Graphics.DrawImage(leftBitmap, new Rectangle(realBound.X + startPoint.X, realBound.Y + startPoint.Y, resizedWidth, resizedHeight), new Rectangle(0, 0, leftBitmap.Width, leftBitmap.Height), GraphicsUnit.Pixel); if (PrintSettingsInfo.IsPrintPageBorde) { System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Black, 2); e.Graphics.DrawRectangle(pen, new Rectangle(realBound.X + startPoint.X - 2, realBound.Y + startPoint.Y - 2, resizedWidth + 4, resizedHeight + 4)); pen.Dispose(); } } //右面 try { rightPageIndex = PrintSettingsInfo.PageRangeList[maxPaperNumber * 4 - TargetPaperList[PrintIndex + 1] - 1]; rightPage = PDFViewer.Document.PageAtIndex(rightPageIndex); } catch { rightPage = null; } if (rightPage != null) { startPoint.X = (int)singlePageWidth; rightBitmap = ToolMethod.RenderPageBitmapNoWait(PDFViewer.Document, (int)rightPage.PageSize.Width, (int)rightPage.PageSize.Height, rightPageIndex, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (bookletInfo.IsAutoRotate) { if ((rightPage.PageSize.Height / rightPage.PageSize.Width > 1 && (double)singlePageHeight / singlePageWidth < 1) || (rightPage.PageSize.Height / rightPage.PageSize.Width < 1 && (double)singlePageHeight / singlePageWidth > 1)) { rightBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); } } ///重设大小 if (((float)rightBitmap.Height / rightBitmap.Width) >= singlePageHeight / singlePageWidth) { resizedHeight = (int)(singlePageHeight * 0.96); resizedWidth = (int)(singlePageHeight / rightBitmap.Height * rightBitmap.Width * 0.96); } else { resizedWidth = (int)(singlePageWidth * 0.96); resizedHeight = (int)(singlePageWidth / rightBitmap.Width * rightBitmap.Height * 0.96); } startPoint.X += (int)(singlePageWidth - resizedWidth) / 2; startPoint.Y = (int)(singlePageHeight - resizedHeight) / 2; if (PrintSettingsInfo.IsGrayscale) { rightBitmap = ToGray(rightBitmap, 0); } e.Graphics.DrawImage(rightBitmap, new Rectangle(realBound.X + startPoint.X, realBound.Y + startPoint.Y, resizedWidth, resizedHeight), new Rectangle(0, 0, rightBitmap.Width, rightBitmap.Height), GraphicsUnit.Pixel); if (PrintSettingsInfo.IsPrintPageBorde) { System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Black, 2); e.Graphics.DrawRectangle(pen, new Rectangle(realBound.X + startPoint.X - 2, realBound.Y + startPoint.Y - 2, resizedWidth + 4, resizedHeight + 4)); pen.Dispose(); } } } } ///右装订 else { if ((TargetPaperList[PrintIndex + 1] + 1) % 2 == 1) { try { rightPageIndex = PrintSettingsInfo.PageRangeList[maxPaperNumber * 4 - TargetPaperList[PrintIndex + 1] - 1]; rightPage = PDFViewer.Document.PageAtIndex(rightPageIndex); } catch { rightPage = null; } //左面 if (rightPage != null) { startPoint.X = (int)singlePageWidth; rightBitmap = ToolMethod.RenderPageBitmapNoWait(PDFViewer.Document, (int)rightPage.PageSize.Width, (int)rightPage.PageSize.Height, rightPageIndex, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (bookletInfo.IsAutoRotate) { if ((rightPage.PageSize.Height / rightPage.PageSize.Width > 1 && (double)singlePageHeight / singlePageWidth < 1) || (rightPage.PageSize.Height / rightPage.PageSize.Width < 1 && (double)singlePageHeight / singlePageWidth > 1)) { rightBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); } } ///重设大小 if (((float)rightBitmap.Height / rightBitmap.Width) >= singlePageHeight / singlePageWidth) { resizedHeight = (int)(singlePageHeight * 0.96); resizedWidth = (int)(singlePageHeight / rightBitmap.Height * rightBitmap.Width * 0.96); } else { resizedWidth = (int)(singlePageWidth * 0.96); resizedHeight = (int)(singlePageWidth / rightBitmap.Width * rightBitmap.Height * 0.96); } startPoint.X += (int)(singlePageWidth - resizedWidth) / 2; startPoint.Y = (int)(singlePageHeight - resizedHeight) / 2; if (PrintSettingsInfo.IsGrayscale) { rightBitmap = ToGray(rightBitmap, 0); } e.Graphics.DrawImage(rightBitmap, new Rectangle(realBound.X + startPoint.X, realBound.Y + startPoint.Y, resizedWidth, resizedHeight), new Rectangle(0, 0, rightBitmap.Width, rightBitmap.Height), GraphicsUnit.Pixel); if (PrintSettingsInfo.IsPrintPageBorde) { System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Black, 2); e.Graphics.DrawRectangle(pen, new Rectangle(realBound.X + startPoint.X - 2, realBound.Y + startPoint.Y - 2, resizedWidth + 4, resizedHeight + 4)); pen.Dispose(); } } ///右面 /// try { leftPageIndex = PrintSettingsInfo.PageRangeList[TargetPaperList[PrintIndex + 1]]; leftPage = PDFViewer.Document.PageAtIndex(leftPageIndex); } catch { leftPage = null; leftPage = null; } if (leftPage != null) { leftBitmap = ToolMethod.RenderPageBitmapNoWait(PDFViewer.Document, (int)leftPage.PageSize.Width * widthDpiRatio, (int)leftPage.PageSize.Height * heightDpiRatio, leftPageIndex, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (bookletInfo.IsAutoRotate) { if ((leftPage.PageSize.Height / leftPage.PageSize.Width > 1 && (double)singlePageHeight / singlePageWidth < 1) || (leftPage.PageSize.Height / leftPage.PageSize.Width < 1 && (double)singlePageHeight / singlePageWidth > 1)) { leftBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); } } ///重设大小 if (((float)leftBitmap.Height / leftBitmap.Width) >= singlePageHeight / singlePageWidth) { resizedHeight = (int)(singlePageHeight * 0.96); resizedWidth = (int)(singlePageHeight / leftBitmap.Height * leftBitmap.Width * 0.96); } else { resizedWidth = (int)(singlePageWidth * 0.96); resizedHeight = (int)(singlePageWidth / leftBitmap.Width * leftBitmap.Height * 0.96); } startPoint.X = (int)(singlePageWidth - resizedWidth) / 2; startPoint.Y = (int)(singlePageHeight - resizedHeight) / 2; if (PrintSettingsInfo.IsGrayscale) { leftBitmap = ToGray(leftBitmap, 0); } e.Graphics.DrawImage(leftBitmap, new Rectangle(realBound.X + startPoint.X, realBound.Y + startPoint.Y, resizedWidth, resizedHeight), new Rectangle(0, 0, leftBitmap.Width, leftBitmap.Height), GraphicsUnit.Pixel); if (PrintSettingsInfo.IsPrintPageBorde) { System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Black, 2); e.Graphics.DrawRectangle(pen, new Rectangle(realBound.X + startPoint.X - 2, realBound.Y + startPoint.Y - 2, resizedWidth + 4, resizedHeight + 4)); pen.Dispose(); } } } ///偶数页 else { try { rightPageIndex = PrintSettingsInfo.PageRangeList[TargetPaperList[PrintIndex + 1]]; rightPage = PDFViewer.Document.PageAtIndex(rightPageIndex); } catch { rightPage = null; } if (rightPage != null) { startPoint.X = (int)singlePageWidth; rightBitmap = ToolMethod.RenderPageBitmapNoWait(PDFViewer.Document, (int)rightPage.PageSize.Width * widthDpiRatio, (int)rightPage.PageSize.Height * heightDpiRatio, rightPageIndex, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (bookletInfo.IsAutoRotate) { if ((rightPage.PageSize.Height / rightPage.PageSize.Width > 1 && (double)singlePageHeight / singlePageWidth < 1) || (rightPage.PageSize.Height / rightPage.PageSize.Width < 1 && (double)singlePageHeight / singlePageWidth > 1)) { rightBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); } } ///重设大小 if (((float)rightBitmap.Height / rightBitmap.Width) >= singlePageHeight / singlePageWidth) { resizedHeight = (int)(singlePageHeight * 0.96); resizedWidth = (int)(singlePageHeight / rightBitmap.Height * rightBitmap.Width * 0.96); } else { resizedWidth = (int)(singlePageWidth * 0.96); resizedHeight = (int)(singlePageWidth / rightBitmap.Width * rightBitmap.Height * 0.96); } startPoint.X += (int)(singlePageWidth - resizedWidth) / 2; startPoint.Y = (int)(singlePageHeight - resizedHeight) / 2; if (PrintSettingsInfo.IsGrayscale) { rightBitmap = ToGray(rightBitmap, 0); } e.Graphics.DrawImage(rightBitmap, new Rectangle(realBound.X + startPoint.X, realBound.Y + startPoint.Y, resizedWidth, resizedHeight), new Rectangle(0, 0, rightBitmap.Width, rightBitmap.Height), GraphicsUnit.Pixel); if (PrintSettingsInfo.IsPrintPageBorde) { System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Black, 2); e.Graphics.DrawRectangle(pen, new Rectangle(realBound.X + startPoint.X - 2, realBound.Y + startPoint.Y - 2, resizedWidth + 4, resizedHeight + 4)); pen.Dispose(); } } try { leftPageIndex = PrintSettingsInfo.PageRangeList[maxPaperNumber * 4 - TargetPaperList[PrintIndex + 1] - 1]; leftPage = PDFViewer.Document.PageAtIndex(leftPageIndex); } catch { leftPage = null; } if (leftPage != null) { leftBitmap = ToolMethod.RenderPageBitmapNoWait(PDFViewer.Document, (int)leftPage.PageSize.Width, (int)leftPage.PageSize.Height, leftPageIndex, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (bookletInfo.IsAutoRotate) { if ((leftPage.PageSize.Height / leftPage.PageSize.Width > 1 && (double)singlePageHeight / singlePageWidth < 1) || (leftPage.PageSize.Height / leftPage.PageSize.Width < 1 && (double)singlePageHeight / singlePageWidth > 1)) { leftBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); } } ///重设大小 if (((float)leftBitmap.Height / leftBitmap.Width) >= singlePageHeight / singlePageWidth) { resizedHeight = (int)(singlePageHeight * 0.96); resizedWidth = (int)(singlePageHeight / leftBitmap.Height * leftBitmap.Width * 0.96); } else { resizedWidth = (int)(singlePageWidth * 0.96); resizedHeight = (int)(singlePageWidth / leftBitmap.Width * leftBitmap.Height * 0.96); } startPoint.X = (int)(singlePageWidth - resizedWidth) / 2; startPoint.Y = (int)(singlePageHeight - resizedHeight) / 2; if (PrintSettingsInfo.IsGrayscale) { leftBitmap = ToGray(leftBitmap, 0); } e.Graphics.DrawImage(leftBitmap, new Rectangle(realBound.X + startPoint.X, realBound.Y + startPoint.Y, resizedWidth, resizedHeight), new Rectangle(0, 0, leftBitmap.Width, leftBitmap.Height), GraphicsUnit.Pixel); if (PrintSettingsInfo.IsPrintPageBorde) { System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Black, 2); e.Graphics.DrawRectangle(pen, new Rectangle(realBound.X + startPoint.X - 2, realBound.Y + startPoint.Y - 2, resizedWidth + 4, resizedHeight + 4)); pen.Dispose(); } } } } if (IsManualDuplex) { if (PrintIndex < PrintedPageCount - 2) { PrintIndex += 2; e.HasMorePages = true; } else { e.HasMorePages = false; if (PrintIndex % 2 == 0) { this.printDocumentEvent.GetEvent().Publish(new FinishedFrontSide { Unicode = this.Unicode }); } } } //单面打印或自动双面 else { if (PrintIndex < PrintedPageCount - 1) { PrintIndex++; e.HasMorePages = true; } else { e.HasMorePages = false; } } } #endregion private void PrintDocumentByCurrentSettings(object sender, PrintPageEventArgs e) { switch (PrintSettingsInfo.PrintModInfo.EnumPrintMod) { case EnumPrintMod.StatusPoster: PrintDocumentModPoster(e); break; case EnumPrintMod.StatusMultiple: PrintDocumentModMultiple(e); break; case EnumPrintMod.StatusBooklet: PrintDocumentModBooklet(e); break; case EnumPrintMod.StatusSize: default: PrintDocumentModSize(e); break; } } //跳转指定页 public void JumpToSelectedPage() { if (TargetPaperIndex >= 1 && TargetPaperIndex <= PrintedPageCount) { PaintPageByCurrentPreviewIndex(TargetPaperIndex); ErrorPageTxtVisibility = Visibility.Collapsed; } else { ErrorPageTxtVisibility = Visibility.Visible; } } //跳转指定页 public void JumpPage(object e) { var txt = e as System.Windows.Controls.TextBox; if (txt.Text != null) { try { TargetPaperIndex = Convert.ToInt32(txt.Text); } catch { TargetPaperIndex = 1; } } if (TargetPaperIndex >= 1 && TargetPaperIndex <= PrintedPageCount) { PaintPageByCurrentPreviewIndex(TargetPaperIndex); } } public void RecvPrintSettingsInfo(PrintSettingsInfoWithUnicode printSettingsInfoWIthUnicode) { if (PDFViewer != null && printSettingsInfoWIthUnicode.printSettingsInfo != null) { if (PrintSettingsInfo.IsPaperSizeChanged) { documentSettingsInfo.IsSettingsChanged = true; } if (documentSettingsInfo.IsSettingsChanged) { documentSettingsInfo.DocumentWidth = PrintSettingsInfo.PrintDocument.DefaultPageSettings.PaperSize.Width; documentSettingsInfo.DocumentHeight = PrintSettingsInfo.PrintDocument.DefaultPageSettings.PaperSize.Height; documentSettingsInfo.margins = PrintSettingsInfo.PrintDocument.DefaultPageSettings.Margins; documentSettingsInfo.DocumentBounds = PrintSettingsInfo.PrintDocument.DefaultPageSettings.Bounds; documentSettingsInfo.IsSettingsChanged = false; } CaculatePrintedPageCount(); SetPaperCollection(); if (PrintedPageCount != PreviousPrintedPageCount) { TargetPaperIndex = 1; PreviousPrintedPageCount = PrintedPageCount; } PaintPageByCurrentPreviewIndex(TargetPaperIndex); } } public void SetViewBox(double height, double width) { if (height / width >= (248.0 / 180.0)) { ViewBoxHeight = "248.0"; ViewBoxWidth = (width / height * 248.0).ToString(); } else { ViewBoxWidth = "180.0"; ViewBoxHeight = (height / width * 180.0).ToString(); } } #region 渲染具体函数 [System.Runtime.InteropServices.DllImport("gdi32.dll")] public static extern bool DeleteObject(IntPtr hObject); /// /// bitmap->bitmapsource转换器,用于显示到image控件 /// /// /// /// Bitmap格式图片资源 /// /// public BitmapSource ToBitmapSource(System.Drawing.Bitmap bmp) { IntPtr ptr = bmp.GetHbitmap();//obtain the Hbitmap try { BitmapSource bmpsrc = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap ( ptr, IntPtr.Zero, new Int32Rect(0, 0, bmp.Width, bmp.Height), System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions() ); return bmpsrc; } finally { DeleteObject(ptr); } } /// /// 创建空白底图 /// private Bitmap CreateBlankBitmap() { if (PrintSettingsInfo.EnumPrintOrientation == EnumPrintOrientation.StatusPortrait) { blankPageBitmap = new Bitmap((int)documentSettingsInfo.DocumentWidth, (int)documentSettingsInfo.DocumentHeight); } else { blankPageBitmap = new Bitmap((int)documentSettingsInfo.DocumentHeight, (int)documentSettingsInfo.DocumentWidth); } return blankPageBitmap; } /// /// 设置预览(除海报) /// public void SetPreview() { if (PrintSettingsInfo.EnumPrintOrientation == EnumPrintOrientation.StatusPortrait) { PaperWidth = String.Format("{0:F1}", (documentSettingsInfo.DocumentWidth) / 100.0 * 25.4); PaperHeight = String.Format("{0:F1}", (documentSettingsInfo.DocumentHeight) / 100.0 * 25.4); } else { PaperHeight = String.Format("{0:F1}", (documentSettingsInfo.DocumentWidth) / 100.0 * 25.4); PaperWidth = String.Format("{0:F1}", (documentSettingsInfo.DocumentHeight) / 100.0 * 25.4); } if (PrintSettingsInfo.PrintModInfo.EnumPrintMod != EnumPrintMod.StatusPoster) { SetViewBox(double.Parse(PaperHeight), double.Parse(PaperWidth)); blankPageBitmap = CreateBlankBitmap(); } } public System.Drawing.Image ResizeImage(System.Drawing.Image image, System.Drawing.Size size) { //获取图片宽度 int sourceWidth = image.Width; //获取图片高度 int sourceHeight = image.Height; float nPercent = 0; float nPercentW = 0; float nPercentH = 0; //计算宽度的缩放比例 //nPercentW = ((float)size.Width * (float)GetDpiByGraphics()/120/ (float)sourceWidth); ////计算高度的缩放比例 //nPercentH = ((float)size.Height*(float)GetDpiByGraphics() / 120 / (float)sourceHeight); nPercentW = ((float)size.Width / (float)sourceWidth); //计算高度的缩放比例 nPercentH = ((float)size.Height / (float)sourceHeight); if (nPercentH < nPercentW) nPercent = nPercentH; else nPercent = nPercentW; //期望的宽度 int destWidth = (int)(sourceWidth * nPercent); //期望的高度 int destHeight = (int)(sourceHeight * nPercent); System.Drawing.Bitmap b = new System.Drawing.Bitmap(destWidth, destHeight); Graphics g = Graphics.FromImage((System.Drawing.Image)b); //g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.SmoothingMode = SmoothingMode.None; //抗锯齿 g.InterpolationMode = InterpolationMode.HighQualityBicubic; //高质量的双三次插值 g.CompositingQuality = CompositingQuality.HighQuality; //高质量、低速度复合 //绘制图像 g.DrawImage(image, 0, 0, destWidth, destHeight); g.Dispose(); return (System.Drawing.Image)b; } /// /// 直接Resize到给定大小 /// /// /// /// /// public Bitmap Resize(Bitmap input, int targetWidth, int targetHeight) { try { var actualBitmap = new Bitmap(targetWidth, targetHeight); var g = Graphics.FromImage(actualBitmap); g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; //设定插值方式 g.DrawImage(input, new Rectangle(0, 0, targetWidth, targetHeight), new Rectangle(0, 0, input.Width, input.Height), GraphicsUnit.Pixel); g.Dispose(); return actualBitmap; } catch (Exception ex) { return null; } } /// /// 计算页数 /// public void CaculatePrintedPageCount() { PrintedPageCount = PrintSettingsInfo.PageRangeList.Count; if (PrintSettingsInfo.PrintModInfo.EnumPrintMod == EnumPrintMod.StatusMultiple) { MultipleInfo multipleInfo = (MultipleInfo)PrintSettingsInfo.PrintModInfo; if (PrintedPageCount % (multipleInfo.HorizontalPageNumber * multipleInfo.VerticalPageNumber) != 0) { PrintedPageCount = PrintedPageCount / (multipleInfo.HorizontalPageNumber * multipleInfo.VerticalPageNumber) + 1; } else { PrintedPageCount = PrintedPageCount / (multipleInfo.HorizontalPageNumber * multipleInfo.VerticalPageNumber); } } else if (PrintSettingsInfo.PrintModInfo.EnumPrintMod == EnumPrintMod.StatusBooklet) { BookletInfo bookletInfo = (BookletInfo)PrintSettingsInfo.PrintModInfo; if (PrintedPageCount == 1) { PrintedPageCount = 1; } else { PrintedPageCount = (bookletInfo.EndPaperIndex - bookletInfo.BeginPaperIndex + 1) * 2; if (bookletInfo.EnumBookletSubset == EnumBookletSubset.StatusFrontSideOnly || bookletInfo.EnumBookletSubset == EnumBookletSubset.StatusBackSideOnly) { PrintedPageCount /= 2; } } } } /// /// 转灰度 /// /// /// /// private Bitmap ToGray(Bitmap bmp, int mode) { if (bmp == null) { return null; } int w = bmp.Width; int h = bmp.Height; try { byte newColor = 0; BitmapData srcData = bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb); unsafe { byte* p = (byte*)srcData.Scan0.ToPointer(); for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { if (mode == 0) // 加权平均 { newColor = (byte)((float)p[0] * 0.114f + (float)p[1] * 0.587f + (float)p[2] * 0.299f); } else // 算数平均 { newColor = (byte)((float)(p[0] + p[1] + p[2]) / 3.0f); } p[0] = newColor; p[1] = newColor; p[2] = newColor; p += 3; } p += srcData.Stride - w * 3; } bmp.UnlockBits(srcData); return bmp; } } catch { return null; } } /// /// 合并底图和前景 /// /// /// /// /// public Bitmap CombineBitmap(Bitmap background, Bitmap foreground, System.Drawing.Point point) { if (background == null) { return null; } int bgWidth = background.Width; int bgHeight = background.Height; int fgWidth = foreground.Width; int fgHeight = foreground.Height; Bitmap newMap = new Bitmap(bgWidth, bgHeight); Graphics graphics = Graphics.FromImage(newMap); graphics.DrawImage(background, new System.Drawing.Point(0, 0)); graphics.DrawImage(foreground, point); graphics.Dispose(); return newMap; } /// /// size模式 /// /// private async void PreviewModSize(int paperIndex) { SizeInfo sizeInfo = (SizeInfo)PrintSettingsInfo.PrintModInfo; CPDFPage cPDFPage = PDFViewer.Document.PageAtIndex(PrintSettingsInfo.PageRangeList[paperIndex]); System.Drawing.Point startPoint = new System.Drawing.Point(0, 0); if (cPDFPage != null) { Bitmap printBitmap = new Bitmap((int)(float.Parse(PaperWidth)), (int)float.Parse(PaperHeight)); Bitmap bitmap = await ToolMethod.RenderPageBitmap(PDFViewer.Document, (int)(cPDFPage.PageSize.Width * PDFToMediaDpiRatio), (int)(cPDFPage.PageSize.Height * PDFToMediaDpiRatio), PrintSettingsInfo.PageRangeList[paperIndex], PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (PrintSettingsInfo.IsGrayscale) { bitmap = ToGray(bitmap, 0); } /// ///自适应模式 /// if (sizeInfo.EnumSizeType == EnumSizeType.StatusAdaptive) { int resizedHeight = 0; int resizedWidth = 0; ///重设大小 if ((float)bitmap.Height / (float)bitmap.Width >= (float.Parse(PaperHeight) / float.Parse(PaperWidth))) { resizedHeight = (int)(float.Parse(PaperHeight) * mmToDpiRatio); resizedWidth = (int)((float.Parse(PaperHeight) / bitmap.Height * bitmap.Width) * mmToDpiRatio); } else { resizedWidth = (int)(float.Parse(PaperWidth) * mmToDpiRatio); resizedHeight = (int)((float.Parse(PaperWidth) / bitmap.Width * bitmap.Height) * mmToDpiRatio); } bitmap = Resize(bitmap, resizedWidth, resizedHeight); startPoint.X = (blankPageBitmap.Width - resizedWidth) / 2; startPoint.Y = (blankPageBitmap.Height - resizedHeight) / 2; printBitmap = CombineBitmap(blankPageBitmap, bitmap, startPoint); BitmapSource = ToBitmapSource(printBitmap); } else if (sizeInfo.EnumSizeType == EnumSizeType.StatusActural) { startPoint.X = (blankPageBitmap.Width - bitmap.Width) / 2; startPoint.Y = (blankPageBitmap.Height - bitmap.Height) / 2; printBitmap = CombineBitmap(blankPageBitmap, bitmap, startPoint); BitmapSource = ToBitmapSource(printBitmap); } else if (sizeInfo.EnumSizeType == EnumSizeType.StatusCustomized) { bitmap = Resize(bitmap, (int)(bitmap.Width * (sizeInfo.DisplayRatio / 100.0)), (int)(bitmap.Height * (sizeInfo.DisplayRatio / 100.0))); startPoint.X = (blankPageBitmap.Width - bitmap.Width) / 2; startPoint.Y = (blankPageBitmap.Height - bitmap.Height) / 2; printBitmap = CombineBitmap(blankPageBitmap, bitmap, startPoint); BitmapSource = ToBitmapSource(printBitmap); } bitmap.Dispose(); printBitmap.Dispose(); } } /// /// 海报模式 /// /// private async void PreviewModPoster(int paperIndex) { PosterInfo posterInfo = (PosterInfo)PrintSettingsInfo.PrintModInfo; CPDFPage cPDFPage = PDFViewer.Document.PageAtIndex(PrintSettingsInfo.PageRangeList[paperIndex]); double PreviewHeight = 0; double PreviewWidth = 0; System.Drawing.Point startPoint = new System.Drawing.Point(0, 0); Bitmap displayBitmap = null; double effectiveHeight; double effectiveWidth; //计算有效打印区域 if (PrintSettingsInfo.EnumPrintOrientation == EnumPrintOrientation.StatusPortrait) { effectiveHeight = documentSettingsInfo.DocumentHeight; effectiveWidth = documentSettingsInfo.DocumentWidth; } else { effectiveHeight = documentSettingsInfo.DocumentWidth; effectiveWidth = documentSettingsInfo.DocumentHeight; } //重叠 effectiveHeight = effectiveHeight - 2 * posterInfo.OverLap * 100 / 25.4; effectiveWidth = effectiveWidth - 2 * posterInfo.OverLap * 100 / 25.4; if (posterInfo.HasCutMarks || posterInfo.HasLabel) { ///如果边距小于预留尺寸 effectiveHeight = effectiveHeight - 40; effectiveWidth = effectiveWidth - 40; } if (cPDFPage != null) { //平铺模式 //根据页面大小,按最大有效打印区域划分为多块 //最大有效区域 //纸张大小-标记标签-重叠 if (posterInfo.EnumPosterMod == EnumPosterMod.StatusTile) { Bitmap bitmap; //TODO 放大倍数过高引起超限 try { bitmap = await ToolMethod.RenderPageBitmap(PDFViewer.Document, (int)(cPDFPage.PageSize.Width * PDFToMediaDpiRatio * (posterInfo.TileRatio / 100.0)), (int)(cPDFPage.PageSize.Height * PDFToMediaDpiRatio * (posterInfo.TileRatio / 100.0)), PrintSettingsInfo.PageRangeList[paperIndex], PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); } catch { bitmap = await ToolMethod.RenderPageBitmap(PDFViewer.Document, (int)(cPDFPage.PageSize.Width * PDFToMediaDpiRatio), (int)(cPDFPage.PageSize.Height * PDFToMediaDpiRatio), PrintSettingsInfo.PageRangeList[paperIndex], PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); } HorizonPaperCount = (int)Math.Ceiling((double)bitmap.Width / effectiveWidth); VerticalPaperCount = (int)Math.Ceiling(((double)bitmap.Height / effectiveHeight)); PreviewWidth = (double)(effectiveWidth * HorizonPaperCount); PreviewHeight = (double)(effectiveHeight * VerticalPaperCount); //铺放纸张 SetViewBox(PreviewHeight, PreviewWidth); //创建空白图像,大小等于纸张铺放后 displayBitmap = new Bitmap((int)PreviewWidth, (int)PreviewHeight); //居中合并 startPoint.X = (int)((PreviewWidth - bitmap.Width) / 2); startPoint.Y = (int)((PreviewHeight - bitmap.Height) / 2); if (PrintSettingsInfo.IsGrayscale) { bitmap = ToGray(bitmap, 0); } displayBitmap = CombineBitmap(displayBitmap, bitmap, startPoint); //画线 Graphics g = Graphics.FromImage(displayBitmap); if (HorizonPaperCount > 1) { for (int tempX = 1; tempX < HorizonPaperCount; tempX++) { int horizonLocate = (int)(tempX * displayBitmap.Width / HorizonPaperCount); g.DrawLine(new Pen(Color.Gray, HorizonPaperCount * 2), new System.Drawing.Point(horizonLocate, 0), new System.Drawing.Point(horizonLocate, (int)PreviewHeight)); } } if (VerticalPaperCount > 1) { for (int tempY = 1; tempY < VerticalPaperCount; tempY++) { int verticalLocate = (int)(tempY * displayBitmap.Height / VerticalPaperCount); g.DrawLine(new Pen(Color.Gray, VerticalPaperCount * 2), new System.Drawing.Point(0, verticalLocate), new System.Drawing.Point((int)PreviewWidth, verticalLocate)); } } g.Dispose(); bitmap.Dispose(); PosterRatio = posterInfo.TileRatio / 100.0; } //拆分模式 else if (posterInfo.EnumPosterMod == EnumPosterMod.StatusSplit) { HorizonPaperCount = posterInfo.HorizontalSheetNumber; VerticalPaperCount = posterInfo.VerticalSheetNumber; PreviewWidth = (double)(effectiveWidth * HorizonPaperCount); PreviewHeight = (double)(effectiveHeight * VerticalPaperCount); //铺放纸张 SetViewBox(PreviewHeight, PreviewWidth); //创建空白图像,大小等于纸张铺放后 displayBitmap = new Bitmap((int)PreviewWidth, (int)PreviewHeight); //文件根据有效范围缩放 double wholeEffectiveHeight = effectiveHeight * VerticalPaperCount; double wholeEffectiveWidth = effectiveWidth * HorizonPaperCount; double resizedHeight = 0; double resizedWidth = 0; if ((cPDFPage.PageSize.Height / cPDFPage.PageSize.Width) >= wholeEffectiveHeight / wholeEffectiveWidth) { resizedHeight = wholeEffectiveHeight; resizedWidth = wholeEffectiveHeight / cPDFPage.PageSize.Height * cPDFPage.PageSize.Width; } else { resizedWidth = wholeEffectiveWidth; resizedHeight = wholeEffectiveWidth / cPDFPage.PageSize.Width * cPDFPage.PageSize.Height; } PosterRatio = resizedWidth / cPDFPage.PageSize.Width; Bitmap bitmap = await ToolMethod.RenderPageBitmap(PDFViewer.Document, (int)resizedWidth, (int)resizedHeight, PrintSettingsInfo.PageRangeList[paperIndex], PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); startPoint.X = (int)((PreviewWidth - bitmap.Width) / 2); startPoint.Y = (int)((PreviewHeight - bitmap.Height) / 2); if (PrintSettingsInfo.IsGrayscale) { bitmap = ToGray(bitmap, 0); } displayBitmap = CombineBitmap(displayBitmap, bitmap, startPoint); //画线 Graphics g = Graphics.FromImage(displayBitmap); if (HorizonPaperCount > 1) { for (int tempX = 1; tempX < HorizonPaperCount; tempX++) { int horizonLocate = (int)(tempX * displayBitmap.Width / HorizonPaperCount); g.DrawLine(new Pen(Color.Gray, HorizonPaperCount * 2), new System.Drawing.Point(horizonLocate, 0), new System.Drawing.Point(horizonLocate, (int)PreviewHeight)); } } if (VerticalPaperCount > 1) { for (int tempY = 1; tempY < VerticalPaperCount; tempY++) { int verticalLocate = (int)(tempY * displayBitmap.Height / VerticalPaperCount); g.DrawLine(new Pen(Color.Gray, VerticalPaperCount * 2), new System.Drawing.Point(0, verticalLocate), new System.Drawing.Point((int)PreviewWidth, verticalLocate)); } } g.Dispose(); bitmap.Dispose(); } } BitmapSource = ToBitmapSource(displayBitmap); displayBitmap.Dispose(); } /// /// 多页 /// /// private async void PreviewModMultiple(int paperIndex) { MultipleInfo multipleInfo = (MultipleInfo)PrintSettingsInfo.PrintModInfo; int singlePageHeight; int singlePageWidth; Bitmap printBitmap; int currentPage = 0; if (PrintSettingsInfo.EnumPrintOrientation == EnumPrintOrientation.StatusPortrait) { singlePageHeight = (int)(documentSettingsInfo.DocumentHeight / multipleInfo.VerticalPageNumber); singlePageWidth = (int)(documentSettingsInfo.DocumentWidth / multipleInfo.HorizontalPageNumber); printBitmap = new Bitmap((int)documentSettingsInfo.DocumentWidth, (int)documentSettingsInfo.DocumentHeight); } else { singlePageHeight = (int)(documentSettingsInfo.DocumentWidth / multipleInfo.VerticalPageNumber); singlePageWidth = (int)(documentSettingsInfo.DocumentHeight / multipleInfo.HorizontalPageNumber); printBitmap = new Bitmap((int)documentSettingsInfo.DocumentHeight, (int)documentSettingsInfo.DocumentWidth); } System.Drawing.Point startPoint = new System.Drawing.Point(0, 0); int startPage = PrintSettingsInfo.PageRangeList[paperIndex * (multipleInfo.VerticalPageNumber) * (multipleInfo.HorizontalPageNumber)]; int resizedHeight = 0; int resizedWidth = 0; bool isNoSrcPage = false; Bitmap pageBitmap; ///水平:横向排列,先横后纵,纵轴不变横轴翻转 if (multipleInfo.EnumPageOrder == EnumPageOrder.StatusHorizontalOrder || multipleInfo.EnumPageOrder == EnumPageOrder.StatusHorizontalReverseOrder) { for (int tempVerticalIndex = 0; tempVerticalIndex < multipleInfo.VerticalPageNumber; tempVerticalIndex++) { startPoint.Y = tempVerticalIndex * singlePageHeight; for (int tempHorizontalIndex = 0; tempHorizontalIndex < multipleInfo.HorizontalPageNumber; tempHorizontalIndex++) { try { currentPage = PrintSettingsInfo.PageRangeList[paperIndex * (multipleInfo.VerticalPageNumber) * (multipleInfo.HorizontalPageNumber) + (tempVerticalIndex * multipleInfo.HorizontalPageNumber) + tempHorizontalIndex]; } catch { break; } //横向 if (multipleInfo.EnumPageOrder == EnumPageOrder.StatusHorizontalOrder) { startPoint.X = tempHorizontalIndex * singlePageWidth; } //横向倒序 else { startPoint.X = (multipleInfo.HorizontalPageNumber - tempHorizontalIndex - 1) * singlePageWidth; } CPDFPage cPDFPage = PDFViewer.Document.PageAtIndex(currentPage); if (cPDFPage == null) { isNoSrcPage = true; break; } pageBitmap = await ToolMethod.RenderPageBitmap(PDFViewer.Document, (int)(cPDFPage.PageSize.Width), (int)(cPDFPage.PageSize.Height), currentPage, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (multipleInfo.IsAutoRotate) { if ((cPDFPage.PageSize.Height / cPDFPage.PageSize.Width > 1 && (double)singlePageHeight / singlePageWidth < 1) || (cPDFPage.PageSize.Height / cPDFPage.PageSize.Width < 1 && (double)singlePageHeight / singlePageWidth > 1)) { pageBitmap = ToolMethod.RenderPageBitmapNoWait(PDFViewer.Document, (int)(cPDFPage.PageSize.Width), (int)(cPDFPage.PageSize.Height), currentPage, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); pageBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); } } ///重设大小 if ((float)pageBitmap.Height / (float)pageBitmap.Width >= ((float)singlePageHeight / (float)singlePageWidth)) { resizedHeight = (int)(singlePageHeight * 0.96); resizedWidth = (int)((float)singlePageHeight / pageBitmap.Height * pageBitmap.Width * 0.96); } else { resizedWidth = (int)(singlePageWidth * 0.96); resizedHeight = (int)((float)singlePageWidth / pageBitmap.Width * pageBitmap.Height * 0.96); } pageBitmap = Resize(pageBitmap, (int)resizedWidth, (int)resizedHeight); startPoint.X += (singlePageWidth - resizedWidth) / 2; startPoint.Y += (singlePageHeight - resizedHeight) / 2; if (PrintSettingsInfo.IsGrayscale) { pageBitmap = ToGray(pageBitmap, 0); } printBitmap = CombineBitmap(printBitmap, pageBitmap, startPoint); //绘制边界 if (PrintSettingsInfo.IsPrintPageBorde) { using (Pen pen = new Pen(Color.Black, 4)) { Graphics g = Graphics.FromImage(printBitmap); g.DrawRectangle(pen, new Rectangle(startPoint.X, startPoint.Y, resizedWidth, resizedHeight)); g.Dispose(); } } startPoint.Y -= (singlePageHeight - resizedHeight) / 2; } if (isNoSrcPage) { isNoSrcPage = false; break; } } } //垂直:纵向排列,先纵后横,纵轴不变横轴翻转 else { for (int tempHorizontalIndex = 0; tempHorizontalIndex < multipleInfo.HorizontalPageNumber; tempHorizontalIndex++) { //纵向,垂直排列时先移位 if (multipleInfo.EnumPageOrder == EnumPageOrder.StatusVerticalOrder) { startPoint.X = tempHorizontalIndex * singlePageWidth; } //纵向倒序 else { startPoint.X = (multipleInfo.HorizontalPageNumber - tempHorizontalIndex - 1) * singlePageWidth; } for (int tempVerticalIndex = 0; tempVerticalIndex < multipleInfo.VerticalPageNumber; tempVerticalIndex++) { startPoint.Y = tempVerticalIndex * singlePageHeight; try { currentPage = PrintSettingsInfo.PageRangeList[paperIndex * (multipleInfo.VerticalPageNumber) * (multipleInfo.HorizontalPageNumber) + (tempHorizontalIndex * multipleInfo.VerticalPageNumber) + tempVerticalIndex]; } catch { break; } CPDFPage cPDFPage = PDFViewer.Document.PageAtIndex(currentPage); if (cPDFPage == null) { isNoSrcPage = true; break; } pageBitmap = await ToolMethod.RenderPageBitmap(PDFViewer.Document, (int)(cPDFPage.PageSize.Width), (int)(cPDFPage.PageSize.Height), currentPage, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (multipleInfo.IsAutoRotate) { if ((cPDFPage.PageSize.Height / cPDFPage.PageSize.Width > 1 && (double)singlePageHeight / singlePageWidth < 1) || (cPDFPage.PageSize.Height / cPDFPage.PageSize.Width < 1 && (double)singlePageHeight / singlePageWidth > 1)) { pageBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); } } Graphics graphics = Graphics.FromImage(pageBitmap); ///重设大小 if ((float)pageBitmap.Height / (float)pageBitmap.Width >= ((float)singlePageHeight / (float)singlePageWidth)) { resizedHeight = (int)(singlePageHeight * 0.96); resizedWidth = (int)((float)singlePageHeight / pageBitmap.Height * pageBitmap.Width * 0.96); } else { resizedWidth = (int)(singlePageWidth * 0.96); resizedHeight = (int)((float)singlePageWidth / pageBitmap.Width * pageBitmap.Height * 0.96); } pageBitmap = Resize(pageBitmap, (int)resizedWidth, (int)resizedHeight); graphics.Dispose(); startPoint.X += (singlePageWidth - resizedWidth) / 2; startPoint.Y += (singlePageHeight - resizedHeight) / 2; if (PrintSettingsInfo.IsGrayscale) { pageBitmap = ToGray(pageBitmap, 0); } printBitmap = CombineBitmap(printBitmap, pageBitmap, startPoint); //绘制边界 if (PrintSettingsInfo.IsPrintPageBorde) { using (Pen pen = new Pen(Color.Black, 4)) { Graphics g = Graphics.FromImage(printBitmap); g.DrawRectangle(pen, new Rectangle(startPoint.X, startPoint.Y, resizedWidth, resizedHeight)); g.Dispose(); } } startPoint.X -= (singlePageWidth - resizedWidth) / 2; } if (isNoSrcPage) { isNoSrcPage = false; break; } } } WholePaperCountModPoster = PrintedPageCount * HorizonPaperCount * VerticalPaperCount; BitmapSource = ToBitmapSource(printBitmap); } /// /// 小册子模式 /// /// private async void PreviewModBooklet(int paperIndex) { BookletInfo bookletInfo = (BookletInfo)PrintSettingsInfo.PrintModInfo; ///空白画布 Bitmap printBitmap; double singlePageHeight = 0; double singlePageWidth = 0; if (PrintSettingsInfo.EnumPrintOrientation == EnumPrintOrientation.StatusPortrait) { printBitmap = new Bitmap((int)documentSettingsInfo.DocumentWidth, (int)documentSettingsInfo.DocumentHeight); singlePageHeight = (double)documentSettingsInfo.DocumentHeight; singlePageWidth = (double)(documentSettingsInfo.DocumentWidth / 2); } else { printBitmap = new Bitmap((int)documentSettingsInfo.DocumentHeight, (int)documentSettingsInfo.DocumentWidth); singlePageHeight = (double)documentSettingsInfo.DocumentWidth; singlePageWidth = (double)(documentSettingsInfo.DocumentHeight / 2); } System.Drawing.Point startPoint = new System.Drawing.Point(0, 0); int maxPaperNumber = (PDFViewer.Document.PageCount % 4 == 0) ? (PDFViewer.Document.PageCount / 4) : (PDFViewer.Document.PageCount / 4 + 1); Bitmap leftBitmap = null; Bitmap rightBitmap = null; double resizedHeight = 0; double resizedWidth = 0; CPDFPage leftPage = null; CPDFPage rightPage = null; int leftPageIndex = 0; int rightPageIndex = 0; /// ///左装订与右装订顺序相反 /// if (bookletInfo.EnumBookletBinding == EnumBookletBinding.StatusLeft) { ///奇数页: ///右面为页面序号 ///左面为[(总打印纸数*4)+1-打印页右侧页序号] if ((paperIndex + 1) % 2 == 1) { try { leftPageIndex = PrintSettingsInfo.PageRangeList[maxPaperNumber * 4 - paperIndex - 1]; leftPage = PDFViewer.Document.PageAtIndex(leftPageIndex); } catch { leftPage = null; } rightPageIndex = PrintSettingsInfo.PageRangeList[paperIndex]; //左面 if (leftPage != null) { leftBitmap = await ToolMethod.RenderPageBitmap(PDFViewer.Document, (int)leftPage.PageSize.Width, (int)leftPage.PageSize.Height, leftPageIndex, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (bookletInfo.IsAutoRotate) { if ((leftPage.PageSize.Height / leftPage.PageSize.Width > 1 && (double)singlePageHeight / singlePageWidth < 1) || (leftPage.PageSize.Height / leftPage.PageSize.Width < 1 && (double)singlePageHeight / singlePageWidth > 1)) { leftBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); } } ///重设大小 if ((leftBitmap.Height / leftBitmap.Width) >= singlePageHeight / singlePageWidth) { resizedHeight = singlePageHeight * 0.96; resizedWidth = singlePageHeight / leftBitmap.Height * leftBitmap.Width * 0.96; } else { resizedWidth = singlePageWidth * 0.96; resizedHeight = singlePageWidth / leftBitmap.Width * leftBitmap.Height * 0.96; } leftBitmap = Resize(leftBitmap, (int)(resizedWidth), (int)(resizedHeight)); startPoint.X = (int)(singlePageWidth - resizedWidth) / 2; startPoint.Y = (int)(singlePageHeight - resizedHeight) / 2; if (PrintSettingsInfo.IsGrayscale) { leftBitmap = ToGray(leftBitmap, 0); } printBitmap = CombineBitmap(printBitmap, leftBitmap, startPoint); } //右面 rightPage = PDFViewer.Document.PageAtIndex(rightPageIndex); startPoint.X = (int)singlePageWidth; if (rightPage != null) { rightBitmap = await ToolMethod.RenderPageBitmap(PDFViewer.Document, (int)rightPage.PageSize.Width, (int)rightPage.PageSize.Height, rightPageIndex, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (bookletInfo.IsAutoRotate) { if ((rightPage.PageSize.Height / rightPage.PageSize.Width > 1 && (double)singlePageHeight / singlePageWidth < 1) || (rightPage.PageSize.Height / rightPage.PageSize.Width < 1 && (double)singlePageHeight / singlePageWidth > 1)) { rightBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); } } ///重设大小 if ((rightBitmap.Height / rightBitmap.Width) >= singlePageHeight / singlePageWidth) { resizedHeight = singlePageHeight * 0.96; resizedWidth = singlePageHeight / rightBitmap.Height * rightBitmap.Width * 0.96; } else { resizedWidth = singlePageWidth * 0.96; resizedHeight = singlePageWidth / rightBitmap.Width * rightBitmap.Height * 0.96; } rightBitmap = Resize(rightBitmap, (int)(resizedWidth), (int)(resizedHeight)); startPoint.X += (int)(singlePageWidth - resizedWidth) / 2; startPoint.Y = (int)(singlePageHeight - resizedHeight) / 2; if (PrintSettingsInfo.IsGrayscale) { rightBitmap = ToGray(rightBitmap, 0); } printBitmap = CombineBitmap(printBitmap, rightBitmap, startPoint); if (PrintSettingsInfo.IsPrintPageBorde) { using (Pen pen = new Pen(Color.Black, 4)) { Graphics g = Graphics.FromImage(printBitmap); g.DrawRectangle(pen, new Rectangle(startPoint.X, startPoint.Y, (int)resizedWidth, (int)resizedHeight)); g.Dispose(); } } } } /// 偶数页: /// 左面为页面序号 /// 右面为[(总打印纸数*4)+1-打印页右侧页序号] else { try { leftPageIndex = PrintSettingsInfo.PageRangeList[paperIndex]; leftPage = PDFViewer.Document.PageAtIndex(leftPageIndex); } catch { leftPage = null; } //左面 if (leftPage != null) { leftBitmap = await ToolMethod.RenderPageBitmap(PDFViewer.Document, (int)leftPage.PageSize.Width, (int)leftPage.PageSize.Height, leftPageIndex, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (bookletInfo.IsAutoRotate) { if ((leftPage.PageSize.Height / leftPage.PageSize.Width > 1 && (double)singlePageHeight / singlePageWidth < 1) || (leftPage.PageSize.Height / leftPage.PageSize.Width < 1 && (double)singlePageHeight / singlePageWidth > 1)) { leftBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); } } ///重设大小 if ((leftBitmap.Height / leftBitmap.Width) >= singlePageHeight / singlePageWidth) { resizedHeight = singlePageHeight * 0.96; resizedWidth = singlePageHeight / leftBitmap.Height * leftBitmap.Width * 0.96; } else { resizedWidth = singlePageWidth * 0.96; resizedHeight = singlePageWidth / leftBitmap.Width * leftBitmap.Height * 0.96; } leftBitmap = Resize(leftBitmap, (int)(resizedWidth), (int)(resizedHeight)); startPoint.X = (int)(singlePageWidth - resizedWidth) / 2; startPoint.Y = (int)(singlePageHeight - resizedHeight) / 2; if (PrintSettingsInfo.IsGrayscale) { leftBitmap = ToGray(leftBitmap, 0); } printBitmap = CombineBitmap(printBitmap, leftBitmap, startPoint); if (PrintSettingsInfo.IsPrintPageBorde) { using (Pen pen = new Pen(Color.Black, 4)) { Graphics g = Graphics.FromImage(printBitmap); g.DrawRectangle(pen, new Rectangle(startPoint.X, startPoint.Y, (int)resizedWidth, (int)resizedHeight)); g.Dispose(); } } } //右面 try { rightPageIndex = PrintSettingsInfo.PageRangeList[maxPaperNumber * 4 - 1 - paperIndex]; rightPage = PDFViewer.Document.PageAtIndex(rightPageIndex); } catch { rightPage = null; } startPoint.X = (int)singlePageWidth; if (rightPage != null) { ///重设大小 rightBitmap = await ToolMethod.RenderPageBitmap(PDFViewer.Document, (int)rightPage.PageSize.Width, (int)rightPage.PageSize.Height, rightPageIndex, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (bookletInfo.IsAutoRotate) { if ((rightPage.PageSize.Height / rightPage.PageSize.Width > 1 && (double)singlePageHeight / singlePageWidth < 1) || (rightPage.PageSize.Height / rightPage.PageSize.Width < 1 && (double)singlePageHeight / singlePageWidth > 1)) { rightBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); } } ///重设大小 if ((rightBitmap.Height / rightBitmap.Width) >= singlePageHeight / singlePageWidth) { resizedHeight = singlePageHeight * 0.96; resizedWidth = singlePageHeight / rightBitmap.Height * rightBitmap.Width * 0.96; } else { resizedWidth = singlePageWidth * 0.96; resizedHeight = singlePageWidth / rightBitmap.Width * rightBitmap.Height * 0.96; } rightBitmap = Resize(rightBitmap, (int)(resizedWidth), (int)(resizedHeight)); startPoint.X += (int)(singlePageWidth - resizedWidth) / 2; startPoint.Y = (int)(singlePageHeight - resizedHeight) / 2; if (PrintSettingsInfo.IsGrayscale) { rightBitmap = ToGray(rightBitmap, 0); } printBitmap = CombineBitmap(printBitmap, rightBitmap, startPoint); if (PrintSettingsInfo.IsPrintPageBorde) { using (Pen pen = new Pen(Color.Black, 4)) { Graphics g = Graphics.FromImage(printBitmap); g.DrawRectangle(pen, new Rectangle(startPoint.X, startPoint.Y, (int)resizedWidth, (int)resizedHeight)); g.Dispose(); } } } } } /// ///右装订打印 /// if (bookletInfo.EnumBookletBinding == EnumBookletBinding.StatusRight) { ///奇数页: ///右面为页面序号 ///左面为[(总打印纸数*4)+1-打印页右侧页序号] if ((paperIndex + 1) % 2 == 0) { try { leftPageIndex = PrintSettingsInfo.PageRangeList[maxPaperNumber * 4 - paperIndex - 1]; leftPage = PDFViewer.Document.PageAtIndex(leftPageIndex); } catch { leftPage = null; } rightPageIndex = PrintSettingsInfo.PageRangeList[paperIndex]; //左面 if (leftPage != null) { leftBitmap = await ToolMethod.RenderPageBitmap(PDFViewer.Document, (int)leftPage.PageSize.Width, (int)leftPage.PageSize.Height, leftPageIndex, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (bookletInfo.IsAutoRotate) { if ((leftPage.PageSize.Height / leftPage.PageSize.Width > 1 && (double)singlePageHeight / singlePageWidth < 1) || (leftPage.PageSize.Height / leftPage.PageSize.Width < 1 && (double)singlePageHeight / singlePageWidth > 1)) { leftBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); } } ///重设大小 if ((leftBitmap.Height / leftBitmap.Width) >= singlePageHeight / singlePageWidth) { resizedHeight = singlePageHeight * 0.96; resizedWidth = singlePageHeight / leftBitmap.Height * leftBitmap.Width * 0.96; } else { resizedWidth = singlePageWidth; resizedHeight = singlePageWidth / leftBitmap.Width * leftBitmap.Height; } leftBitmap = Resize(leftBitmap, (int)(resizedWidth), (int)(resizedHeight)); startPoint.X = (int)(singlePageWidth - resizedWidth) / 2; startPoint.Y = (int)(singlePageHeight - resizedHeight) / 2; if (PrintSettingsInfo.IsGrayscale) { leftBitmap = ToGray(leftBitmap, 0); } printBitmap = CombineBitmap(printBitmap, leftBitmap, startPoint); if (PrintSettingsInfo.IsPrintPageBorde) { using (Pen pen = new Pen(Color.Black, 4)) { Graphics g = Graphics.FromImage(printBitmap); g.DrawRectangle(pen, new Rectangle(startPoint.X, startPoint.Y, (int)resizedWidth, (int)resizedHeight)); g.Dispose(); } } } //右面 rightPage = PDFViewer.Document.PageAtIndex(rightPageIndex); startPoint.X = (int)singlePageWidth; if (rightPage != null) { ///重设大小 rightBitmap = await ToolMethod.RenderPageBitmap(PDFViewer.Document, (int)rightPage.PageSize.Width, (int)rightPage.PageSize.Height, rightPageIndex, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (bookletInfo.IsAutoRotate) { if ((rightPage.PageSize.Height / rightPage.PageSize.Width > 1 && (double)singlePageHeight / singlePageWidth < 1) || (rightPage.PageSize.Height / rightPage.PageSize.Width < 1 && (double)singlePageHeight / singlePageWidth > 1)) { rightBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); } } ///重设大小 if ((rightBitmap.Height / rightBitmap.Width) >= singlePageHeight / singlePageWidth) { resizedHeight = singlePageHeight * 0.96; resizedWidth = singlePageHeight / rightBitmap.Height * rightBitmap.Width * 0.96; } else { resizedWidth = singlePageWidth * 0.96; resizedHeight = singlePageWidth / rightBitmap.Width * rightBitmap.Height * 0.96; } rightBitmap = Resize(rightBitmap, (int)(resizedWidth), (int)(resizedHeight)); startPoint.X += (int)(singlePageWidth - resizedWidth) / 2; startPoint.Y = (int)(singlePageHeight - resizedHeight) / 2; if (PrintSettingsInfo.IsGrayscale) { rightBitmap = ToGray(rightBitmap, 0); } printBitmap = CombineBitmap(printBitmap, rightBitmap, startPoint); if (PrintSettingsInfo.IsPrintPageBorde) { using (Pen pen = new Pen(Color.Black, 4)) { Graphics g = Graphics.FromImage(printBitmap); g.DrawRectangle(pen, new Rectangle(startPoint.X, startPoint.Y, (int)resizedWidth, (int)resizedHeight)); g.Dispose(); } } } } /// 偶数页: /// 左面为页面序号 /// 右面为[(总打印纸数*4)+1-打印页右侧页序号] else { leftPageIndex = PrintSettingsInfo.PageRangeList[paperIndex]; //左面 leftPage = PDFViewer.Document.PageAtIndex(leftPageIndex); if (leftPage != null) { ///重设大小 leftBitmap = await ToolMethod.RenderPageBitmap(PDFViewer.Document, (int)leftPage.PageSize.Width, (int)leftPage.PageSize.Height, leftPageIndex, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (bookletInfo.IsAutoRotate) { if ((leftPage.PageSize.Height / leftPage.PageSize.Width > 1 && (double)singlePageHeight / singlePageWidth < 1) || (leftPage.PageSize.Height / leftPage.PageSize.Width < 1 && (double)singlePageHeight / singlePageWidth > 1)) { leftBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); } } ///重设大小 if ((leftBitmap.Height / leftBitmap.Width) >= singlePageHeight / singlePageWidth) { resizedHeight = singlePageHeight * 0.96; resizedWidth = singlePageHeight / leftBitmap.Height * leftBitmap.Width * 0.96; } else { resizedWidth = singlePageWidth * 0.96; resizedHeight = singlePageWidth / leftBitmap.Width * leftBitmap.Height * 0.96; } leftBitmap = Resize(leftBitmap, (int)(resizedWidth), (int)(resizedHeight)); startPoint.X = (int)(singlePageWidth - resizedWidth) / 2; startPoint.Y = (int)(singlePageHeight - resizedHeight) / 2; if (PrintSettingsInfo.IsGrayscale) { leftBitmap = ToGray(leftBitmap, 0); } printBitmap = CombineBitmap(printBitmap, leftBitmap, startPoint); if (PrintSettingsInfo.IsPrintPageBorde) { using (Pen pen = new Pen(Color.Black, 4)) { Graphics g = Graphics.FromImage(printBitmap); g.DrawRectangle(pen, new Rectangle(startPoint.X, startPoint.Y, (int)resizedWidth, (int)resizedHeight)); g.Dispose(); } } } //右面 try { rightPageIndex = PrintSettingsInfo.PageRangeList[maxPaperNumber * 4 - 1 - paperIndex]; rightPage = PDFViewer.Document.PageAtIndex(rightPageIndex); } catch { rightPage = null; } startPoint.X = (int)singlePageWidth; if (rightPage != null) { ///重设大小 rightBitmap = await ToolMethod.RenderPageBitmap(PDFViewer.Document, (int)rightPage.PageSize.Width, (int)rightPage.PageSize.Height, rightPageIndex, PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (bookletInfo.IsAutoRotate) { if ((rightPage.PageSize.Height / rightPage.PageSize.Width > 1 && (double)singlePageHeight / singlePageWidth < 1) || (rightPage.PageSize.Height / rightPage.PageSize.Width < 1 && (double)singlePageHeight / singlePageWidth > 1)) { rightBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); } } ///重设大小 if ((rightBitmap.Height / rightBitmap.Width) >= singlePageHeight / singlePageWidth) { resizedHeight = singlePageHeight * 0.96; resizedWidth = singlePageHeight / rightBitmap.Height * rightBitmap.Width * 0.96; } else { resizedWidth = singlePageWidth * 0.96; resizedHeight = singlePageWidth / rightBitmap.Width * rightBitmap.Height * 0.96; } rightBitmap = Resize(rightBitmap, (int)(resizedWidth), (int)(resizedHeight)); startPoint.X += (int)(singlePageWidth - resizedWidth) / 2; startPoint.Y = (int)(singlePageHeight - resizedHeight) / 2; if (PrintSettingsInfo.IsGrayscale) { rightBitmap = ToGray(rightBitmap, 0); } printBitmap = CombineBitmap(printBitmap, rightBitmap, startPoint); if (PrintSettingsInfo.IsPrintPageBorde) { using (Pen pen = new Pen(Color.Black, 4)) { Graphics g = Graphics.FromImage(printBitmap); g.DrawRectangle(pen, new Rectangle(startPoint.X, startPoint.Y, (int)resizedWidth, (int)resizedHeight)); g.Dispose(); } } } } } BitmapSource = ToBitmapSource(printBitmap); } #endregion /// /// 按照模式绘制指定纸张 /// /// private void PaintPageByCurrentPreviewIndex(int TargetPaperIndex) { lock (this) { if (PrintSettingsInfo.PrintModInfo.EnumPrintMod == EnumPrintMod.StatusSize) { SetPreview(); PreviewModSize(TargetPaperList[TargetPaperIndex]); } else if (PrintSettingsInfo.PrintModInfo.EnumPrintMod == EnumPrintMod.StatusPoster) { SetPreview(); PreviewModPoster(TargetPaperList[TargetPaperIndex]); } else if (PrintSettingsInfo.PrintModInfo.EnumPrintMod == EnumPrintMod.StatusMultiple) { SetPreview(); PreviewModMultiple(TargetPaperList[TargetPaperIndex]); } else if (PrintSettingsInfo.PrintModInfo.EnumPrintMod == EnumPrintMod.StatusBooklet) { SetPreview(); PreviewModBooklet(TargetPaperList[TargetPaperIndex]); } } } /// /// 设置纸张集合 /// 大小模式:目标纸张和目标纸张页一致 /// 海报模式:一致 /// 多页模式: 一致 /// 小册子模式:不一致 /// 第a页-第b页:从第1页开始数,a页=(a-1)*2, b页=(b-1)*2 /// 面向:奇数页:paper%2 = 1 /// 背向:偶数页:Paper%2 = 0; /// public void SetPaperCollection() { if (PrintSettingsInfo.PrintModInfo.EnumPrintMod == EnumPrintMod.StatusSize || PrintSettingsInfo.PrintModInfo.EnumPrintMod == EnumPrintMod.StatusPoster || PrintSettingsInfo.PrintModInfo.EnumPrintMod == EnumPrintMod.StatusMultiple) { TargetPaperList.Clear(); TargetPaperList.Add(0); for (int temp = 0; temp < PrintSettingsInfo.PageRangeList.Count; temp++) { TargetPaperList.Add(temp); } } else { BookletInfo bookletInfo = (BookletInfo)PrintSettingsInfo.PrintModInfo; if (bookletInfo.EnumBookletSubset == EnumBookletSubset.StatusBothSides) { TargetPaperList.Clear(); TargetPaperList.Add(0); for (int temp = bookletInfo.BeginPaperIndex * 2 - 2; temp < bookletInfo.EndPaperIndex * 2; temp++) { TargetPaperList.Add(temp); } } else if (bookletInfo.EnumBookletSubset == EnumBookletSubset.StatusFrontSideOnly) { TargetPaperList.Clear(); TargetPaperList.Add(0); for (int temp = bookletInfo.BeginPaperIndex * 2 - 2; temp < bookletInfo.EndPaperIndex * 2; temp += 2) { TargetPaperList.Add(temp); } } else { TargetPaperList.Clear(); TargetPaperList.Add(0); for (int temp = bookletInfo.BeginPaperIndex * 2 - 1; temp < bookletInfo.EndPaperIndex * 2; temp += 2) { TargetPaperList.Add(temp); } } } } public bool IsNavigationTarget(NavigationContext navigationContext) { return true; } public void OnNavigatedFrom(NavigationContext navigationContext) { this.printDocument.Dispose(); } public void OnNavigatedTo(NavigationContext navigationContext) { navigationContext.Parameters.TryGetValue(ParameterNames.PDFViewer, out PDFViewer); navigationContext.Parameters.TryGetValue(ParameterNames.PrintSettingsInfo, out PrintSettingsInfo); navigationContext.Parameters.TryGetValue("Unicode", out Unicode); if (PDFViewer != null && PrintSettingsInfo != null) { documentSettingsInfo.DocumentWidth = PrintSettingsInfo.PrintDocument.DefaultPageSettings.PaperSize.Width; documentSettingsInfo.DocumentHeight = PrintSettingsInfo.PrintDocument.DefaultPageSettings.PaperSize.Height; documentSettingsInfo.margins = PrintSettingsInfo.PrintDocument.DefaultPageSettings.Margins; documentSettingsInfo.DocumentBounds = PrintSettingsInfo.PrintDocument.DefaultPageSettings.Bounds; SetPreview(); CaculatePrintedPageCount(); SetPaperCollection(); PaintPageByCurrentPreviewIndex(1); } } } }