You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET中使用iText7旋转PDF页面并正确添加到新PDF的问题

解决iText7中旋转页面在n-up排版中的显示问题

当源PDF页面带有旋转属性时,直接将其复制为PdfFormXObject添加到新页面不会自动应用旋转,导致显示偏移。需要手动读取旋转角度,并在绘制XObject时应用对应的旋转变换,同时调整位置以保证页面正确对齐。

修改后的VB.NET代码

Function rotate_pdf()
    Dim inputpdf As String = "c:\test\A4.pdf"
    Dim outputpdf As String = "c:\test\rotated.pdf"
    Dim newsize As iText.Kernel.Geom.Rectangle = New iText.Kernel.Geom.Rectangle(1190, 850)

    Dim pdfDoc As New PdfDocument((New PdfWriter(outputPDF)).SetSmartMode(True))
    Dim srcDoc As New PdfDocument(New PdfReader(inputpdf))

    pdfDoc.SetDefaultPageSize(New PageSize(newsize))

    Dim page1 As PdfPage = srcDoc.GetPage(1)
    Dim pagecopy1 As PdfFormXObject = page1.CopyAsFormXObject(pdfDoc)
    Dim rotation As Integer = page1.GetRotation() ' 获取源页面的旋转角度

    Dim page As PdfPage = pdfDoc.AddNewPage()
    Dim canvas As New PdfCanvas(page)

    ' 处理旋转后宽高互换的情况
    Dim xObjWidth As Single = pagecopy1.GetWidth()
    Dim xObjHeight As Single = pagecopy1.GetHeight()
    If rotation = 90 Or rotation = 270 Then
        Dim temp As Single = xObjWidth
        xObjWidth = xObjHeight
        xObjHeight = temp
    End If

    ' 保持原代码的起始偏移位置
    Dim startX As Single = 20
    Dim startY As Single = 20

    ' 根据旋转角度应用对应的变换矩阵
    Select Case rotation
        Case 90
            canvas.SaveState()
            canvas.ConcatMatrix(0, 1, -1, 0, startX + xObjWidth, startY)
            canvas.AddXObject(pagecopy1)
            canvas.RestoreState()
        Case 180
            canvas.SaveState()
            canvas.ConcatMatrix(-1, 0, 0, -1, startX + xObjWidth, startY + xObjHeight)
            canvas.AddXObject(pagecopy1)
            canvas.RestoreState()
        Case 270
            canvas.SaveState()
            canvas.ConcatMatrix(0, -1, 1, 0, startX, startY + xObjHeight)
            canvas.AddXObject(pagecopy1)
            canvas.RestoreState()
        Case Else ' 0度直接添加
            canvas.AddXObject(pagecopy1, startX, startY)
    End Select

    pdfDoc.Close()
    srcDoc.Close()

    MsgBox("Done")
End Function

核心要点

  • 读取旋转属性:通过GetRotation()获取源页面的旋转角度(仅会返回0/90/180/270四个有效值)
  • 尺寸适配:旋转90/270度时,原页面宽高会互换,需提前修正尺寸计算逻辑
  • 变换矩阵:使用ConcatMatrix构建旋转+平移的组合变换,确保页面旋转后仍处于目标位置
  • 状态管理:用SaveState()和RestoreState()隔离当前变换,避免影响后续画布操作

内容的提问来源于stack exchange,提问作者Ash_stack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 00:35:18