ITextSharp 围绕一个点旋转页面上的所有文本
ITextSharp rotate all text on a page about a point
我花了一个小时来解决这个问题,我确信这不是最好的;如果有更好的解决方案,我很乐意听到。
我需要围绕一个点旋转页面上的所有文本。我试过将点变换到原点,执行旋转然后再变换回来,但似乎最终变换是相对于旋转变换发生的(考虑一下,这是有道理的)。
这是我的代码的简化版本:
imports itextsharp.text
public class Example
public shared function RotateAboutPoint(byval sourceReader as pdf.pdfreader, byval rads as double, byval centreX as double, byval centreY as double) as pdf.pdfreader
Using ms As New System.IO.MemoryStream
Using doc As New Document
Using writer As pdf.PdfWriter = pdf.PdfWriter.GetInstance(doc, ms)
doc.Open()
For i As Integer = 1 To sourceReader.NumberOfPages
Dim p As pdf.PdfTemplate = writer.GetImportedPage(sourceReader, i)
dim trans as new itextsharp.awt.geom.affinetransform
trans.translate(-centrex, -centrey)
trans.rotate(-rads)
trans.translate(centerx, centery)
doc.setpagesize(sourcereader.getpagesizewithrotation(I))
doc.newpage()
writer.DirectContent.AddTemplate(p, trans)
Next i
doc.Close()
End Using
End Using
sourceReader.Close()
sourceReader.Dispose()
return New pdf.PdfReader(ms.ToArray)
End Using
end function
end class
这是我找到的解决方案,基本上执行旋转而不平移,然后通过添加两个向量进行平移,一个从旋转原点到所需的旋转中心,一个从(所需旋转中心将旋转到的位置)到旋转原点
imports itextsharp.text
public class Example
public shared function RotateAboutPoint(byval sourceReader as pdf.pdfreader, byval rads as double, byval centreX as double, byval centreY as double) as pdf.pdfreader
Using ms As New System.IO.MemoryStream
Using doc As New Document
Using writer As pdf.PdfWriter = pdf.PdfWriter.GetInstance(doc, ms)
doc.Open()
For i As Integer = 1 To sourceReader.NumberOfPages
Dim p As pdf.PdfTemplate = writer.GetImportedPage(sourceReader, i)
Dim transAdjust As New iTextSharp.awt.geom.AffineTransform
transAdjust.SetToIdentity()
transAdjust.Translate(centreX - ((centreX * System.Math.Cos(rads)) + (centreY * System.Math.Sin(rads))), centreY - ((centreX * -System.Math.Sin(rads)) + (centreY * System.Math.Cos(rads))))
Dim transRotate As New iTextSharp.awt.geom.AffineTransform
transRotate.SetToIdentity()
transRotate.Rotate(-rads)
Dim finalTrans As New iTextSharp.awt.geom.AffineTransform
finalTrans.SetToIdentity()
finalTrans.Concatenate(transAdjust)
finalTrans.Concatenate(transRotate)
doc.setpagesize(sourcereader.getpagesizewithrotation(I))
doc.newpage()
writer.DirectContent.AddTemplate(p, finalTrans)
Next i
doc.Close()
End Using
End Using
sourceReader.Close()
sourceReader.Dispose()
return New pdf.PdfReader(ms.ToArray)
End Using
end function
end class
感觉很乱,但它确实有效 - 如果有更简单的方法使用变换和旋转的组合,我会非常感兴趣。
我花了一个小时来解决这个问题,我确信这不是最好的;如果有更好的解决方案,我很乐意听到。
我需要围绕一个点旋转页面上的所有文本。我试过将点变换到原点,执行旋转然后再变换回来,但似乎最终变换是相对于旋转变换发生的(考虑一下,这是有道理的)。
这是我的代码的简化版本:
imports itextsharp.text
public class Example
public shared function RotateAboutPoint(byval sourceReader as pdf.pdfreader, byval rads as double, byval centreX as double, byval centreY as double) as pdf.pdfreader
Using ms As New System.IO.MemoryStream
Using doc As New Document
Using writer As pdf.PdfWriter = pdf.PdfWriter.GetInstance(doc, ms)
doc.Open()
For i As Integer = 1 To sourceReader.NumberOfPages
Dim p As pdf.PdfTemplate = writer.GetImportedPage(sourceReader, i)
dim trans as new itextsharp.awt.geom.affinetransform
trans.translate(-centrex, -centrey)
trans.rotate(-rads)
trans.translate(centerx, centery)
doc.setpagesize(sourcereader.getpagesizewithrotation(I))
doc.newpage()
writer.DirectContent.AddTemplate(p, trans)
Next i
doc.Close()
End Using
End Using
sourceReader.Close()
sourceReader.Dispose()
return New pdf.PdfReader(ms.ToArray)
End Using
end function
end class
这是我找到的解决方案,基本上执行旋转而不平移,然后通过添加两个向量进行平移,一个从旋转原点到所需的旋转中心,一个从(所需旋转中心将旋转到的位置)到旋转原点
imports itextsharp.text
public class Example
public shared function RotateAboutPoint(byval sourceReader as pdf.pdfreader, byval rads as double, byval centreX as double, byval centreY as double) as pdf.pdfreader
Using ms As New System.IO.MemoryStream
Using doc As New Document
Using writer As pdf.PdfWriter = pdf.PdfWriter.GetInstance(doc, ms)
doc.Open()
For i As Integer = 1 To sourceReader.NumberOfPages
Dim p As pdf.PdfTemplate = writer.GetImportedPage(sourceReader, i)
Dim transAdjust As New iTextSharp.awt.geom.AffineTransform
transAdjust.SetToIdentity()
transAdjust.Translate(centreX - ((centreX * System.Math.Cos(rads)) + (centreY * System.Math.Sin(rads))), centreY - ((centreX * -System.Math.Sin(rads)) + (centreY * System.Math.Cos(rads))))
Dim transRotate As New iTextSharp.awt.geom.AffineTransform
transRotate.SetToIdentity()
transRotate.Rotate(-rads)
Dim finalTrans As New iTextSharp.awt.geom.AffineTransform
finalTrans.SetToIdentity()
finalTrans.Concatenate(transAdjust)
finalTrans.Concatenate(transRotate)
doc.setpagesize(sourcereader.getpagesizewithrotation(I))
doc.newpage()
writer.DirectContent.AddTemplate(p, finalTrans)
Next i
doc.Close()
End Using
End Using
sourceReader.Close()
sourceReader.Dispose()
return New pdf.PdfReader(ms.ToArray)
End Using
end function
end class
感觉很乱,但它确实有效 - 如果有更简单的方法使用变换和旋转的组合,我会非常感兴趣。