打印 PDF 文件 C#

许多公司在很大程度上减少了纸张的使用。但是,在某些情况下,打印很重要。例如,系统可能包含 PDF 格式的在线订单的详细信息。他们需要在发送在线订单以进行交付时打印 PDF。他们大规模处理项目,因此手动打印每个文档可能是一项艰巨的任务。 Aspose.PDF for .NET API 除了许多其他文件操作和转换功能外,还支持 PDF 文件的高效打印。让我们探索以下与使用 C# 在 .NET 应用程序中打印 PDF 文件相关的用例:

使用 C# 打印 PDF 文件

可以使用 C# 或 VB.net 在您的 .NET 应用程序中自动打印 PDF 文件。您可以按照以下简单步骤打印 PDF 文件:

  1. 创建 PdfViewer 类的对象
  2. 加载输入的 PDF 文档
  3. 打印 PDF 文件

下面的代码片段显示了如何使用 C# 打印 PDF 文件:

//创建 PdfViewer 对象
PdfViewer viewer = new PdfViewer();
//打开输入 PDF 文件
viewer.BindPdf(dataDir + "Test.pdf");
//打印 PDF 文件
viewer.PrintDocument();
//关闭 PDF 文件
viewer.Close();

使用 C# 打印多个 PDF 文件

如果您因为业务性质需要打印多个文件,那么 Aspose.PDF for .NET API 已经支持该功能。使用上面的代码片段一个一个地打印多个 PDF 文件可能会有点慢。因此,让我们将PDF打印更进一步,以使过程更容易。在这里,我们将使用 List,同时将每个 PDF 文件的名称添加到该列表中。以下步骤说明了我们将如何打印多个 PDF 文件:

  1. 初始化一个字符串类型的列表
  2. 将 PDF 文件添加到列表
  3. 加载输入 PDF 文件
  4. 打印多个 PDF 文件

代码片段展示了如何使用 C# 打印多个 PDF 文件:

var files = new List<string>();
files.Add(dataDir + "First.pdf");
files.Add(dataDir + "Second.pdf");

foreach (String file in files)
{
    //创建 PdfViewer 对象
    PdfViewer viewer = new PdfViewer();
    //打开输入 PDF 文件
    viewer.BindPdf(file);
    //打印 PDF 文件
    viewer.PrintDocument();
    //关闭 PDF 文件
    viewer.Close();
}

使用 C# 打印 PDF 的特定页面

API 中提供了打印 PDF 文档特定页面的功能。我们将考虑一个包含打印多个页面范围的示例。您需要按照以下步骤中的说明指定从页码和到页码:

  • 设置文件输入输出路径
  • 通过定义范围设置特定页面的打印
  • 指定打印参数
  • 打印之前指定的页面

下面的代码片段显示了如何使用 C# 打印文档的特定页面:

string inPdf = dataDir + "Test.pdf";
string output = dataDir;
IList<PrintingJobSettings> printingJobs = new List<PrintingJobSettings>();
PrintingJobSettings printingJob1 = new PrintingJobSettings();
printingJob1.FromPage = 2;
printingJob1.ToPage = 3;
printingJobs.Add(printingJob1);

PrintingJobSettings printingJob2 = new PrintingJobSettings();
printingJob2.FromPage = 5;
printingJob2.ToPage = 7;
printingJobs.Add(printingJob2);

{
   for (var printingJobIndex = 0; printingJobIndex < printingJobs.Count; printingJobIndex++)
    {
        System.Drawing.Printing.PageSettings pgs = new System.Drawing.Printing.PageSettings();
        System.Drawing.Printing.PrinterSettings ps = new System.Drawing.Printing.PrinterSettings();
        ps.PrinterName = "Microsoft Print to PDF";
        ps.PrintRange = System.Drawing.Printing.PrintRange.SomePages;
        ps.FromPage = printingJobs[printingJobIndex].FromPage;
        ps.ToPage = printingJobs[printingJobIndex].ToPage;
        System.Console.WriteLine(ps.FromPage);
        System.Console.WriteLine(ps.ToPage);
        System.Console.WriteLine(printingJobIndex);
        using (var theViewer = new Aspose.Pdf.Facades.PdfViewer())
        {
            // 文档打印代码在这里
            // 使用打印机和页面设置打印文档                    
            theViewer.BindPdf(inPdf);
            theViewer.AutoResize = true;
            theViewer.AutoRotate = true;
            theViewer.PrintPageDialog = false;
            theViewer.PrintDocumentWithSettings(pgs, ps);
            theViewer.Close();
        }
    }
}

使用 C# 打印受保护的 PDF 文件

PDF 文件可以通过密码进行保护和保护。但是,密码可以有两种类型,即用户密码和所有者密码。使用用户密码保护的 PDF 文件需要密码才能打开和查看加密的 PDF 文件。另一方面,需要所有者密码才能修改受密码保护的 PDF 文件的内容。以下步骤解释了安全 PDF 的打印:

  1. 使用密码加载受保护的 PDF
  2. 创建 PdfViewer 对象
  3. 打印受保护的 PDF 文件

以下代码片段显示了如何使用 C# 打印受保护的 PDF 文件:

//在指定用户或所有者密码时加载安全 PDF 文档
Document document = new Document(dataDir + "Password.pdf" , "userORowner");
//创建 PdfViewer 对象
PdfViewer viewer = new PdfViewer();
//打开输入 PDF 文件
viewer.BindPdf(document);
//打印 PDF 文件
viewer.PrintDocument();
//关闭 PDF 文件
viewer.Close();

使用 C# 将 PDF 打印到打印机的特定纸盘

您可以使用 Aspose.PDF for .NET API 将 PDF 打印到特定纸盒。例如,您可能希望将包含大量照片的 PDF 打印到不同的纸盘,并将文本 PDF 文件打印到不同的纸盘。按照以下步骤设置打印 PDF 文件的出纸盒或纸盒:

  1. 加载输入 PDF 文件
  2. 设置打印属性
  3. 指定 PageSettingsPaperSource
  4. 调用 PrintDocumentWithSettings 方法

这里值得注意的是,您可以更改打印机的名称。在这里,我们将使用 Microsoft Print to PDF 作为示例。以下代码片段遵循这些步骤,并展示了如何使用 C# 将文档打印到打印机的特定纸盘或纸箱:

Document doc = new Document("Test.pdf");
PdfViewer viewer = new PdfViewer();
viewer.BindPdf(doc);
viewer.PrinterJobName = System.IO.Path.GetFileName(doc.FileName);
viewer.Resolution = 110;
// 设置打印属性
viewer.AutoResize = true; // Print the file with adjusted size
viewer.AutoRotate = false; // Print the file with adjusted rotation
viewer.PrintPageDialog = false; // Do not produce the page number dialog when printing
viewer.RenderingOptions.UseNewImagingEngine = true;
// 为打印机和页面设置以及 PrintDocument 创建对象
System.Drawing.Printing.PrinterSettings ps = new System.Drawing.Printing.PrinterSettings();
System.Drawing.Printing.PageSettings pgs = new System.Drawing.Printing.PageSettings();
// 设置打印机名称
ps.PrinterName = "Microsoft Print to PDF";
pgs.PaperSize = new System.Drawing.Printing.PaperSize(paperTypeName, paperWidth, paperHeight);
pgs.Margins = new System.Drawing.Printing.Margins(margins.Left, margins.Right, margins.Top, margins.Bottom);
pgs.PaperSource = GetPaperSource(printerName, trayName);
// 使用打印机和页面设置打印文档
viewer.PrintDocumentWithSettings(pgs, ps);

///<summary>
/// 返回提供的打印机和托盘名称的 PaperSource 对象。
///</summary>
///<param name="printerName"></param>
///<param name="trayName"></param>
///<returns></returns>
public static System.Drawing.Printing.PaperSource GetPaperSource(string printerName, string trayName)
{
    System.Drawing.Printing.PaperSource ps = null;
    System.Drawing.Printing.PrintDocument prtDoc = new System.Drawing.Printing.PrintDocument();
    prtDoc.PrinterSettings.PrinterName = printerName;
   for (int i = 0; i < prtDoc.PrinterSettings.PaperSources.Count; i++)
    {
        if (prtDoc.PrinterSettings.PaperSources[i].SourceName.ToLower().Equals(trayName.ToLower()))
        {
            ps = prtDoc.PrinterSettings.PaperSources[i];
            break;
        }
    }
    return ps;
}

使用 C# 将页面范围打印到不同的纸张来源

在某些情况下,您可能需要将一份 PDF 文档的不同页面打印到不同的纸盘或纸盒。例如,封面的纸张来源不同,其他页面的纸张来源不同。您当然可以按照以下步骤在同一打印作业中将页面范围打印到不同的纸张来源:

  1. 初始化 PdfViewer 类的对象
  2. 使用 PdfQueryPageSettings 事件处理程序委托
  3. 设置页面和打印机设置
  4. 调用 PrintDocumentWithSettings 方法

以下代码片段显示了如何按照这些步骤使用 C# 将不同的页面范围打印到不同的纸张来源或纸盘:

Aspose.Pdf.Facades.PdfViewer pdfv = new Aspose.Pdf.Facades.PdfViewer();

pdfv.PdfQueryPageSettings += PdfvOnPdfQueryPageSettings;

System.Drawing.Printing.PageSettings pgs = new System.Drawing.Printing.PageSettings();
System.Drawing.Printing.PrinterSettings prin = new System.Drawing.Printing.PrinterSettings();

pdfv.BindPdf(dataDir + "Print-PageRange.pdf");
prin.PrinterName = "HP LaserJet M9050 MFP PCL6";
prin.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("A4", 827, 1169);

Aspose.Pdf.Facades.PdfPageEditor pageEditor = new Aspose.Pdf.Facades.PdfPageEditor();
pageEditor.BindPdf(dataDir + "input.pdf");

pgs.Margins = new System.Drawing.Printing.Margins(0, 0, 0, 0);
pgs.PaperSize = prin.DefaultPageSettings.PaperSize;

pdfv.PrintDocumentWithSettings(pgs, prin);
pdfv.Close();

private static void PdfvOnPdfQueryPageSettings(object sender, System.Drawing.Printing.QueryPageSettingsEventArgs queryPageSettingsEventArgs, PdfPrintPageInfo currentPageInfo)
{
    bool isOdd = currentPageInfo.PageNumber % 2 != 0;

    System.Drawing.Printing.PrinterSettings.PaperSourceCollection paperSources = queryPageSettingsEventArgs.PageSettings.PrinterSettings.PaperSources;

    if (isOdd)
        queryPageSettingsEventArgs.PageSettings.PaperSource = paperSources[0];
    else
        queryPageSettingsEventArgs.PageSettings.PaperSource = paperSources[1];
}

使用 C# 打印 PDF 时检查打印作业状态

您可以将 PDF 文件打印到不同的打印机。例如,Microsoft Print to PDF、Microsoft XPS Document Writer 或任何物理打印机。但是,对于巨大的 PDF 文档,打印可能需要很长时间,或者由于某种原因打印可能会失败。因此,API 提供了一项功能,可让您通过以下步骤检查打印作业状态:

  1. 加载输入 PDF 文件
  2. 指定页面设置
  3. 设置打印机名称
  4. 使用 PrintDocumentWithSettings 打印 PDF 文档

下面的代码片段显示了如何使用 C# 检查打印作业状态或 PDF 的打印进度:

// 实例化 PdfViewer 对象
PdfViewer viewer = new PdfViewer();

// 绑定源PDF文件
viewer.BindPdf(dataDir + "Sample Document with Bookmark.pdf");
viewer.AutoResize = true;

// 隐藏打印对话框
viewer.PrintPageDialog = false;

// 创建打印机设置对象
System.Drawing.Printing.PrinterSettings ps = new System.Drawing.Printing.PrinterSettings();
System.Drawing.Printing.PageSettings pgs = new System.Drawing.Printing.PageSettings();
System.Drawing.Printing.PrintDocument prtdoc = new System.Drawing.Printing.PrintDocument();

// 指定打印机名称
//ps.PrinterName = "Microsoft XPS 文档编写器";
ps.PrinterName = "Microsoft Print to PDF";

// 结果打印输出名称
//ps.PrintFileName = "ResultantPrintout.xps";
ps.PrintFileName = "ResultantPrintout.pdf";

// 将输出打印到文件
ps.PrintToFile = true;
ps.FromPage = 1;
ps.ToPage = 2;
ps.PrintRange = System.Drawing.Printing.PrintRange.SomePages;

// 指定打印输出的页面大小
pgs.PaperSize = new System.Drawing.Printing.PaperSize("A4", 827, 1169);
ps.DefaultPageSettings.PaperSize = pgs.PaperSize;
pgs.Margins = new System.Drawing.Printing.Margins(0, 0, 0, 0);

// 使用上面指定的设置打印文档
viewer.PrintDocumentWithSettings(pgs, ps);

// 检查打印状态
if (viewer.PrintStatus != null)
{
    // 抛出异常
    Exception ex = viewer.PrintStatus as Exception;
    if (ex != null)
    {
        // 获取异常消息
    }
}
else
{
    // 没有发现错误。打印作业已成功完成
    Console.WriteLine("printing completed without any issue..");
}

结果,此代码片段在 .NET 应用程序的控制台上打印出 PDF 文件的打印状态:

C# 打印 PDF

结论

总而言之,我们学习了在您的编程应用程序中使用 C# 或 VB NET 打印密码保护和不安全 PDF 文件的不同方法和用例。此外,我们还探索了整个 PDF 文档的打印。同样,我们已经学会了通过特定的纸盘、纸盒或纸张来源打印一些页面范围。此外,我们还检查了如何使用 C# 监控文档的打印状态或打印进度。

也可以看看