using ComPDFKit.PDFPage; using ComPDFKitViewer.PdfViewer; using ImageMagick.Formats; using ImTools; using Microsoft.Office.Core; using PDF_Office.EventAggregators; using PDF_Office.Helper; using PDF_Office.Model; using PDF_Office.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.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_Office.ViewModels.Dialog.HomePageToolsDialogs.HomePagePrinter.HomePagePrinterDocumentContentViewModel; namespace PDF_Office.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; /// /// 海报模式:打印纸 /// int posterPrintPaperIndex = 0; /// /// 海报模式,水平纸张数 /// public int HorizonPaperCount = 0; /// /// 海报模式,垂直纸张数 /// public int VerticalPaperCount = 0; /// ///海报模式当前水平纸 /// public int HorizonPaperIndex = 0; /// ///海报模式当前垂直纸 /// public int VerticalPaperIndex = 0; /// /// 海报模式,总打印纸张数 /// public int WholePaperCountModPoster = 0; public double PosterRatio = 0; /// /// 转存防卡顿 /// 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 DocumentSettingsInfo documentSettingsInfo = new DocumentSettingsInfo(); /// /// 用于判断是否需要跳转第一页 /// int PreviousPrintedPageCount = 0; public int PrintIndex; /// ///打印纸dpi100, PDF dpi 72,需要缩放 /// public double dpiRatio = 100.0 / 72.0; Bitmap blankPageBitmap; 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) { printDocument.PrinterSettings.Duplex = Duplex.Horizontal; } else { printDocument.PrinterSettings.Duplex = Duplex.Vertical; } } 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.Print(); } } 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; } private void PrintDocumentModSize(PrintPageEventArgs e) { SizeInfo sizeInfo = (SizeInfo)PrintSettingsInfo.PrintModInfo; CPDFPage cPDFPage = PDFViewer.Document.PageAtIndex(PrintSettingsInfo.PageRangeList[PrintIndex]); 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); 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 = ToolMethod.RenderPageBitmapNoWait(PDFViewer.Document, (int)(cPDFPage.PageSize.Width * dpiRatio), (int)(cPDFPage.PageSize.Height * dpiRatio), PrintSettingsInfo.PageRangeList[PrintIndex], PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (PrintSettingsInfo.IsGrayscale) { bitmap = ToGray(bitmap, 0); } /// ///自适应模式 /// if (sizeInfo.EnumSizeType == EnumSizeType.StatusAdaptive) { double mmToDpiRatio = 100 / 25.4; 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); if (IsManualDuplex && PrintIndex % 2 == 1 && sizeInfo.EnumDuplexPrintMod == EnumDuplexPrintMod.StatusFlipShortEdge) { printBitmap.RotateFlip(RotateFlipType.Rotate180FlipNone); } e.Graphics.DrawImage(printBitmap, realBound); } 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); if (IsManualDuplex && PrintIndex % 2 == 1 && sizeInfo.EnumDuplexPrintMod == EnumDuplexPrintMod.StatusFlipShortEdge) { printBitmap.RotateFlip(RotateFlipType.Rotate180FlipNone); } e.Graphics.DrawImage(printBitmap, realBound); } 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); if (IsManualDuplex && PrintIndex % 2 == 1 && sizeInfo.EnumDuplexPrintMod == EnumDuplexPrintMod.StatusFlipShortEdge) { printBitmap.RotateFlip(RotateFlipType.Rotate180FlipNone); } e.Graphics.DrawImage(printBitmap, realBound); } bitmap.Dispose(); printBitmap.Dispose(); } //手动双面打印,且页码不为1 if (IsManualDuplex && PrintSettingsInfo.PageRangeList.Count != 1) { if (PrintIndex < PrintedPageCount - 2) { PrintIndex += 2; e.HasMorePages = true; } else { e.HasMorePages = false; } } //单面打印 else { if (PrintIndex < PrintedPageCount - 1) { PrintIndex++; e.HasMorePages = true; } else { e.HasMorePages = false; } } } private void PrintDocumentModPoster(PrintPageEventArgs e) { PosterInfo posterInfo = (PosterInfo)PrintSettingsInfo.PrintModInfo; var pageBound = documentSettingsInfo.DocumentBounds; System.Drawing.Point startPoint = new System.Drawing.Point(0, 0); double effectiveHeight = 0; double effectiveWidth = 0; //计算有效打印区域 if (PrintSettingsInfo.EnumPrintOrientation == EnumPrintOrientation.StatusPortrait) { effectiveHeight = documentSettingsInfo.DocumentHeight; effectiveWidth = documentSettingsInfo.DocumentWidth; } else { effectiveHeight = documentSettingsInfo.DocumentWidth; effectiveWidth = documentSettingsInfo.DocumentHeight; } double PreviewHeight = 0; double PreviewWidth = 0; Bitmap bitmap = null; Bitmap displayBitmap = null; effectiveHeight = effectiveHeight - 2 * posterInfo.OverLap * 100 / 25.4; effectiveWidth = effectiveWidth - 2 * posterInfo.OverLap * 100 / 25.4; if (posterInfo.HasLabel || posterInfo.HasCutMarks) { effectiveHeight = effectiveHeight - 40; effectiveWidth = effectiveWidth - 40; } ///无论是拆分还是平铺,页面缩放比例都会在预览中完成 ///先渲染整图 ///得到effective域大小 ///根据effective的量和重叠量计算开始的bitmap ///加字和标记 ///字加在顶部,标记加在四角 ///结束后翻页 ///对于Tile页数不定,但是比例相等 ///对于split页数固定,但是比例变化 ///平铺模式: ///从第一页开始,先计算当前页总纸张数 ///根据纸张数打印 ///打印到位时页数进一 ///页数到顶,纸数到顶打印结束 ///当一页只有一张纸的时候,注意特殊处理 if (posterInfo.EnumPosterMod == EnumPosterMod.StatusTile) { CPDFPage cPDFPage = PDFViewer.Document.PageAtIndex(PrintSettingsInfo.PageRangeList[posterPrintPaperIndex]); if (cPDFPage != null) { bitmap = ToolMethod.RenderPageBitmapNoWait(PDFViewer.Document, (int)(cPDFPage.PageSize.Width * dpiRatio * (posterInfo.TileRatio / 100.0)), (int)(cPDFPage.PageSize.Height * dpiRatio * (posterInfo.TileRatio / 100.0)), PrintSettingsInfo.PageRangeList[posterPrintPaperIndex], PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); HorizonPaperCount = (int)Math.Ceiling((double)bitmap.Width / effectiveWidth); VerticalPaperCount = (int)Math.Ceiling(((double)bitmap.Height / effectiveHeight)); int wholeCountSinglePage = HorizonPaperCount * VerticalPaperCount;//每一轮的总页数 PreviewWidth = (double)(effectiveWidth * HorizonPaperCount); PreviewHeight = (double)(effectiveHeight * VerticalPaperCount); 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); } //取到和渲染一样的Bitmap displayBitmap = CombineBitmap(displayBitmap, bitmap, startPoint); ///当前页未打印完 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 * 100 / 24.5), rectangle.Location.Y); } ///上重叠 if (VerticalPaperIndex != 0) { rectangle.Size = new System.Drawing.Size(rectangle.Size.Width, (int)(rectangle.Size.Height + posterInfo.OverLap * 100 / 24.5)); } ///右重叠 if (HorizonPaperIndex != HorizonPaperCount) { rectangle.Size = new System.Drawing.Size((int)(rectangle.Size.Width + posterInfo.OverLap * 100 / 24.5), rectangle.Size.Height); } ///下重叠 if (VerticalPaperIndex != VerticalPaperCount) { rectangle.Location = new System.Drawing.Point(rectangle.Location.X, (int)(rectangle.Location.Y - posterInfo.OverLap * 100 / 24.5)); } Bitmap currentPrintbitmap = Crop(displayBitmap, rectangle); ///当存在边沿时 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}.pdf {3} {4}", HorizonPaperIndex + 1, VerticalPaperIndex + 1, PrintIndex + 1, 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 (PrintSettingsInfo.EnumPrintOrientation == EnumPrintOrientation.StatusPortrait) { 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.Height - margin, -margin, margin * 2, margin * 2)); } if (!(HorizonPaperIndex == 0 && VerticalPaperIndex == VerticalPaperCount - 1)) { e.Graphics.DrawRectangle(pen, new Rectangle(-margin, (int)pageBound.Width - margin, margin * 2, margin * 2)); } if (!(HorizonPaperIndex == HorizonPaperCount - 1 && VerticalPaperIndex == VerticalPaperCount - 1)) { e.Graphics.DrawRectangle(pen, new Rectangle(pageBound.Height - margin, (int)pageBound.Width - margin, margin * 2, margin * 2)); } } e.Graphics.DrawImage(currentPrintbitmap, new Rectangle(margin, margin, (int)pageBound.Height - margin * 2, (int)pageBound.Width - margin * 2)); } else { 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)); } } e.Graphics.DrawImage(currentPrintbitmap, new Rectangle(margin, margin, (int)pageBound.Width - margin * 2, (int)pageBound.Height - margin * 2)); } 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++; HorizonPaperIndex = 0; VerticalPaperIndex = 0; e.HasMorePages = true; } else { e.HasMorePages = false; } } //当一页只有一张打印纸的时候 else if (wholeCountSinglePage == 1) { PreviewWidth = (double)effectiveWidth; PreviewHeight = (double)effectiveHeight; 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); } //取到和渲染一样的Bitmap displayBitmap = CombineBitmap(displayBitmap, bitmap, startPoint); e.Graphics.DrawImage(displayBitmap, e.PageBounds); if (posterPrintPaperIndex < PrintedPageCount - 1) { ///当前总文件未打印完 posterPrintPaperIndex++; 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; } bitmap = ToolMethod.RenderPageBitmapNoWait(PDFViewer.Document, (int)resizedWidth, (int)resizedHeight, PrintSettingsInfo.PageRangeList[PrintPageIndex], 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); displayBitmap = CombineBitmap(displayBitmap, bitmap, 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 * 100 / 24.5), rectangle.Location.Y); } ///上重叠 if (VerticalPaperIndex != 0) { rectangle.Size = new System.Drawing.Size(rectangle.Size.Width, (int)(rectangle.Size.Height + posterInfo.OverLap * 100 / 24.5)); } ///右重叠 if (HorizonPaperIndex != HorizonPaperCount) { rectangle.Size = new System.Drawing.Size((int)(rectangle.Size.Width + posterInfo.OverLap * 100 / 24.5), rectangle.Size.Height); } ///下重叠 if (VerticalPaperIndex != VerticalPaperCount) { rectangle.Location = new System.Drawing.Point(rectangle.Location.X, (int)(rectangle.Location.Y - posterInfo.OverLap * 100 / 24.5)); } ///当存在边沿时 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}.pdf {3} {4}", HorizonPaperIndex + 1, VerticalPaperIndex + 1, PrintIndex + 1, 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.Height - margin, -margin, margin * 2, margin * 2)); } if (!(HorizonPaperIndex == 0 && VerticalPaperIndex == VerticalPaperCount - 1)) { e.Graphics.DrawRectangle(pen, new Rectangle(-margin, (int)pageBound.Width - margin, margin * 2, margin * 2)); } if (!(HorizonPaperIndex == HorizonPaperCount - 1 && VerticalPaperIndex == VerticalPaperCount - 1)) { e.Graphics.DrawRectangle(pen, new Rectangle(pageBound.Height - margin, (int)pageBound.Width - margin, margin * 2, margin * 2)); } } Bitmap currentPrintbitmap = Crop(displayBitmap, rectangle); e.Graphics.DrawImage(currentPrintbitmap, new Rectangle(margin, margin, (int)pageBound.Height - margin * 2, (int)pageBound.Width - margin * 2)); if (PrintIndex < WholePaperCountModPoster - 1) { PrintIndex++; e.HasMorePages = true; } else { e.HasMorePages = false; } } } private void PrintDocumentModMultiple(PrintPageEventArgs e) { MultipleInfo multipleInfo = (MultipleInfo)PrintSettingsInfo.PrintModInfo; int singlePageHeight; int singlePageWidth; Bitmap printBitmap; int currentPage = 0; 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); 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[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; } pageBitmap = ToolMethod.RenderPageBitmapNoWait(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[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), (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); } } 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; } } } if (IsManualDuplex && PrintIndex % 2 == 1 && multipleInfo.EnumDuplexPrintMod == EnumDuplexPrintMod.StatusFlipShortEdge) { printBitmap.RotateFlip(RotateFlipType.Rotate180FlipNone); } e.Graphics.DrawImage(printBitmap, realBound); if (IsManualDuplex) { if (PrintIndex < PrintedPageCount - 2) { PrintIndex += 2; e.HasMorePages = true; } else { e.HasMorePages = false; } } //单面打印 else { if (PrintIndex < PrintedPageCount - 1) { PrintIndex++; e.HasMorePages = true; } else { e.HasMorePages = false; } } } private void PrintDocumentModBooklet(PrintPageEventArgs e) { BookletInfo bookletInfo = (BookletInfo)PrintSettingsInfo.PrintModInfo; ///空白画布 Bitmap printBitmap; double singlePageHeight = 0; double singlePageWidth = 0; 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); 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 ((TargetPaperList[PrintIndex + 1] + 1) % 2 == 1) { try { leftPageIndex = PrintSettingsInfo.PageRangeList[maxPaperNumber * 4 - TargetPaperList[PrintIndex + 1] - 1]; leftPage = PDFViewer.Document.PageAtIndex(leftPageIndex); } catch { leftPage = null; } rightPageIndex = PrintSettingsInfo.PageRangeList[TargetPaperList[PrintIndex + 1]]; //左面 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 ((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(); } } } //右面 rightPage = PDFViewer.Document.PageAtIndex(rightPageIndex); startPoint.X = (int)singlePageWidth; if (rightPage != null) { 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 ((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[TargetPaperList[PrintIndex + 1]]; //左面 leftPage = PDFViewer.Document.PageAtIndex(leftPageIndex); 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 ((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 - TargetPaperList[PrintIndex + 1]]; rightPage = PDFViewer.Document.PageAtIndex(rightPageIndex); } catch { rightPage = null; } startPoint.X = (int)singlePageWidth; if (rightPage != null) { 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 ((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 ((TargetPaperList[PrintIndex + 1] + 1) % 2 == 0) { try { leftPageIndex = PrintSettingsInfo.PageRangeList[maxPaperNumber * 4 - TargetPaperList[PrintIndex + 1] - 1]; leftPage = PDFViewer.Document.PageAtIndex(leftPageIndex); } catch { leftPage = null; } rightPageIndex = PrintSettingsInfo.PageRangeList[TargetPaperList[PrintIndex + 1]]; //左面 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 ((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(); } } } //右面 rightPage = PDFViewer.Document.PageAtIndex(rightPageIndex); startPoint.X = (int)singlePageWidth; if (rightPage != null) { ///重设大小 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 ((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.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[TargetPaperList[PrintIndex + 1]]; //左面 leftPage = PDFViewer.Document.PageAtIndex(leftPageIndex); 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 ((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); 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 - TargetPaperList[PrintIndex + 1]]; rightPage = PDFViewer.Document.PageAtIndex(rightPageIndex); } catch { rightPage = null; } startPoint.X = (int)singlePageWidth; if (rightPage != null) { 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 ((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(); } } } } } e.Graphics.DrawImage(printBitmap, realBound); if (IsManualDuplex) { if (PrintIndex < PrintedPageCount - 2) { PrintIndex += 2; e.HasMorePages = true; } else { e.HasMorePages = false; } } //单面打印 else { if (PrintIndex < PrintedPageCount - 1) { PrintIndex++; e.HasMorePages = true; } else { e.HasMorePages = false; } } } 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) { 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; 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(); } } /// /// bitmap->bitmapsource转换器,用于显示到image控件 /// /// /// Bitmap格式图片资源 /// /// public static BitmapSource ToBitmapSource(System.Drawing.Bitmap bmp) { IntPtr ptr = bmp.GetHbitmap();//obtain the Hbitmap 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; } public Bitmap ResizeBitmap(Bitmap bitmap) { Resize(bitmap, (int)float.Parse(ViewBoxHeight), (int)float.Parse(ViewBoxWidth)); return bitmap; } /// /// 创建空白底图 /// private void 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); } } /// /// 设置预览(除海报) /// public void SetPreviewExceptPoster() { if (PrintSettingsInfo.PrintModInfo.EnumPrintMod != EnumPrintMod.StatusPoster) { 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); } SetViewBox(double.Parse(PaperHeight), double.Parse(PaperWidth)); } CreateBlankBitmap(); } /// /// 直接Resize到给定大小 /// /// /// /// /// public static 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.Default; //设定插值方式 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 * dpiRatio), (int)(cPDFPage.PageSize.Height * dpiRatio), PrintSettingsInfo.PageRangeList[paperIndex], PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); if (PrintSettingsInfo.IsGrayscale) { bitmap = ToGray(bitmap, 0); } /// ///自适应模式 /// if (sizeInfo.EnumSizeType == EnumSizeType.StatusAdaptive) { double mmToDpiRatio = 100 / 25.4; 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 * dpiRatio * (posterInfo.TileRatio / 100.0)), (int)(cPDFPage.PageSize.Height * dpiRatio * (posterInfo.TileRatio / 100.0)), PrintSettingsInfo.PageRangeList[paperIndex], PrintSettingsInfo.IsPrintWithAnnot, PrintSettingsInfo.IsPrintWithForm); } catch { bitmap = await ToolMethod.RenderPageBitmap(PDFViewer.Document, (int)(cPDFPage.PageSize.Width * dpiRatio), (int)(cPDFPage.PageSize.Height * dpiRatio), 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.Black, HorizonPaperCount * 5), 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.Black, VerticalPaperCount * 5), 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)(documentSettingsInfo.DocumentWidth * HorizonPaperCount); PreviewHeight = (double)(documentSettingsInfo.DocumentHeight * 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.Black, HorizonPaperCount * 5), 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.Black, VerticalPaperCount * 5), 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); } /// /// 按照模式绘制指定纸张 /// /// private void PaintPageByCurrentPreviewIndex(int TargetPaperIndex) { if (PrintSettingsInfo.PrintModInfo.EnumPrintMod == EnumPrintMod.StatusSize) { SetPreviewExceptPoster(); PreviewModSize(TargetPaperList[TargetPaperIndex]); } else if (PrintSettingsInfo.PrintModInfo.EnumPrintMod == EnumPrintMod.StatusPoster) { PreviewModPoster(TargetPaperList[TargetPaperIndex]); } else if (PrintSettingsInfo.PrintModInfo.EnumPrintMod == EnumPrintMod.StatusMultiple) { SetPreviewExceptPoster(); PreviewModMultiple(TargetPaperList[TargetPaperIndex]); } else if (PrintSettingsInfo.PrintModInfo.EnumPrintMod == EnumPrintMod.StatusBooklet) { SetPreviewExceptPoster(); 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; SetPreviewExceptPoster(); CaculatePrintedPageCount(); SetPaperCollection(); PaintPageByCurrentPreviewIndex(1); } } } }