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
相关产品推荐
相关产品推荐

