围绕一个点旋转页面上的所有文本



我刚刚花了一个小时来解决这个问题,我敢肯定这不是最好的;如果有更好的解决办法,我很乐意听听。

我需要围绕一个点旋转页面上的所有文本。我试过将点转换为原点,执行旋转,然后转换回来,但似乎最终的转换是相对于旋转变换发生的(考虑一下,有意义)。

这是我代码的简化版本:

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

感觉很乱,但它工作-如果有一个更简单的方法使用转换和旋转的组合,我将非常感兴趣。

最新更新