Imprimir arquivos PDF C#

Muitas empresas estão diminuindo o uso de papel em grande medida. No entanto, existem alguns cenários em que a impressão é importante. Por exemplo, um sistema pode conter detalhes de pedidos online em formato PDF. Eles precisam imprimir PDF enquanto enviam um pedido on-line para entrega. Eles processam itens em grande escala, portanto, imprimir cada documento manualmente pode ser uma tarefa e tanto. Aspose.PDF for .NET API, além de muitos outros recursos de manipulação e conversão de arquivos, suporta a impressão eficiente de arquivos PDF. Vamos explorar os seguintes casos de uso relacionados à impressão de arquivos PDF em aplicativos .NET usando C#:

Imprimir arquivo PDF com C#

A impressão de arquivos PDF pode ser automatizada em seus aplicativos .NET usando C# ou VB.net. Você pode imprimir arquivos PDF seguindo as etapas simples abaixo:

  1. Crie um objeto da classe PdfViewer
  2. Carregar documento PDF de entrada
  3. Imprima o arquivo PDF

O trecho de código abaixo mostra como imprimir um arquivo PDF usando C#:

//Criar objeto PDFViewer
PdfViewer viewer = new PdfViewer();
//Abrir arquivo PDF de entrada
viewer.BindPdf(dataDir + "Test.pdf");
//Imprimir documento PDF
viewer.PrintDocument();
//Fechar arquivo PDF
viewer.Close();

Imprima vários arquivos PDF com C#

Se você precisar imprimir vários arquivos devido à natureza do seu negócio, o recurso já é suportado pelo Aspose.PDF para .NET API. Imprimir vários arquivos PDF, um por um com o trecho de código acima, pode ser um pouco lento. Portanto, vamos dar um passo adiante na impressão do PDF para facilitar o processo. Aqui estaremos usando List enquanto adicionamos o nome de cada arquivo PDF a essa lista. As etapas a seguir explicam como imprimiremos vários arquivos PDF:

  1. Inicializar uma lista de tipo String
  2. Adicionar arquivos PDF à lista
  3. Carregar arquivo PDF de entrada
  4. Imprima vários arquivos PDF

O trecho de código mostra como imprimir vários arquivos PDF usando C#:

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

foreach (String file in files)
{
    //Criar objeto PDFViewer
    PdfViewer viewer = new PdfViewer();
    //Abrir arquivo PDF de entrada
    viewer.BindPdf(file);
    //Imprimir documento PDF
    viewer.PrintDocument();
    //Fechar arquivo PDF
    viewer.Close();
}

Imprimir páginas específicas de PDF com C#

O recurso de impressão de páginas específicas de documentos PDF está disponível na API. Consideraremos um exemplo que inclui a impressão de vários intervalos de páginas. Você precisa especificar os números de página de e para conforme explicado nas etapas abaixo:

  • Defina os caminhos de entrada e saída do arquivo
  • Defina a impressão de páginas específicas definindo um intervalo
  • Especificar parâmetros de impressão
  • Imprima as páginas conforme especificado anteriormente

O trecho de código abaixo mostra como imprimir páginas específicas do documento usando 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())
        {
            // O código de impressão do documento vai aqui
            // Imprimir documento usando as configurações da impressora e da página                    
            theViewer.BindPdf(inPdf);
            theViewer.AutoResize = true;
            theViewer.AutoRotate = true;
            theViewer.PrintPageDialog = false;
            theViewer.PrintDocumentWithSettings(pgs, ps);
            theViewer.Close();
        }
    }
}

Imprimir arquivo PDF protegido com C#

Um arquivo PDF pode ser protegido e protegido por uma senha. No entanto, a senha pode ser de dois tipos, ou seja, senha de Usuário e Proprietário. Os arquivos PDF protegidos com a senha do usuário precisam de uma senha para abrir e visualizar o arquivo PDF criptografado. Por outro lado, a senha do proprietário é necessária para modificar o conteúdo do arquivo PDF protegido e protegido por senha. As etapas a seguir explicam a impressão de PDF seguro:

  1. Carregar PDF protegido com senha
  2. Criar objeto PdfViewer
  3. Imprimir arquivo PDF protegido

O trecho de código a seguir mostra como imprimir um arquivo PDF protegido usando C#:

//Carregar documento PDF seguro ao especificar a senha de usuário ou proprietário
Document document = new Document(dataDir + "Password.pdf" , "userORowner");
//Criar objeto PDFViewer
PdfViewer viewer = new PdfViewer();
//Abrir arquivo PDF de entrada
viewer.BindPdf(document);
//Imprimir documento PDF
viewer.PrintDocument();
//Fechar arquivo PDF
viewer.Close();

Imprimir PDF para bandeja de papel específica de uma impressora com C#

Você pode imprimir um PDF em uma bandeja de papel específica com Aspose.PDF para .NET API. Por exemplo, você pode querer imprimir um PDF com muitas fotos em uma bandeja de papel diferente e um arquivo PDF textual em uma bandeja de papel diferente. Siga as etapas abaixo para definir a bandeja ou compartimento de saída para imprimir arquivos PDF:

  1. Carregar arquivo PDF de entrada
  2. Definir atributos para impressão
  3. Especifique PageSettings e PaperSource
  4. Chame o método PrintDocumentWithSettings

Vale ressaltar aqui que você pode alterar o nome da impressora. Aqui estaremos usando o Microsoft Print to PDF, como exemplo. O trecho de código a seguir segue estas etapas e mostra como imprimir um documento em uma bandeja de papel específica ou bandeja de uma impressora com 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;
// Definir atributos para impressão
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;
// Criar objetos para configurações de impressora e página e PrintDocument
System.Drawing.Printing.PrinterSettings ps = new System.Drawing.Printing.PrinterSettings();
System.Drawing.Printing.PageSettings pgs = new System.Drawing.Printing.PageSettings();
// Definir nome da impressora
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);
// Imprimir documento usando as configurações da impressora e da página
viewer.PrintDocumentWithSettings(pgs, ps);

///<summary>
/// Devolva o objeto PaperSource para a impressora fornecida e o nome da bandeja.
///</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;
}

Imprimindo o intervalo de páginas para diferentes origens de papel usando C#

Pode haver cenários em que você precise imprimir diferentes páginas de um documento PDF em diferentes bandejas de papel ou bandejas. Por exemplo, uma fonte de papel diferente para a capa e diferente para as outras páginas. Você certamente pode seguir as etapas abaixo para imprimir intervalos de páginas em diferentes origens de papel no mesmo trabalho de impressão:

  1. Inicialize um objeto da classe PdfViewer
  2. Use PdfQueryPageSettings delegado do manipulador de eventos
  3. Definir configurações de página e impressora
  4. Chame o método PrintDocumentWithSettings

O trecho de código a seguir mostra como seguir essas etapas e imprimir diferentes intervalos de páginas em diferentes origens de papel ou bandejas usando 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];
}

Verifique o status do trabalho de impressão ao imprimir PDF com C#

Você pode imprimir arquivos PDF em diferentes impressoras. Por exemplo, Microsoft Print to PDF, Microsoft XPS Document Writer ou qualquer impressora física. No entanto, a impressão pode demorar muito tempo para grandes documentos PDF ou a impressão pode falhar por algum motivo. Portanto, a API oferece um recurso que permite verificar o status do trabalho de impressão com as seguintes etapas:

  1. Carregar arquivo PDF de entrada
  2. Especificar as configurações da página
  3. Definir nome da impressora
  4. Imprimir documento PDF com PrintDocumentWithSettings

O trecho de código abaixo mostra como verificar o status do trabalho de impressão ou o progresso da impressão do PDF usando C#:

// Instanciar o objeto PDFViewer
PdfViewer viewer = new PdfViewer();

// Vincular arquivo PDF de origem
viewer.BindPdf(dataDir + "Sample Document with Bookmark.pdf");
viewer.AutoResize = true;

// Ocultar caixa de diálogo de impressão
viewer.PrintPageDialog = false;

// Criar objeto de configurações da impressora
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();

// Especifique o nome da impressora
//ps.PrinterName = "Gravador de Documentos Microsoft XPS";
ps.PrinterName = "Microsoft Print to PDF";

// Nome da impressão resultante
//ps.PrintFileName = "ResultantPrintout.xps";
ps.PrintFileName = "ResultantPrintout.pdf";

// Imprima a saída em arquivo
ps.PrintToFile = true;
ps.FromPage = 1;
ps.ToPage = 2;
ps.PrintRange = System.Drawing.Printing.PrintRange.SomePages;

// Especifique o tamanho da página de impressão
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);

// Imprima o documento com as configurações especificadas acima
viewer.PrintDocumentWithSettings(pgs, ps);

// Verifique o status da impressão
if (viewer.PrintStatus != null)
{
    // Uma exceção foi lançada
    Exception ex = viewer.PrintStatus as Exception;
    if (ex != null)
    {
        // Obter mensagem de exceção
    }
}
else
{
    // Nenhum erro foi encontrado. O trabalho de impressão foi concluído com sucesso
    Console.WriteLine("printing completed without any issue..");
}

Consequentemente, este trecho de código é impresso no console do aplicativo .NET sobre o status de impressão do arquivo PDF:

C# Imprimir PDF

Conclusão

Para resumir, aprendemos diferentes abordagens e casos de uso de impressão de arquivos PDF protegidos e não protegidos por senha com C# ou VB NET em seus aplicativos de programação. Além disso, exploramos a impressão de documentos PDF inteiros. Da mesma forma, aprendemos a imprimir alguns intervalos de páginas por bandejas, compartimentos ou origens de papel específicos. Além disso, também verificamos como monitorar o status de impressão ou o andamento da impressão de documentos usando C#.

Veja também