2015-05-19 36 views
0

我刚刚烧了一个小时,找出解决方案,我肯定不是最好的;我很乐意听到有没有更好的解决方案。ITextSharp旋转页面上的所有文本关于点

我需要旋转页面上关于点的所有文本。我试图将点转化为原点,执行一个旋转然后变换回去,但是似乎最终的变换正在发生在相对于旋转变换(考虑它的意义是合理的)上。

这里是我的代码复杂度降低的版本:

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 

回答

0

下面是我临到解决方案,基本上执行不用翻译旋转,然后通过添加两种载体,一种从获得翻译旋转原点到所需旋转中心和一个从(即所需旋转中心将已被旋转的地方)获取旋转原点

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 

感觉凌乱,但它的工作原理 - 我如果有的话,非常感兴趣使用变换和旋转组合的更简单的方法。

+0

如果旋转角度只能是0,90,180或270(并且中间没有值),那么实现您的目标有一个更简单的方法。如果角度可以有*任何*值(不只是90的倍数),那么你确实需要做数学运算,并且使用'AffineTransform'是更人类可读的方式来做到这一点(尽管它看起来很复杂) 。 –

+0

@BrunoLowagie谢谢你的评论。恐怕我需要旋转任意数量,所以我不能使用页面旋转thingie。你知道一个更简单的方法来实现我的目标使用链式AffineTransforms没有所有的三角? – GHC

+1

你可以计算“乘法”不同的转换,当你使用另一个AddTemplate()函数时,需要6个值'a','b','c','d','e'和'f' '方法。 'e'和'f'值定义了翻译。在旋转的情况下,'a'和'd'将是'0',而'b'将是'-sin(角度)','d'将会是'cos(角度)'。检查正确的数学(我只是从头顶写这篇文章)的[PDF with iText的ABC](https://leanpub.com/itext_pdfabc)的第4.2.5.1节。 –