PDF com Orientação Mista Imprime Todas as Páginas como Paisagem

This article was translated from English: Does it need improvement?
Translated
View the article in English

IronPrint 2026.1.5 não preserva a orientação por página ao imprimir um PDF que mistura páginas retrato e paisagem. Cada página chega à impressora em paisagem, não importa sua orientação original.

Isso afeta 2026.1.5 no Windows 10 e Windows Server 2022 com .NET 8. Não existe uma construção corrigida para esta versão.

O motor aplica uma única orientação ao documento inteiro, em vez de ler as dimensões de cada página. Dividir o arquivo em execuções de páginas com a mesma orientação e imprimir cada execução separadamente restaura a saída correta.

Solução

Recomendado: imprima o PDF em lotes consistentes de orientação em vez de como um único trabalho.

1. Detectar a orientação de cada página

Abra o PDF e compare a largura de cada página em relação à sua altura. Uma página mais larga do que alta é paisagem; qualquer outra coisa é retrato.

2. Agrupar páginas consecutivas de mesma orientação

Percorra as páginas em ordem e inicie um novo lote sempre que a orientação mudar. Cada lote acaba como um intervalo de páginas contíguo com uma orientação.

3. Imprimir cada lote como um próprio trabalho

Enviar cada intervalo separadamente permite que a impressora aplique a orientação desse intervalo, em vez de forçar todo o documento em paisagem.

4. Lidar com várias cópias manualmente

Como o documento agora está dividido em vários trabalhos, faça um loop uma vez por cópia e imprima a sequência completa de lotes cada vez. Isso mantém a ordem das páginas intacta dentro de cada cópia.

Implementação completa:

using IronPrint;
using IronPdf;
await PrintDocumentByOrientationBatchesAsync(
    documentPath: documentPath,
    printerName: printerName,
    numberOfCopies: effectiveCopies);
async Task PrintDocumentByOrientationBatchesAsync(
    string documentPath,
    string printerName,
    int numberOfCopies)
{
    var tempFolder = Path.Combine(
        Path.GetTempPath(),
        "ironprint-orientation-workaround",
        Guid.NewGuid().ToString("N"));
    Directory.CreateDirectory(tempFolder);
    try
    {
        using var pdf = PdfDocument.FromFile(documentPath);
        var batches = GetConsecutiveOrientationBatches(pdf);
        // Since the document is printed in multiple jobs, copies are handled manually
        // to preserve the full document order per copy.
        for (var copy = 1; copy <= numberOfCopies; copy++)
        {
            foreach (var batch in batches)
            {
                var batchPath = Path.Combine(
                    tempFolder,
                    $"copy_{copy}_pages_{batch.StartPageNumber}_{batch.EndPageNumber}_{batch.Orientation}.pdf");
                using var batchPdf = pdf.CopyPages(batch.StartIndex, batch.EndIndex);
                batchPdf.SaveAs(batchPath);
                var printSettings = new PrintSettings
                {
                    PrinterName = printerName,
                    NumberOfCopies = 1,
                    PaperOrientation = batch.Orientation == DetectedPageOrientation.Landscape
                        ? PaperOrientation.Landscape
                        : PaperOrientation.Portrait,
                    PaperSize = PaperSize.PrinterDefault
                };
                await Printer.PrintAsync(batchPath, printSettings);
                // Optional delay to help ensure print jobs are queued in order.
                await Task.Delay(500);
            }
        }
    }
    finally
    {
        try
        {
            Directory.Delete(tempFolder, recursive: true);
        }
        catch
        {
            // Ignore cleanup errors in case the print spooler is still accessing the files.
        }
    }
}
List<PageOrientationBatch> GetConsecutiveOrientationBatches(PdfDocument pdf)
{
    var batches = new List<PageOrientationBatch>();
    if (pdf.PageCount == 0)
    {
        return batches;
    }
    var currentOrientation = GetPageOrientation(pdf.Pages[0].Width, pdf.Pages[0].Height);
    var batchStartIndex = 0;
    for (var pageIndex = 1; pageIndex < pdf.PageCount; pageIndex++)
    {
        var page = pdf.Pages[pageIndex];
        var pageOrientation = GetPageOrientation(page.Width, page.Height);
        if (pageOrientation != currentOrientation)
        {
            batches.Add(new PageOrientationBatch(
                StartIndex: batchStartIndex,
                EndIndex: pageIndex - 1,
                Orientation: currentOrientation));
            batchStartIndex = pageIndex;
            currentOrientation = pageOrientation;
        }
    }
    batches.Add(new PageOrientationBatch(
        StartIndex: batchStartIndex,
        EndIndex: pdf.PageCount - 1,
        Orientation: currentOrientation));
    return batches;
}
DetectedPageOrientation GetPageOrientation(double width, double height)
{
    return width > height
        ? DetectedPageOrientation.Landscape
        : DetectedPageOrientation.Portrait;
}
record PageOrientationBatch(
    int StartIndex,
    int EndIndex,
    DetectedPageOrientation Orientation)
{
    public int StartPageNumber => StartIndex + 1;
    public int EndPageNumber => EndIndex + 1;
}
enum DetectedPageOrientation
{
    Portrait,
    Landscape
}
using IronPrint;
using IronPdf;
await PrintDocumentByOrientationBatchesAsync(
    documentPath: documentPath,
    printerName: printerName,
    numberOfCopies: effectiveCopies);
async Task PrintDocumentByOrientationBatchesAsync(
    string documentPath,
    string printerName,
    int numberOfCopies)
{
    var tempFolder = Path.Combine(
        Path.GetTempPath(),
        "ironprint-orientation-workaround",
        Guid.NewGuid().ToString("N"));
    Directory.CreateDirectory(tempFolder);
    try
    {
        using var pdf = PdfDocument.FromFile(documentPath);
        var batches = GetConsecutiveOrientationBatches(pdf);
        // Since the document is printed in multiple jobs, copies are handled manually
        // to preserve the full document order per copy.
        for (var copy = 1; copy <= numberOfCopies; copy++)
        {
            foreach (var batch in batches)
            {
                var batchPath = Path.Combine(
                    tempFolder,
                    $"copy_{copy}_pages_{batch.StartPageNumber}_{batch.EndPageNumber}_{batch.Orientation}.pdf");
                using var batchPdf = pdf.CopyPages(batch.StartIndex, batch.EndIndex);
                batchPdf.SaveAs(batchPath);
                var printSettings = new PrintSettings
                {
                    PrinterName = printerName,
                    NumberOfCopies = 1,
                    PaperOrientation = batch.Orientation == DetectedPageOrientation.Landscape
                        ? PaperOrientation.Landscape
                        : PaperOrientation.Portrait,
                    PaperSize = PaperSize.PrinterDefault
                };
                await Printer.PrintAsync(batchPath, printSettings);
                // Optional delay to help ensure print jobs are queued in order.
                await Task.Delay(500);
            }
        }
    }
    finally
    {
        try
        {
            Directory.Delete(tempFolder, recursive: true);
        }
        catch
        {
            // Ignore cleanup errors in case the print spooler is still accessing the files.
        }
    }
}
List<PageOrientationBatch> GetConsecutiveOrientationBatches(PdfDocument pdf)
{
    var batches = new List<PageOrientationBatch>();
    if (pdf.PageCount == 0)
    {
        return batches;
    }
    var currentOrientation = GetPageOrientation(pdf.Pages[0].Width, pdf.Pages[0].Height);
    var batchStartIndex = 0;
    for (var pageIndex = 1; pageIndex < pdf.PageCount; pageIndex++)
    {
        var page = pdf.Pages[pageIndex];
        var pageOrientation = GetPageOrientation(page.Width, page.Height);
        if (pageOrientation != currentOrientation)
        {
            batches.Add(new PageOrientationBatch(
                StartIndex: batchStartIndex,
                EndIndex: pageIndex - 1,
                Orientation: currentOrientation));
            batchStartIndex = pageIndex;
            currentOrientation = pageOrientation;
        }
    }
    batches.Add(new PageOrientationBatch(
        StartIndex: batchStartIndex,
        EndIndex: pdf.PageCount - 1,
        Orientation: currentOrientation));
    return batches;
}
DetectedPageOrientation GetPageOrientation(double width, double height)
{
    return width > height
        ? DetectedPageOrientation.Landscape
        : DetectedPageOrientation.Portrait;
}
record PageOrientationBatch(
    int StartIndex,
    int EndIndex,
    DetectedPageOrientation Orientation)
{
    public int StartPageNumber => StartIndex + 1;
    public int EndPageNumber => EndIndex + 1;
}
enum DetectedPageOrientation
{
    Portrait,
    Landscape
}
Imports IronPrint
Imports IronPdf
Imports System.IO

Await PrintDocumentByOrientationBatchesAsync(documentPath:=documentPath, printerName:=printerName, numberOfCopies:=effectiveCopies)

Private Async Function PrintDocumentByOrientationBatchesAsync(documentPath As String, printerName As String, numberOfCopies As Integer) As Task
    Dim tempFolder = Path.Combine(Path.GetTempPath(), "ironprint-orientation-workaround", Guid.NewGuid().ToString("N"))
    Directory.CreateDirectory(tempFolder)
    Try
        Using pdf = PdfDocument.FromFile(documentPath)
            Dim batches = GetConsecutiveOrientationBatches(pdf)
            ' Since the document is printed in multiple jobs, copies are handled manually
            ' to preserve the full document order per copy.
            For copy = 1 To numberOfCopies
                For Each batch In batches
                    Dim batchPath = Path.Combine(tempFolder, $"copy_{copy}_pages_{batch.StartPageNumber}_{batch.EndPageNumber}_{batch.Orientation}.pdf")
                    Using batchPdf = pdf.CopyPages(batch.StartIndex, batch.EndIndex)
                        batchPdf.SaveAs(batchPath)
                        Dim printSettings = New PrintSettings With {
                            .PrinterName = printerName,
                            .NumberOfCopies = 1,
                            .PaperOrientation = If(batch.Orientation = DetectedPageOrientation.Landscape, PaperOrientation.Landscape, PaperOrientation.Portrait),
                            .PaperSize = PaperSize.PrinterDefault
                        }
                        Await Printer.PrintAsync(batchPath, printSettings)
                        ' Optional delay to help ensure print jobs are queued in order.
                        Await Task.Delay(500)
                    End Using
                Next
            Next
        End Using
    Finally
        Try
            Directory.Delete(tempFolder, recursive:=True)
        Catch
            ' Ignore cleanup errors in case the print spooler is still accessing the files.
        End Try
    End Try
End Function

Private Function GetConsecutiveOrientationBatches(pdf As PdfDocument) As List(Of PageOrientationBatch)
    Dim batches = New List(Of PageOrientationBatch)()
    If pdf.PageCount = 0 Then
        Return batches
    End If
    Dim currentOrientation = GetPageOrientation(pdf.Pages(0).Width, pdf.Pages(0).Height)
    Dim batchStartIndex = 0
    For pageIndex = 1 To pdf.PageCount - 1
        Dim page = pdf.Pages(pageIndex)
        Dim pageOrientation = GetPageOrientation(page.Width, page.Height)
        If pageOrientation <> currentOrientation Then
            batches.Add(New PageOrientationBatch(StartIndex:=batchStartIndex, EndIndex:=pageIndex - 1, Orientation:=currentOrientation))
            batchStartIndex = pageIndex
            currentOrientation = pageOrientation
        End If
    Next
    batches.Add(New PageOrientationBatch(StartIndex:=batchStartIndex, EndIndex:=pdf.PageCount - 1, Orientation:=currentOrientation))
    Return batches
End Function

Private Function GetPageOrientation(width As Double, height As Double) As DetectedPageOrientation
    Return If(width > height, DetectedPageOrientation.Landscape, DetectedPageOrientation.Portrait)
End Function

Private NotInheritable Class PageOrientationBatch
    Public Property StartIndex As Integer
    Public Property EndIndex As Integer
    Public Property Orientation As DetectedPageOrientation

    Public Sub New(StartIndex As Integer, EndIndex As Integer, Orientation As DetectedPageOrientation)
        Me.StartIndex = StartIndex
        Me.EndIndex = EndIndex
        Me.Orientation = Orientation
    End Sub

    Public ReadOnly Property StartPageNumber As Integer
        Get
            Return StartIndex + 1
        End Get
    End Property

    Public ReadOnly Property EndPageNumber As Integer
        Get
            Return EndIndex + 1
        End Get
    End Property
End Class

Private Enum DetectedPageOrientation
    Portrait
    Landscape
End Enum
$vbLabelText   $csharpLabel

GetConsecutiveOrientationBatches produz um PageOrientationBatch por execução contígua, e Printer.PrintAsync executa cada intervalo com seu próprio PaperOrientation. O Task.Delay(500) entre os trabalhos ajuda o spooler a enfileirá-los na ordem.

AvisoCada intervalo de orientação é enviado como um trabalho de impressão separado. Em uma impressora física, os trabalhos são enfileirados consecutivamente, mas com Microsoft Print to PDF ou uma impressora virtual semelhante, cada lote pode solicitar seu próprio arquivo de saída.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais
Pronto para começar?
Nuget Baixar 44,923 | Versão: 2026.7 recém-lançado
Still Scrolling Icon

Ainda está rolando a tela?

Quer provas rápidas? PM > Install-Package IronPrint
executar um exemplo Veja seu documento chegar à impressora.