|
@@ -24,10 +24,7 @@ namespace ComPDFKit.Controls.Printer
|
|
|
|
|
|
public static class PrintHelper
|
|
|
{
|
|
|
-
|
|
|
- public static readonly PrintServer printServer = new PrintServer();
|
|
|
private static PrintSettingsInfo printSettingsInfo;
|
|
|
- private static PrintQueue printQueue;
|
|
|
private static int MaxCopies = 1;
|
|
|
private static bool FinishedFrontSide = false;
|
|
|
private static bool isManualDuplex = false;
|
|
@@ -36,17 +33,34 @@ namespace ComPDFKit.Controls.Printer
|
|
|
private static Bitmap blankPageBitmapForPrint;
|
|
|
private static int PrintIndex;
|
|
|
|
|
|
+ public static PrintQueue printQueue;
|
|
|
+
|
|
|
+ public static void InitPrint()
|
|
|
+ {
|
|
|
+ MaxCopies = 1;
|
|
|
+ FinishedFrontSide = false;
|
|
|
+ isManualDuplex = false;
|
|
|
+ outputColors = new List<OutputColor>();
|
|
|
+ duplexings = new List<Duplexing>();
|
|
|
+ blankPageBitmapForPrint = null;
|
|
|
+ PrintIndex = 0;
|
|
|
+ }
|
|
|
+
|
|
|
private static void SetPrinterLimits()
|
|
|
{
|
|
|
MaxCopies = printQueue.GetPrintCapabilities().MaxCopyCount.HasValue ? printQueue.GetPrintCapabilities().MaxCopyCount.Value : 1;
|
|
|
outputColors = new List<OutputColor>(printQueue.GetPrintCapabilities().OutputColorCapability);
|
|
|
duplexings = new List<Duplexing>(printQueue.GetPrintCapabilities().DuplexingCapability);
|
|
|
}
|
|
|
+
|
|
|
+ public static PrintQueue GetPrintQueue(PrintServer server, string printerName)
|
|
|
+ {
|
|
|
+ return server.GetPrintQueue(printerName);
|
|
|
+ }
|
|
|
|
|
|
public static void PrintDocument(PrintSettingsInfo printSettings)
|
|
|
- {
|
|
|
- printSettingsInfo = printSettings;
|
|
|
- printQueue = printServer.GetPrintQueue(printSettings.PrinterName);
|
|
|
+ {
|
|
|
+ printSettingsInfo = printSettings;
|
|
|
|
|
|
SetPrinterLimits();
|
|
|
|
|
@@ -73,8 +87,8 @@ namespace ComPDFKit.Controls.Printer
|
|
|
HandlePrintQueue(DuplexingStage.FontSide);
|
|
|
if (FinishedFrontSide)
|
|
|
{
|
|
|
- DialogResult dialogResult = MessageBox.Show("Do you want to print the back side?", "Print", MessageBoxButtons.YesNo);
|
|
|
- if (dialogResult == DialogResult.OK)
|
|
|
+ DialogResult dialogResult = MessageBox.Show("Print the back side.", "Print", MessageBoxButtons.YesNo);
|
|
|
+ if (dialogResult == DialogResult.Yes)
|
|
|
{
|
|
|
HandlePrintQueue(DuplexingStage.BackSide);
|
|
|
}
|
|
@@ -101,14 +115,24 @@ namespace ComPDFKit.Controls.Printer
|
|
|
var printTicket = new PrintTicket();
|
|
|
|
|
|
printDocument.PrinterSettings.PrinterName = printQueue.Name;
|
|
|
-
|
|
|
+
|
|
|
printDocument.DefaultPageSettings.Color = !printSettingsInfo.IsGrayscale && outputColors.Contains(OutputColor.Color);
|
|
|
|
|
|
+ printTicket.PageOrientation = printSettingsInfo.PrintOrientation;
|
|
|
+
|
|
|
if (printSettingsInfo.DuplexPrintMod > 0 || printSettingsInfo.PrintMode is BookletModeInfo)
|
|
|
{
|
|
|
if (stage == DuplexingStage.None)
|
|
|
{
|
|
|
- printDocument.DefaultPageSettings.Landscape = (printSettingsInfo.PrintOrientation == PrintOrientation.Landscape);
|
|
|
+ if (printSettingsInfo.DuplexPrintMod == DuplexPrintMod.FlipLongEdge)
|
|
|
+ {
|
|
|
+ printDocument.PrinterSettings.Duplex = Duplex.Horizontal;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ printDocument.PrinterSettings.Duplex = Duplex.Vertical;
|
|
|
+ }
|
|
|
+ PrintIndex = 0;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -120,15 +144,26 @@ namespace ComPDFKit.Controls.Printer
|
|
|
else
|
|
|
{
|
|
|
printDocument.PrinterSettings.Duplex = Duplex.Simplex;
|
|
|
+ PrintIndex = 0;
|
|
|
}
|
|
|
|
|
|
printQueue.DefaultPrintTicket = printTicket;
|
|
|
printDocument.DefaultPageSettings.PaperSize = printSettingsInfo.PaperSize;
|
|
|
+ printDocument.DefaultPageSettings.Landscape = (printSettingsInfo.PrintOrientation == PageOrientation.Landscape);
|
|
|
+ List<PaperSource> paperSources;
|
|
|
+ if (printDocument.PrinterSettings.PaperSources.Count > 0)
|
|
|
+ {
|
|
|
+ paperSources = Enumerable.Range(0, printDocument.PrinterSettings.PaperSources.Count).
|
|
|
+ Select(i => printDocument.PrinterSettings.PaperSources[i]).ToList();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ PaperSource defaultPaperSource = new PaperSource();
|
|
|
+ defaultPaperSource.SourceName = "Default";
|
|
|
+ paperSources = new List<PaperSource> { defaultPaperSource };
|
|
|
+ }
|
|
|
|
|
|
- List<PaperSource> paperSources = Enumerable.Range(0, printDocument.PrinterSettings.PaperSources.Count).
|
|
|
- Select(i => printDocument.PrinterSettings.PaperSources[i]).ToList();
|
|
|
- printDocument.DefaultPageSettings.Margins = printSettingsInfo.Margins;
|
|
|
- printDocument.DefaultPageSettings.PaperSource = paperSources.FirstOrDefault();
|
|
|
+ printDocument.DefaultPageSettings.Margins = new Margins() { Left = (int)printSettingsInfo.Margins.Left, Bottom = (int)printSettingsInfo.Margins.Bottom, Right = (int)printSettingsInfo.Margins.Right, Top = (int)printSettingsInfo.Margins.Top};
|
|
|
if (printSettingsInfo.Copies >= printQueue.GetPrintCapabilities().MaxCopyCount)
|
|
|
{
|
|
|
printDocument.PrinterSettings.Copies = (short)MaxCopies;
|
|
@@ -138,6 +173,7 @@ namespace ComPDFKit.Controls.Printer
|
|
|
printDocument.PrinterSettings.Copies = (short)printSettingsInfo.Copies;
|
|
|
}
|
|
|
|
|
|
+ printDocument.PrintPage -= PrintDocument_PrintPage;
|
|
|
printDocument.PrintPage += PrintDocument_PrintPage;
|
|
|
|
|
|
printDocument.PrinterSettings.PrintFileName = printSettingsInfo.Document.FileName;
|
|
@@ -145,11 +181,16 @@ namespace ComPDFKit.Controls.Printer
|
|
|
try
|
|
|
{
|
|
|
printDocument.Print();
|
|
|
+ if(stage == DuplexingStage.FontSide)
|
|
|
+ {
|
|
|
+ FinishedFrontSide = true;
|
|
|
+ }
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
MessageBox.Show(ex.Message);
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -275,8 +316,14 @@ namespace ComPDFKit.Controls.Printer
|
|
|
|
|
|
if (printSettingsInfo.PrintMode is SizeModeInfo sizeMode)
|
|
|
{
|
|
|
- CPDFPage page = printSettingsInfo.Document.PageAtIndex(printSettingsInfo.PageRangeList[PrintIndex]);
|
|
|
+ CPDFPage page = printSettingsInfo.Document.PageAtIndex(printSettingsInfo.TargetPaperList[PrintIndex]);
|
|
|
Rectangle realBound = e.PageBounds;
|
|
|
+ if (!printSettingsInfo.IsBorderless)
|
|
|
+ {
|
|
|
+ realBound.Width = realBound.Width - (int)printSettingsInfo.Margins.Left - (int)printSettingsInfo.Margins.Right;
|
|
|
+ realBound.Height = realBound.Height - (int)printSettingsInfo.Margins.Top - (int)printSettingsInfo.Margins.Bottom;
|
|
|
+ }
|
|
|
+ Margins margins = e.PageSettings.Margins;
|
|
|
Point point = new Point(0, 0);
|
|
|
|
|
|
if (page != null)
|
|
@@ -299,18 +346,34 @@ namespace ComPDFKit.Controls.Printer
|
|
|
int resizeHeight;
|
|
|
int resizeWidth;
|
|
|
|
|
|
- if (bitmap.Height / bitmap.Width >= printSettingsInfo.PaperSize.Height / printSettingsInfo.PaperSize.Width)
|
|
|
+ if (bitmap.Height / bitmap.Width >= (printSettingsInfo.ActualHeight / printSettingsInfo.ActualWidth))
|
|
|
{
|
|
|
- resizeHeight = printSettingsInfo.PaperSize.Height * heightDpiRatio;
|
|
|
- resizeWidth = bitmap.Width * printSettingsInfo.PaperSize.Height / bitmap.Height * widthDpiRatio;
|
|
|
+ if (printSettingsInfo.PrintOrientation == PageOrientation.Portrait)
|
|
|
+ {
|
|
|
+ resizeHeight = (int)printSettingsInfo.ActualHeight;
|
|
|
+ resizeWidth = (int)(printSettingsInfo.ActualHeight / bitmap.Height * bitmap.Width);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ resizeWidth = (int)printSettingsInfo.ActualHeight;
|
|
|
+ resizeHeight = (int)(printSettingsInfo.ActualHeight / bitmap.Height * bitmap.Width);
|
|
|
+ }
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- resizeWidth = printSettingsInfo.PaperSize.Width * widthDpiRatio;
|
|
|
- resizeHeight = bitmap.Height * printSettingsInfo.PaperSize.Width / bitmap.Width * heightDpiRatio;
|
|
|
+ if (printSettingsInfo.PrintOrientation == PageOrientation.Portrait)
|
|
|
+ {
|
|
|
+ resizeWidth = (int)printSettingsInfo.ActualWidth;
|
|
|
+ resizeHeight = (int)(printSettingsInfo.ActualWidth / bitmap.Width * bitmap.Height);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ resizeHeight = (int)printSettingsInfo.ActualWidth;
|
|
|
+ resizeWidth = (int)(printSettingsInfo.ActualWidth / bitmap.Height * bitmap.Width);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- using (Bitmap resizedBitmap = new Bitmap(bitmap, resizeWidth, resizeHeight))
|
|
|
+ using (Bitmap resizedBitmap = new Bitmap(bitmap, resizeWidth * widthDpiRatio, resizeHeight * heightDpiRatio))
|
|
|
{
|
|
|
if (isManualDuplex && PrintIndex % 2 == 1 && printSettingsInfo.DuplexPrintMod == DuplexPrintMod.FlipShortEdge)
|
|
|
{
|
|
@@ -330,7 +393,23 @@ namespace ComPDFKit.Controls.Printer
|
|
|
realBound.Width = (int)(realBound.Height * aspectRatioResizedBitmap);
|
|
|
}
|
|
|
}
|
|
|
- e.Graphics.DrawImage(resizedBitmap, realBound, new Rectangle(0, 0, resizedBitmap.Width, resizedBitmap.Height), GraphicsUnit.Pixel);
|
|
|
+
|
|
|
+ int originX = (e.PageBounds.Width - realBound.Width)/2;
|
|
|
+ int originY = (e.PageBounds.Height - realBound.Height)/2;
|
|
|
+ if (!printSettingsInfo.IsBorderless)
|
|
|
+ {
|
|
|
+ if (originX < printSettingsInfo.Margins.Left)
|
|
|
+ {
|
|
|
+ originX = (int)printSettingsInfo.Margins.Left;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (originY < printSettingsInfo.Margins.Top)
|
|
|
+ {
|
|
|
+ originY = (int)printSettingsInfo.Margins.Top;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ e.Graphics.DrawImage(resizedBitmap, new Rectangle(originX, originY, realBound.Width, realBound.Height), new Rectangle(0, 0, resizedBitmap.Width, resizedBitmap.Height), GraphicsUnit.Pixel);
|
|
|
}
|
|
|
}
|
|
|
else if (sizeMode.SizeType == SizeType.Actural)
|
|
@@ -355,7 +434,21 @@ namespace ComPDFKit.Controls.Printer
|
|
|
realBound.Width = (int)(realBound.Height * aspectRatioResizedBitmap);
|
|
|
}
|
|
|
}
|
|
|
- e.Graphics.DrawImage(resizedBitmap, realBound, new Rectangle(0, 0, resizedBitmap.Width, resizedBitmap.Height), GraphicsUnit.Pixel);
|
|
|
+ int originX = (e.PageBounds.Width - realBound.Width) / 2;
|
|
|
+ int originY = (e.PageBounds.Height - realBound.Height) / 2;
|
|
|
+ if (!printSettingsInfo.IsBorderless)
|
|
|
+ {
|
|
|
+ if (originX < printSettingsInfo.Margins.Left)
|
|
|
+ {
|
|
|
+ originX = (int)printSettingsInfo.Margins.Left;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (originY < printSettingsInfo.Margins.Top)
|
|
|
+ {
|
|
|
+ originY = (int)printSettingsInfo.Margins.Top;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ e.Graphics.DrawImage(resizedBitmap, new Rectangle(originX, originY, realBound.Width, realBound.Height), new Rectangle(0, 0, resizedBitmap.Width, resizedBitmap.Height), GraphicsUnit.Pixel);
|
|
|
}
|
|
|
}
|
|
|
else if (sizeMode.SizeType == SizeType.Customized)
|
|
@@ -384,10 +477,21 @@ namespace ComPDFKit.Controls.Printer
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- realBound.X = (e.PageBounds.Width - realBound.Width) / 2;
|
|
|
- realBound.Y = (e.PageBounds.Height - realBound.Height) / 2;
|
|
|
+ int originX = (e.PageBounds.Width - realBound.Width) / 2;
|
|
|
+ int originY = (e.PageBounds.Height - realBound.Height) / 2;
|
|
|
+ if (!printSettingsInfo.IsBorderless)
|
|
|
+ {
|
|
|
+ if (originX < printSettingsInfo.Margins.Left)
|
|
|
+ {
|
|
|
+ originX = (int)printSettingsInfo.Margins.Left;
|
|
|
+ }
|
|
|
|
|
|
- e.Graphics.DrawImage(resizedBitmap, realBound, new Rectangle(0, 0, resizedBitmap.Width, resizedBitmap.Height), GraphicsUnit.Pixel);
|
|
|
+ if (originY < printSettingsInfo.Margins.Top)
|
|
|
+ {
|
|
|
+ originY = (int)printSettingsInfo.Margins.Top;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ e.Graphics.DrawImage(resizedBitmap, new Rectangle(originX, originY, realBound.Width, realBound.Height), new Rectangle(0, 0, resizedBitmap.Width, resizedBitmap.Height), GraphicsUnit.Pixel);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -419,7 +523,7 @@ namespace ComPDFKit.Controls.Printer
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- e.HasMorePages = false;
|
|
|
+ e.HasMorePages = false;
|
|
|
}
|
|
|
}
|
|
|
}
|