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

感觉很乱,但它确实有效 - 如果有更简单的方法使用变换和旋转的组合,我会非常感兴趣。