2016-04-08 20 views
7

我有以下简化代码,用于从多个位置提取现有的8x10 PDF,如果需要旋转它们(几乎都需要),然后将它们写入单个11x17 PDF页面网页...旋转多个PDF并写入一个PDF

while (Page < StackOne.Length) 
{ 
    Files++; 
    using (var strm = new FileStream(RenderPath + "Test_" + Page + ".pdf", FileMode.Create, FileAccess.Write, FileShare.Read)) 
    { 
     using (var MasterReport = new iTextSharp.text.Document(iTextSharp.text.PageSize._11X17)) 
     { 
      using (var writer = PdfWriter.GetInstance(MasterReport, strm)) 
      { 
       MasterReport.Open(); 
       MasterReport.NewPage(); 
       var cb = writer.DirectContent; 

       for (; Page <= NumPages * Files && Page < StackOne.Length; Page++) 
       { 
        var ProductionEntry = StackOne[Page - 1]; 

        var filepath = NetPath + ProductionEntry.UniqueProductId + ".pdf"; 
        if (File.Exists(filepath)) 
        { 
         var reader = new PdfReader(filepath); 
         var pagesize = reader.GetPageSize(1); 
         if (pagesize.Height > pagesize.Width) 
         { 
          var ExistingPage = reader.GetPageN(1); 
          var rotation = ExistingPage.GetAsNumber(PdfName.ROTATE); 
          int desiredrot = 90; 
          if (rotation != null) 
          { 
           desiredrot += rotation.IntValue; 
           desiredrot %= 360; 
          } 
          ExistingPage.Put(PdfName.ROTATE, new PdfNumber(desiredrot)); 
         } 
         cb.AddTemplate(writer.GetImportedPage(reader, 1), 50, 50); 
        } 
        MasterReport.NewPage(); 
       } 
      } 
     } 
    } 
} 

但是呈现不具备页面的页面旋转,他们应该,我已经验证>等宽确实正在采取的高度,但返回的页面还是8X10的,而不是10×8写在每个11x17页面上。

我搜索了一个这个特定的问题,但找不到一个不只是写入另一个文件或整个页面,而是写入11x17工作表上的特定位置。

编辑:那么一点点试验和寻找其他的例子我能确切位置旋转8x10的网页,并写信给我的11x17但不幸的是我似乎无法找到一种方法,把它放在我想在这里是有关的代码片段:

var reader = new PdfReader(filepath); 
var tm = new AffineTransform(1.0F, 0, 0, 1.0F, x, y); 
if (reader.GetPageSize(1).Height > reader.GetPageSize(1).Width) 
    tm.SetTransform(0, -1f, 1f, 0, 0, reader.GetPageSize(1).Height); 
writer.DirectContent.AddTemplate(writer.GetImportedPage(reader, 1), tm); 
+0

尽管PdfCopy是推荐的方法,但我找不到任何支持将多个页面写入单个页面的文档,更不用说旋转了。 DirectContent似乎是唯一的方法。 (另请参阅http://developers.itextpdf.com/examples/merging-pdf-documents/create-booklet-a4-document) – JasonSec

+0

如果您希望页面尽可能原创,但建议您使用'PdfCopy'通过缩放和更改多个其他页面来改变它。 – mkl

+0

@mkl这也是我的印象,谢谢验证。 – JasonSec

回答

4

好吧吨左右的搜索后,并过滤代码它出现的答案是很简单的(像往常一样),如上图所示,我最初的问题是把一个旋转标签上页面没有按照我的预期旋转页面。在了解了为pdftemplate指定矩阵的选项之后,它非常简单,这里是工作代码:

var reader = new PdfReader(filepath); 
var tm = new AffineTransform(); 
if (reader.GetPageSize(1).Height > reader.GetPageSize(1).Width) 
    tm.SetTransform(0, -1f, 1f, 0, 0, reader.GetPageSize(1).Height); 
tm.Concatenate(new AffineTransform(1f, 0, 0, 1f, y, x)); 
writer.DirectContent.AddTemplate(writer.GetImportedPage(reader, 1), tm); 

P.S.​​,P:162(物理形式143),用于那些谁不新鲜出代数

EDIT的

:作为@mkl具有低于下面说明实际上仅仅适用于0°或90°旋转,如果条目您有180°或270°的页面,此代码需要进行一些修改。原件中的任何注释都将丢失。

+0

在某些情况下,结果可能仍然与您的期望不同:源页面可能会有一个180°**旋转**入口;在这种情况下,您的副本是上下颠倒的,而原始文件显示正确。本质上,您的代码适用于源**旋转** 0°和90°的条目,但不适用于180°和270°。如果源使用非默认的** UserUnit **,则可能会得到缩小的副本;但是,更改页面大小的价值非常罕见,例如您的页面大小。此外,如果您碰巧对注释感兴趣,他们会迷失方向。 – mkl

+0

@mkl这不适用于我的情况,但我绝对看到这可能是一个问题,我将它添加为我的答案的附录。 – JasonSec

0

您可以简单地将仿射变换添加到AddTemplate过程中。

像这样:

   PdfContentByte cb = stamper.getOverContent(pageNumber); 
       int rotation = reader.getPageRotation(pageNumber); 

       PdfImportedPage page = stamper.getImportedPage(reader, pageNumber); 

       if (rotation == 270) 
        cb.addTemplate(page, 0, 1f, -1f, 0, reader.getPageSizeWithRotation(pageNumber).getWidth(), 0); 
       else if (rotation == 90) { 
        cb.addTemplate(page, 0, -1f, 1f, 0, 0, reader.getPageSizeWithRotation(pageNumber).getHeight()); 
       } else { 
        cb.addTemplate(page, 0, 0); 
       } 

它的Java,但我认为这不是一个问题。

+0

您的解决方案仍然错过了对180°情况的适当处理。 – mkl