2012-09-06 32 views
1

我使用iTextSharp的加入多发PDF文档,并添加脚注。 我的代码工作正常 - 除了横向页面 - 它没有检测到页面旋转 - 页脚不centerd景观:iTextSharp的PdfCopy和横向页面

public static int AddPagesFromStream(Document document, PdfCopy pdfCopy, Stream m, bool addFooter, int detailPages, string footer, int footerPageNumOffset, int numPages, string pageLangString, string printLangString) 
    { 
     CreateFont(); 
     try 
     { 
      m.Seek(0, SeekOrigin.Begin); 
      var reader = new PdfReader(m); 

      // get page count 
      var pdfPages = reader.NumberOfPages; 
      var i = 0; 

      // add pages 
      while (i < pdfPages) 
      { 
       i++; 

       // import page with pdfcopy 
       var page = pdfCopy.GetImportedPage(reader, i); 

       // get page center 
       float posX; 
       float posY; 
       var rotation = page.BoundingBox.Rotation; 
       if (rotation == 0 || rotation == 180) 
       { 
        posX = page.Width/2; 
        posY = 0; 
       } 
       else 
       { 
        posX = page.Height/2; 
        posY = 20f; 
       } 

       var ps = pdfCopy.CreatePageStamp(page); 
       var cb = ps.GetOverContent(); 

       // add footer 
       cb.SetColorFill(BaseColor.WHITE); 
       var gs1 = new PdfGState {FillOpacity = 0.8f}; 
       cb.SetGState(gs1); 
       cb.Rectangle(0, 0, document.PageSize.Width, 46f + posY); 
       cb.Fill(); 

       // Text 
       cb.SetColorFill(BaseColor.BLACK); 
       cb.SetFontAndSize(baseFont, 7); 
       cb.BeginText(); 

       // create text 
       var pages = string.Format(pageLangString, i + footerPageNumOffset, numPages); 
       cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, printLangString, posX, 40f + posY, 0f); 
       cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, footer, posX, 28f + posY, 0f); 
       cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, pages, posX, 20f + posY, 0f); 
       cb.EndText(); 

       ps.AlterContents(); 

       // add page to new pdf 
       pdfCopy.AddPage(page); 
      } 

      // close PdfReader 
      reader.Close(); 
      // return number of pages 
      return i; 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
      return 0; 
     } 
    } 

如何检测在这种情况下,页面旋转(例如,横向)格式?给出的例子适用于PdfReader,但不适用于PdfCopy。

编辑: 为什么需要PdfCopy?我试图复制一个字的PDF导出。当您尝试使用PdfReader复制页面时,某些单词超链接将不起作用。只有PdfCopy传输所有需要的页面信息。

编辑:(解决) 您需要使用reader.GetPageRotation(我);

回答

3

您需要使用reader.GetPageRotation(我);

解决代码:

public static int AddPagesFromStream(Document document, PdfCopy pdfCopy, Stream m, bool addFooter, int detailPages, string footer, int footerPageNumOffset, int numPages, string pageLangString, string printLangString) 
    { 
     CreateFont(); 
     try 
     { 
      m.Seek(0, SeekOrigin.Begin); 
      var reader = new PdfReader(m); 

      // get page count 
      var pdfPages = reader.NumberOfPages; 
      var i = 0; 

      // add pages 
      while (i < pdfPages) 
      { 
       i++; 

       // import page with pdfcopy 
       var page = pdfCopy.GetImportedPage(reader, i); 

       // get page center 
       float posX; 
       float posY; 
       var rotation = reader.GetPageRotation(i); 
       if (rotation == 0 || rotation == 180) 
       { 
        posX = page.Width/2; 
        posY = 0; 
       } 
       else 
       { 
        posX = page.Height/2; 
        posY = 20f; 
       } 

       var ps = pdfCopy.CreatePageStamp(page); 
       var cb = ps.GetOverContent(); 

       // add footer 
       cb.SetColorFill(BaseColor.WHITE); 
       var gs1 = new PdfGState {FillOpacity = 0.8f}; 
       cb.SetGState(gs1); 
       cb.Rectangle(0, 0, document.PageSize.Width, 46f + posY); 
       cb.Fill(); 

       // Text 
       cb.SetColorFill(BaseColor.BLACK); 
       cb.SetFontAndSize(baseFont, 7); 
       cb.BeginText(); 

       // create text 
       var pages = string.Format(pageLangString, i + footerPageNumOffset, numPages); 
       cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, printLangString, posX, 40f + posY, 0f); 
       cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, footer, posX, 28f + posY, 0f); 
       cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, pages, posX, 20f + posY, 0f); 
       cb.EndText(); 

       ps.AlterContents(); 

       // add page to new pdf 
       pdfCopy.AddPage(page); 
      } 

      // close PdfReader 
      reader.Close(); 
      // return number of pages 
      return i; 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
      return 0; 
     } 
    } 
1

在您的代码示例,page的类型是PdfImportedPage的。你在要求它的包围盒。 PdfImportedPage是PdfTemplate类型的,所以你要求XObject的边界框。我怀疑这会起作用。

你应该问读者对象的页面的旋转。我想你已经发现了你自己,因为你说“给定的例子适用于PdfReader,但不适用于PdfCopy”。

+0

是 - 我做到了。但我不相信我需要这样做两次...一个PdfReader获取所需的信息和一个PdfCopy来进行复制。 –