Orientação e Rotação de Página em PDFs
Trabalhar com PDFs muitas vezes significa conhecer duas coisas sobre uma página: sua orientação (retrato ou paisagem) e se o conteúdo está girado. Há duas maneiras de descobrir, e elas respondem a perguntas ligeiramente diferentes.
PdfDocument.Pages[i].PageRotationlê a rotação dos metadados do PDF.OcrInput.DetectPageOrientation()infere a orientação visualmente com OCR.
Orientação vs. Rotação
Esses não são a mesma propriedade:
- Orientação da página: o layout da página. Retrato significa que a altura é maior que a largura; Paisagem significa que a largura é maior que a altura.
- Ângulo de rotação: como o conteúdo fica em relação à direção natural de leitura, por exemplo,
90,180e assim por diante.
Opção 1: Ler Rotação dos Metadados
PageRotation retorna o valor de rotação incorporado no arquivo PDF, então ele informa como o conteúdo é programaticamente girado. Para PDFs bem-formados, isso é confiável e consistente.
var pdf = PdfDocument.FromFile("sample.pdf");
for (int i = 0; i < pdf.PageCount; i++)
{
var page = pdf.Pages[i];
var orientation = page.Width > page.Height ? "Landscape" : "Portrait";
var rotation = page.PageRotation;
Console.WriteLine($"Page {i + 1}: {orientation}, Rotation: {rotation} degrees");
}Dim pdf = PdfDocument.FromFile("sample.pdf")
For i As Integer = 0 To pdf.PageCount - 1
Dim page = pdf.Pages(i)
Dim orientation = If(page.Width > page.Height, "Landscape", "Portrait")
Dim rotation = page.PageRotation
Console.WriteLine($"Page {i + 1}: {orientation}, Rotation: {rotation} degrees")
Next iDim pdf = PdfDocument.FromFile("sample.pdf")
For i As Integer = 0 To pdf.PageCount - 1
Dim page = pdf.Pages(i)
Dim orientation = If(page.Width > page.Height, "Landscape", "Portrait")
Dim rotation = page.PageRotation
Console.WriteLine($"Page {i + 1}: {orientation}, Rotation: {rotation} degrees")
Next iVocê obtém ambos os fatos de uma vez: orientação através da comparação de largura para altura, e o ângulo de rotação direto dos metadados.
Melhor para: PDFs estruturados com metadados consistentes e válidos.
Opção 2: Detectar Orientação com OCR
Quando os metadados estão ausentes ou não são confiáveis, analise a página visualmente. DetectPageOrientation() examina o layout de cada página e infere a direção de leitura provável, sem depender de metadados.
using var input = new OcrInput();
input.LoadPdf("sample.pdf");
var results = input.DetectPageOrientation();
foreach (var result in results)
{
Console.WriteLine($"Page {result.PageNumber + 1}: Rotation: {result.RotationAngle} degrees");
}using var input = new OcrInput();
input.LoadPdf("sample.pdf");
var results = input.DetectPageOrientation();
foreach (var result in results)
{
Console.WriteLine($"Page {result.PageNumber + 1}: Rotation: {result.RotationAngle} degrees");
}Using input As New OcrInput()
input.LoadPdf("sample.pdf")
Dim results = input.DetectPageOrientation()
For Each result In results
Console.WriteLine($"Page {result.PageNumber + 1}: Rotation: {result.RotationAngle} degrees")
Next
End UsingUsing input As New OcrInput()
input.LoadPdf("sample.pdf")
Dim results = input.DetectPageOrientation()
For Each result In results
Console.WriteLine($"Page {result.PageNumber + 1}: Rotation: {result.RotationAngle} degrees")
Next
End UsingEsta é a escolha certa para documentos digitalizados, PDFs baseados em imagens e qualquer arquivo sem metadados adequados.
A precisão aqui segue a densidade e clareza do texto. Texto esparso ou desalinhado pode produzir um resultado errado, então restrinja o OCR a um Rectangle sobre uma região mais densa de texto para estabilizar a detecção.
Recomendação
- PDFs digitais: prefira
PdfDocument.PageRotationquando os metadados forem corretos. - PDFs digitalizados ou baseados em imagens: use
OcrInput.DetectPageOrientation()quando os metadados estiverem ausentes ou não forem confiáveis.
Para fluxos de trabalho críticos, execute ambos os métodos e aplique sua própria lógica para reconciliar qualquer discrepância. Se você estiver vendo resultados de rotação inconsistentes, verifique o layout da página específico e valide um método em relação ao outro.
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.