ASCU_ALL/PrintPDF/PdfSharp/Pdf.Printing/PdfFilePrinter.cs

254 lines
9.8 KiB
C#
Raw Normal View History

2020-09-04 12:49:15 +05:00
#region PDFsharp - A .NET library for processing PDF
//
// Authors:
// Stefan Lange
//
// Copyright (c) 2005-2017 empira Software GmbH, Cologne Area (Germany)
//
// http://www.pdfsharp.com
// http://sourceforge.net/projects/pdfsharp
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
#endregion
// Removed
#if true_
namespace PdfSharp.Pdf.Printing
{
// Some googled inforamtion about command line switches:
//
// AcroRd32.exe filename Executes the reader and displays a file.
// AcroRd32.exe /p filename Executes the reader and prints a file.
// AcroRd32.exe /t path printername drivername portname Executes the reader and prints a file
// while suppressing the Acrobat print
// dialog box, then terminating the Reader.
//
// The four parameters of the /t option evaluate to strings.
// printername The name of the Printer.
// drivername Your printer drivers name i.e. whatever apperars in the Driver Used box when viewing printer properties.
// portname The printers port. portname cannot contain any "/" characters; if it does, output is routed to
// the default port for that printer.
//
//
// Acrobat.exe /n Launch a separate instance of the Acrobat application
// Acrobat.exe /s Open Acrobat suppressing the splash screen
// Acrobat.exe /o Open Acrobat suppressing the openfile dialog
// Acrobat.exe /h Open Acrobat in hidden mode
/// <summary>
/// A wrapper around Adobe Reader or Adobe Acrobat that helps to print PDF files.
/// The property AdobeReaderPath must be set before the class can be used for printing.
/// The class was tested with Adobe Reader 7.0.7.
/// If this stuff does not work, <c>please</c> don't write me mails!
/// If you enhance this class, please let me know.
/// </summary>
public class PdfFilePrinter
{
/// <summary>
/// Initializes a new instance of the <see cref="PdfFilePrinter"/> class.
/// </summary>
public PdfFilePrinter()
{ }
/// <summary>
/// Initializes a new instance of the <see cref="PdfFilePrinter"/> class.
/// </summary>
/// <param name="pdfFileName">Name of the PDF file.</param>
public PdfFilePrinter(string pdfFileName)
{
PdfFileName = pdfFileName;
}
/// <summary>
/// Initializes a new instance of the <see cref="PdfFilePrinter"/> class.
/// </summary>
/// <param name="pdfFileName">Name of the PDF file.</param>
/// <param name="printerName">Name of the printer.</param>
public PdfFilePrinter(string pdfFileName, string printerName)
{
_pdfFileName = pdfFileName;
_printerName = printerName;
}
/// <summary>
/// Gets or sets the name of the PDF file to print.
/// </summary>
public string PdfFileName
{
get { return _pdfFileName; }
set { _pdfFileName = value; }
}
string _pdfFileName;
/// <summary>
/// Gets or sets the name of the printer. A typical name looks like '\\myserver\HP LaserJet PCL5'.
/// </summary>
/// <value>The name of the printer.</value>
public string PrinterName
{
get { return _printerName; }
set { _printerName = value; }
}
string _printerName;
/// <summary>
/// Gets or sets the working directory.
/// </summary>
public string WorkingDirectory
{
get { return _workingDirectory; }
set { _workingDirectory = value; }
}
string _workingDirectory;
/// <summary>
/// Prints the PDF file.
/// </summary>
public void Print()
{
Print(-1);
}
/// <summary>
/// Prints the PDF file.
/// </summary>
/// <param name="milliseconds">The number of milliseconds to wait for completing the print job.</param>
public void Print(int milliseconds)
{
if (String.IsNullOrEmpty(_printerName))
_printerName = _defaultPrinterName;
if (String.IsNullOrEmpty(_adobeReaderPath))
throw new InvalidOperationException("No full qualified path to AcroRd32.exe or Acrobat.exe is set.");
if (String.IsNullOrEmpty(_printerName))
throw new InvalidOperationException("No printer name set.");
// Check whether file exists.
string fqName;
if (!string.IsNullOrEmpty(_workingDirectory))
fqName = Path.Combine(_workingDirectory, _pdfFileName);
else
fqName = Path.Combine(Directory.GetCurrentDirectory(), _pdfFileName);
if (!File.Exists(fqName))
throw new InvalidOperationException(String.Format("The file {0} does not exist.", fqName));
// TODO: Check whether printer exists.
try
{
DoSomeVeryDirtyHacksToMakeItWork();
//acrord32.exe /t <- seems to work best
//acrord32.exe /h /p <- some swear by this version
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = _adobeReaderPath;
string args = String.Format("/t \"{0}\" \"{1}\"", _pdfFileName, _printerName);
//Debug.WriteLine(args);
startInfo.Arguments = args;
startInfo.CreateNoWindow = true;
startInfo.ErrorDialog = false;
startInfo.UseShellExecute = false;
if (!String.IsNullOrEmpty(_workingDirectory))
startInfo.WorkingDirectory = _workingDirectory;
Process process = Process.Start(startInfo);
if (!process.WaitForExit(milliseconds))
{
// Kill Adobe Reader/Acrobat
process.Kill();
}
}
catch (Exception ex)
{
// ReSharper disable PossibleIntendedRethrow
throw ex;
// ReSharper restore PossibleIntendedRethrow
}
}
/// <summary>
/// For reasons only Adobe knows the Reader seams to open and shows the document instead of printing it
/// when it was not already running.
/// If you use PDFsharp and have any suggestions to circumvent this function, please let us know.
/// </summary>
void DoSomeVeryDirtyHacksToMakeItWork()
{
if (_runningAcro != null)
{
if (!_runningAcro.HasExited)
return;
_runningAcro.Dispose();
_runningAcro = null;
}
// Is any Adobe Reader/Acrobat running?
Process[] processes = Process.GetProcesses();
int count = processes.Length;
for (int idx = 0; idx < count; idx++)
{
try
{
Process process = processes[idx];
ProcessModule module = process.MainModule;
if (String.Compare(Path.GetFileName(module.FileName), Path.GetFileName(_adobeReaderPath), StringComparison.OrdinalIgnoreCase) == 0)
{
// Yes: Fine, we can print.
_runningAcro = process;
break;
}
}
catch { }
}
if (_runningAcro == null)
{
// No: Start an Adobe Reader/Acrobat.
// If you are within ASP.NET, good luck...
_runningAcro = Process.Start(_adobeReaderPath);
if (_runningAcro != null)
_runningAcro.WaitForInputIdle();
}
}
static Process _runningAcro;
/// <summary>
/// Gets or sets the Adobe Reader or Adobe Acrobat path.
/// A typical name looks like 'C:\Program Files\Adobe\Adobe Reader 7.0\AcroRd32.exe'.
/// </summary>
static public string AdobeReaderPath
{
get { return _adobeReaderPath; }
set { _adobeReaderPath = value; }
}
static string _adobeReaderPath;
/// <summary>
/// Gets or sets the name of the default printer. A typical name looks like '\\myserver\HP LaserJet PCL5'.
/// </summary>
static public string DefaultPrinterName
{
get { return _defaultPrinterName; }
set { _defaultPrinterName = value; }
}
static string _defaultPrinterName;
}
}
#endif