PDF com Orientação Mista Imprime Todas as Páginas como Paisagem
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
}
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.

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 bem estruturados e visualmente atraentes.