PDF中的页面方向和旋转

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

处理PDF通常意味着了解页面的两个信息:其方向(纵向或横向)以及内容是否已旋转。 有两种方法可以找出这两个问题的答案,而它们解答的是稍微不同的问题。

  • PdfDocument.Pages[i].PageRotation 从PDF元数据中读取旋转信息。
  • OcrInput.DetectPageOrientation() 使用OCR视觉推断方向。

方向 vs 旋转

这些不是同一属性:

  • 页面方向: 页面布局。 纵向意意味着高度大于宽度; 横向意意味着宽度大于高度。
  • 旋转角度:内容相对于自然阅读方向的角度,例如 180 等。

选项1:从元数据读取旋转

PageRotation 返回嵌入在PDF文件中的旋转值,因此它告诉您内容是如何被程序化旋转的。 对于格式良好的PDF,这是一种可靠且一致的方法。

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");
}
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");
}
Imports System

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
$vbLabelText   $csharpLabel

您可以通过一次读取获得两个信息:通过宽高比比较得出方向,以及从元数据中直接获取的旋转角度。

适合: 结构化且元数据一致有效的PDF。

选项2:用OCR检测方向

当元数据缺失或不可信时,可以对页面进行视觉分析。 DetectPageOrientation() 检查每一页的布局并推断可能的阅读方向,不依赖于元数据。

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");
}
Imports System

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 Using
$vbLabelText   $csharpLabel

这是处理扫描文档、基于图像的PDF以及缺乏适当元数据文件的正确选择。

这里的准确性与文本密度和清晰度相关。 稀疏或对齐不当的文本可能产生错误结果,因此将OCR限制为 Rectangle 在文本密集区域上,以稳定检测。

推荐

  • 数字PDF:当元数据正确时,优先使用 PdfDocument.PageRotation
  • 扫描或基于图像的PDF:在元数据缺失或不可靠时,使用 OcrInput.DetectPageOrientation()

对于关键工作流,请运行这两种方法并运用您自己的逻辑解决任何差异。 如果您看到不一致的旋转结果,请检查特定页面布局,并针对彼此验证一个方法。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

准备开始了吗?
Nuget 下载 6,136,090 | 版本: 2026.7 刚刚发布
Still Scrolling Icon

还在滚动吗?

想快速获得证据? PM > Install-Package IronOcr
运行示例 观看您的图像变成可搜索文本。