PdfViewer.CustomPrint
Contenu
[
Cacher
]Événement PdfViewer.CustomPrint
Se produit avant le début de l’impression et permet de fournir des gestionnaires d’impression personnalisés au lieu de celui par défaut.
public event EventHandler<CustomPrintEventArgs> CustomPrint;
Exemples
L’exemple démontre comment imprimer depuis Aspose.PDF sur des systèmes Linux. Le code suivant est principalement destiné à l’impression depuis Aspose.PDF sur des systèmes Linux. Les utilisateurs de systèmes Windows peuvent continuer à utiliser l’implémentation d’impression par défaut de PdfViewer sans fournir de gestionnaire CustomPrint.
Prérequis
- Sur le système du serveur d’impression, CUPS doit être installé et configuré :
- sudo apt update && apt install cups
- sudo service cups start
- si vous allez imprimer des documents sur le même système où l’application activée par Aspose.PDF fonctionne, vous n’aurez pas besoin de configuration CUPS supplémentaire. Si vous devez imprimer depuis un système différent, veuillez consulter la documentation CUPS sur la façon de permettre l’accès au serveur d’impression via le réseau.
- Une imprimante peut être configurée en utilisant l’interface web de CUPS. En option, vous pouvez utiliser une imprimante PDF virtuelle :
- sudo apt install printer-driver-cups-pdf
- sudo service cups restart
- veuillez vous assurer que l’imprimante PDF virtuelle est apparue dans la liste des imprimantes disponibles dans l’interface web de CUPS (à http://localhost:631/printers/ avec les paramètres CUPS par défaut)
- Si votre système client (où l’application activée par Aspose.PDF fonctionne) est différent du serveur d’impression, vous devez également installer et exécuter CUPS là-bas :
- sudo apt update && apt install cups
- sudo service cups start
Comment imprimer un document en utilisant la commande lp
var docPath = dataDir + "input.pdf";
var viewer = new PdfViewer();
viewer.BindPdf(docPath);
// Set a custom printing handler that builds an lp command and runs it with bash
viewer.CustomPrint += ViewerOnCustomPrintLp;
// Send the document to the virtual PDF printer installed with the printer-driver-cups-pdf package
var ps = new PrinterSettings
{
PrinterName = "PDF"
};
var pgs = ps.DefaultPageSettings;
pgs.PaperSize = PaperSizes.A4;
// The document will be printed using the provided print handler
viewer.PrintDocumentWithSettings(pgs, ps);
viewer.Close();
// Custom print handler
private void ViewerOnCustomPrintLp(object sender, CustomPrintEventArgs e)
{
var sb = new StringBuilder("lp ");
// Set the name of the printer to print at
sb.AppendFormat("-d {0} ", e.PrinterSettings.PrinterName);
// Set the number of copies
if (e.PrinterSettings.Copies > 0)
{
sb.AppendFormat("-n {0} ", e.PrinterSettings.Copies);
}
// Set the range of pages to print
if (e.PrinterSettings.PrintRange == PrintRange.SomePages)
{
sb.AppendFormat("-P {0}-{1} ", e.PrinterSettings.FromPage, e.PrinterSettings.ToPage);
}
// Set paper size
sb.AppendFormat("-o media={0} ", e.PageSettings.PaperSize.Kind.ToString("G").ToLower());
// Set landscape orientation if requested
if (e.PageSettings.Landscape)
{
sb.Append("-o orientation-requested=4 ");
}
// Set printer resolution
switch (e.PageSettings.PrinterResolution.Kind)
{
case PrinterResolutionKind.High:
sb.Append("-o print-quality=5 ");
break;
case PrinterResolutionKind.Medium:
sb.Append("-o print-quality=4 ");
break;
case PrinterResolutionKind.Draft:
sb.Append("-o print-quality=3 ");
break;
}
// Set two-sided print if requested
switch (e.PrinterSettings.Duplex)
{
case Duplex.Simplex:
sb.Append("-o sides=one-sided ");
break;
case Duplex.Vertical:
sb.Append("-o sides=two-sided-short-edge ");
break;
case Duplex.Horizontal:
sb.Append("-o sides=two-sided-long-edge ");
break;
}
// The name of the file to print
sb.AppendFormat("-- {0} ", e.FileName);
// Run the prepared lp command with bash
var psi = new ProcessStartInfo
{
FileName = "/bin/bash",
Arguments = string.Format("-c \"{0}\"", sb.ToString()),
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
using (var process = Process.Start(psi))
{
process.WaitForExit();
}
}
Comment imprimer un document en utilisant ipptool
var docPath = dataDir + "input.pdf";
var viewer = new PdfViewer();
viewer.BindPdf(docPath);
// Set a custom printing handler that builds an ipptool job file and runs ipptool with bash
viewer.CustomPrint += ViewerOnCustomPrintIpptool;
// Send the document to the virtual PDF printer installed with the printer-driver-cups-pdf package
var ps = new PrinterSettings
{
PrinterUri = new Uri("ipp://localhost/printers/PDF");
};
var pgs = ps.DefaultPageSettings;
pgs.PaperSize = PaperSizes.A4;
// The document will be printed using the provided print handler
viewer.PrintDocumentWithSettings(pgs, ps);
viewer.Close();
// Custom print handler
private void ViewerOnCustomPrintIpptool(object sender, CustomPrintEventArgs e)
{
var command = new StringBuilder("ipptool -tv ");
// The name of the file to print
command.AppendFormat("-f {0} ", e.FileName);
// Set the URI of the printer to print at
command.Append(e.PrinterSettings.PrinterUri);
// Get the temporary file name for the ipptool job file
var jobFile = Path.GetTempFileName();
var sb = new StringBuilder();
sb.AppendLine("{");
// Set job name and type of the job
sb.AppendLine(" NAME \"Print file using Print-Job\"");
sb.AppendLine(" OPERATION Print-Job");
// Set default job settings
sb.AppendLine(" GROUP operation-attributes-tag");
sb.AppendLine(" ATTR charset attributes-charset utf-8");
sb.AppendLine(" ATTR language attributes-natural-language en");
sb.AppendLine(" ATTR uri printer-uri $uri");
sb.AppendLine(" ATTR name requesting-user-name $user");
sb.AppendLine(" ATTR mimeMediaType document-format $filetype");
sb.AppendLine(" GROUP job-attributes-tag");
// Set number of copies
var copies = e.PrinterSettings.Copies < 1 ? 1 : e.PrinterSettings.Copies;
sb.AppendFormat(" ATTR integer copies {0}{1}", copies, Environment.NewLine);
sb.AppendLine(" ATTR collection media-col {");
// Set paper size
sb.AppendLine(" MEMBER collection media-size {");
// .NET uses 1/100th of inch to represent paper size while IPP requires 1/1000th of millimeter - conversion is needed
sb.AppendFormat(" MEMBER integer x-dimension {0}{1}", (int) (e.PageSettings.PaperSize.Width * 25.4),
Environment.NewLine);
sb.AppendFormat(" MEMBER integer y-dimension {0}{1}", (int) (e.PageSettings.PaperSize.Height * 25.4),
Environment.NewLine);
sb.AppendLine(" }");
// Set margins
if (pageSettings.Margins != null)
{
sb.AppendFormat(" MEMBER integer media-top-margin {0}{1}", (int) (e.PageSettings.Margins.Top * 25.4),
Environment.NewLine);
sb.AppendFormat(" MEMBER integer media-bottom-margin {0}{1}", (int) (e.PageSettings.Margins.Bottom * 25.4),
Environment.NewLine);
sb.AppendFormat(" MEMBER integer media-left-margin {0}{1}", (int) (e.PageSettings.Margins.Left * 25.4),
Environment.NewLine);
sb.AppendFormat(" MEMBER integer media-top-margin {0}{1}", (int) (e.PageSettings.Margins.Right * 25.4),
Environment.NewLine);
}
sb.AppendLine(" MEMBER keyword media-source \"main\"");
sb.AppendLine(" MEMBER keyword media-type \"stationery\"");
sb.AppendLine(" }");
sb.AppendLine(" FILE $filename");
sb.AppendLine(" STATUS successful-ok");
sb.AppendLine(" STATUS successful-ok-ignored-or-substituted-attributes");
sb.AppendLine(" EXPECT job-id");
sb.AppendLine(" EXPECT job-uri");
sb.AppendLine("}");
// Create ipptool job file
File.WriteAllText(jobFile, sb.ToString());
// Pass the job file to ipptool
command.AppendFormat(" {0}", jobFile);
// Run the prepared ipptool command with bash
var psi = new ProcessStartInfo
{
FileName = "/bin/bash",
Arguments = string.Format("-c \"{0}\"", command.ToString()),
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
using (var process = Process.Start(psi))
{
process.WaitForExit();
}
// Delete temporary job file after the document is printed
File.Delete(jobFile);
}
Voir aussi
- classe CustomPrintEventArgs
- classe PdfViewer
- espace de noms Aspose.Pdf.Facades
- assembly Aspose.PDF