Trabalhando com Impressão de PDF - Facades
Imprimindo Arquivo PDF na Impressora Padrão usando Configurações de Impressora e Página
Primeiramente, o documento é convertido em imagem e depois impresso na impressora. Criamos uma instância da classe PdfViewer que permite imprimir um arquivo PDF na impressora padrão, usando o método BindPdf para o documento, e fazer certas configurações. Em nosso exemplo, estamos usando o formato A4, orientação retrato. Nas printerSettings, primeiramente, indicamos o nome da impressora para a qual estamos imprimindo. Caso contrário, ele será impresso na impressora padrão. Em seguida, colocamos o número de cópias que precisamos.
public static void PrintingPDFFile()
{
// Criar objeto PdfViewer
PdfViewer viewer = new PdfViewer();
// Abrir arquivo PDF de entrada
viewer.BindPdf(_dataDir + "sample.pdf");
// Definir atributos para impressão
viewer.AutoResize = true; // Imprimir o arquivo com tamanho ajustado
viewer.AutoRotate = true; // Imprimir o arquivo com rotação ajustada
viewer.PrintPageDialog = false; // Não produzir o diálogo de número de página ao imprimir
// 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();
System.Drawing.Printing.PrintDocument prtdoc = new System.Drawing.Printing.PrintDocument();
// Definir nome da impressora
ps.PrinterName = prtdoc.PrinterSettings.PrinterName;
// Definir PageSize (se necessário)
pgs.PaperSize = new System.Drawing.Printing.PaperSize("A4", 827, 1169);
// Definir PageMargins (se necessário)
pgs.Margins = new System.Drawing.Printing.Margins(0, 0, 0, 0);
// Imprimir documento usando configurações de impressora e página
viewer.PrintDocumentWithSettings(pgs, ps);
// Fechar o arquivo PDF após a impressão
viewer.Close();
}
Para exibir uma caixa de diálogo de impressão, tente usar o seguinte trecho de código:
public static void PrintingPDFDisplayPrintDialog()
{
// Criar objeto PdfViewer
PdfViewer viewer = new PdfViewer();
// Abrir arquivo PDF de entrada
viewer.BindPdf(_dataDir + "sample.pdf");
// Definir atributos para impressão
viewer.AutoResize = true; // Imprimir o arquivo com tamanho ajustado
viewer.AutoRotate = true; // Imprimir o arquivo com rotação ajustada
// Criar objetos para configurações de impressora e página e PrintDocument
System.Drawing.Printing.PageSettings pgs = new System.Drawing.Printing.PageSettings
{
// Definir PageSize (se necessário)
PaperSize = new System.Drawing.Printing.PaperSize("A4", 827, 1169),
// Definir PageMargins (se necessário)
Margins = new System.Drawing.Printing.Margins(0, 0, 0, 0)
};
System.Windows.Forms.PrintDialog printDialog = new System.Windows.Forms.PrintDialog();
if (printDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
// Código de impressão do documento vai aqui
// Imprimir documento usando configurações de impressora e página
System.Drawing.Printing.PrinterSettings ps = printDialog.PrinterSettings;
viewer.PrintDocumentWithSettings(pgs, ps);
}
// Fechar o arquivo PDF após a impressão
viewer.Close();
}
Imprimir PDF para Impressora Virtual
Existem impressoras que imprimem em um arquivo. Definimos o nome da impressora virtual e, por analogia com o exemplo anterior, fazemos as configurações.
public static void PrintingPDFToSoftPrinter()
{
// Criar objeto PdfViewer
PdfViewer viewer = new PdfViewer();
// Abrir arquivo PDF de entrada
viewer.BindPdf(_dataDir + "sample.pdf");
// Definir atributos para impressão
viewer.AutoResize = true; // Imprimir o arquivo com tamanho ajustado
viewer.AutoRotate = true; // Imprimir o arquivo com rotação ajustada
viewer.PrintPageDialog = false; // Não produzir o diálogo de número de página ao imprimir
viewer.PrintAsImage = false;
// 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 = "HP Universal Printing PS (v7.0.0)";
// Ou definir a impressora PDF
//ps.PrinterName = "Adobe PDF";
// Definir PageSize (se necessário)
pgs.PaperSize = new System.Drawing.Printing.PaperSize("A4", 827, 1169);
// Definir PageMargins (se necessário)
pgs.Margins = new System.Drawing.Printing.Margins(0, 0, 0, 0);
// Imprimir documento usando configurações de impressora e página
viewer.PrintDocumentWithSettings(pgs, ps);
// Fechar o arquivo PDF após a impressão
viewer.Close();
}
Ocultando o Diálogo de Impressão
Aspose.PDF para .NET permite que você oculte o diálogo de impressão. Para isso, use o método PrintPageDialog.
O trecho de código a seguir mostra como ocultar o diálogo de impressão.
public static void PrintingPDFHidePrintDialog()
{
// Criar objeto PdfViewer
PdfViewer viewer = new PdfViewer();
// Abrir arquivo PDF de entrada
viewer.BindPdf(_dataDir + "sample.pdf");
// Definir atributos para impressão
viewer.AutoResize = true; // Imprimir o arquivo com tamanho ajustado
viewer.AutoRotate = true; // Imprimir o arquivo com rotação ajustada
viewer.PrintPageDialog = false; // Não produzir o diálogo de número de página ao imprimir
// 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 XPS/PDF
ps.PrinterName = "OneNote for Windows 10";
// Definir PageSize (se necessário)
pgs.PaperSize = new System.Drawing.Printing.PaperSize("A4", 827, 1169);
// Definir PageMargins (se necessário)
pgs.Margins = new System.Drawing.Printing.Margins(0, 0, 0, 0);
// Imprimir documento usando configurações de impressora e página
viewer.PrintDocumentWithSettings(pgs, ps);
// Fechar o arquivo PDF após a impressão
viewer.Close();
}
Imprimindo PDF Colorido para Arquivo XPS como Escala de Cinza
Um documento PDF colorido pode ser impresso em uma impressora XPS como escala de cinza, usando PdfViewer. Para isso, você precisa usar a propriedade PdfViewer.PrintAsGrayscale e defini-la como true. O trecho de código a seguir demonstra a implementação da propriedade PdfViewer.PrintAsGrayscale.
public static void PrintingPDFasGrayscale()
{
// Criar objeto PdfViewer
PdfViewer viewer = new PdfViewer();
// Abrir arquivo PDF de entrada
viewer.BindPdf(_dataDir + "sample.pdf");
// Definir atributos para impressão
viewer.AutoResize = true; // Imprimir o arquivo com tamanho ajustado
viewer.AutoRotate = true; // Imprimir o arquivo com rotação ajustada
viewer.PrintPageDialog = false; // Não produzir o diálogo de número de página ao imprimir
viewer.PrintAsGrayscale = false;
// 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 o nome da impressora XPS/PDF
ps.PrinterName = "OneNote for Windows 10";
// Definir PageSize (se necessário)
pgs.PaperSize = new System.Drawing.Printing.PaperSize("A4", 827, 1169);
// Definir PageMargins (se necessário)
pgs.Margins = new System.Drawing.Printing.Margins(0, 0, 0, 0);
// Imprimir documento usando configurações de impressora e página
viewer.PrintDocumentWithSettings(pgs, ps);
// Fechar o arquivo PDF após a impressão
viewer.Close();
}
Conversão de PDF para PostScript
A classe PdfViewer fornece a capacidade de imprimir documentos PDF e, com a ajuda dessa classe, podemos também converter arquivos PDF para o formato PostScript. Para converter um arquivo PDF em PostScript, primeiro instale qualquer impressora PS e apenas imprima para arquivo com a ajuda do PdfViewer.
O trecho de código a seguir mostra como imprimir e converter um PDF para o formato PostScript.
public static void PrintingPDFToPostScript()
{
// Criar objeto PdfViewer
PdfViewer viewer = new PdfViewer();
// Abrir arquivo PDF de entrada
viewer.BindPdf(_dataDir + "sample.pdf");
// Definir atributos para impressão
viewer.AutoResize = true; // Imprimir o arquivo com tamanho ajustado
viewer.AutoRotate = true; // Imprimir o arquivo com rotação ajustada
viewer.PrintPageDialog = false; // Não produzir a caixa de diálogo de número de página ao imprimir
viewer.PrintAsImage = false;
// 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 XPS/PDF
ps.PrinterName = "HP Universal Printing PS (v7.0.0)";
// Definir nome do arquivo de saída e atributo PrintToFile
ps.PrintFileName = _dataDir + "PdfToPostScript_out.ps";
ps.PrintToFile = true;
// Definir PageSize (se necessário)
pgs.PaperSize = new System.Drawing.Printing.PaperSize("A4", 827, 1169);
// Definir PageMargins (se necessário)
pgs.Margins = new System.Drawing.Printing.Margins(0, 0, 0, 0);
// Imprimir documento usando configurações de impressora e página
viewer.PrintDocumentWithSettings(pgs, ps);
// Fechar o arquivo PDF após a impressão
viewer.Close();
}
Verificando o Status da Tarefa de Impressão
Um arquivo PDF pode ser impresso em uma impressora física, bem como no Microsoft XPS Document Writer, sem exibir uma caixa de diálogo de impressão, usando a classe PdfViewer. Ao imprimir arquivos PDF grandes, o processo pode demorar muito, então o usuário pode não ter certeza se o processo de impressão foi concluído ou encontrou um problema. Para determinar o status de uma tarefa de impressão, use a propriedade PrintStatus. O trecho de código a seguir mostra como imprimir o arquivo PDF para um arquivo XPS e obter o status da impressão.
public static void CheckingPrintJobStatus()
{
// Criar objeto PdfViewer
PdfViewer viewer = new PdfViewer();
// Abrir arquivo PDF de entrada
viewer.BindPdf(_dataDir + "sample1.pdf");
// Definir atributos para impressão
viewer.AutoResize = true; // Imprimir o arquivo com tamanho ajustado
viewer.AutoRotate = true; // Imprimir o arquivo com rotação ajustada
viewer.PrintPageDialog = false; // Não produzir a caixa de diálogo de número da página ao imprimir
viewer.PrintAsImage = false;
// 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 XPS/PDF
ps.PrinterName = "HP Universal Printing PS (v7.0.0)";
// Definir nome do arquivo de saída e atributo PrintToFile
ps.PrintFileName = _dataDir + "PdfToPostScript_out.ps";
ps.PrintToFile = true;
// Definir PageSize (se necessário)
pgs.PaperSize = new System.Drawing.Printing.PaperSize("A4", 827, 1169);
// Definir PageMargins (se necessário)
pgs.Margins = new System.Drawing.Printing.Margins(0, 0, 0, 0);
// Imprimir documento usando configurações de impressora e página
viewer.PrintDocumentWithSettings(pgs, ps);
// Verificar o status da impressão
if (viewer.PrintStatus != null && viewer.PrintStatus is Exception ex)
{
Console.WriteLine(ex.Message);
}
else
{
// Nenhum erro foi encontrado. A tarefa de impressão foi concluída com sucesso
Console.WriteLine("Impressão concluída sem nenhum problema..");
}
// Fechar o arquivo PDF após a impressão
viewer.Close();
}
struct PrintingJobSettings
{
public int ToPage { get; set; }
public int FromPage { get; set; }
public string OutputFile { get; set; }
public System.Drawing.Printing.Duplex Mode { get; set; }
}
Imprimindo páginas nos modos Simplex e Duplex
Em um determinado trabalho de impressão, as páginas de um documento PDF podem ser impressas no modo Duplex ou no modo Simplex, mas você não pode imprimir algumas páginas como simplex e outras como duplex em um único trabalho de impressão. No entanto, para atender a esse requisito, diferentes intervalos de páginas e o objeto PrintingJobSettings podem ser usados. O trecho de código a seguir mostra como imprimir algumas páginas de um arquivo PDF no modo Simplex e algumas páginas no modo Duplex.
public static void PrintingPagesInSimplexAndDuplexMode()
{
int printingJobIndex = 0;
string inPdf = _dataDir + "sample-8page.pdf";
string output = _dataDir;
IList<PrintingJobSettings> printingJobs = new List<PrintingJobSettings>();
PrintingJobSettings printingJob1 = new PrintingJobSettings
{
FromPage = 1,
ToPage = 3,
OutputFile = output + "sample_1_3.xps",
Mode = Duplex.Default
};
printingJobs.Add(printingJob1);
PrintingJobSettings printingJob2 = new PrintingJobSettings
{
FromPage = 4,
ToPage = 6,
OutputFile = output + "sample_4_6.xps",
Mode = Duplex.Simplex
};
printingJobs.Add(printingJob2);
PrintingJobSettings printingJob3 = new PrintingJobSettings
{
FromPage = 7,
ToPage = 7,
OutputFile = output + "sample_7.xps",
Mode = Duplex.Default
};
printingJobs.Add(printingJob3);
PdfViewer viewer = new PdfViewer();
viewer.BindPdf(inPdf);
viewer.AutoResize = true;
viewer.AutoRotate = true;
viewer.PrintPageDialog = false;
PrinterSettings ps = new PrinterSettings();
PageSettings pgs = new PageSettings();
ps.PrinterName = "Microsoft XPS Document Writer";
ps.PrintFileName = System.IO.Path.GetFullPath(printingJobs[printingJobIndex].OutputFile);
ps.PrintToFile = true;
ps.FromPage = printingJobs[printingJobIndex].FromPage;
ps.ToPage = printingJobs[printingJobIndex].ToPage;
ps.Duplex = printingJobs[printingJobIndex].Mode;
ps.PrintRange = 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.EndPrint += (sender, args) =>
{
if (++printingJobIndex < printingJobs.Count)
{
ps.PrintFileName = System.IO.Path.GetFullPath(printingJobs[printingJobIndex].OutputFile);
ps.FromPage = printingJobs[printingJobIndex].FromPage;
ps.ToPage = printingJobs[printingJobIndex].ToPage;
ps.Duplex = printingJobs[printingJobIndex].Mode;
viewer.PrintDocumentWithSettings(pgs, ps);
}
};
viewer.PrintDocumentWithSettings(pgs, ps);
}