2012-09-06 2 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; 
     } 
    } 

? 주어진 예제는 PdfCopy에 대한 것이 아니라 PdfReader에 대해 작동합니다.

편집 : 왜 내가 PdfCopy가 필요합니까? 나는 pdf 수출 낱말 복사를 시도했다. PdfReader로 페이지를 복사하려고하면 일부 단어 하이퍼 링크가 작동하지 않습니다. PdfCopy 만 필요한 모든 페이지 정보를 전송합니다.

편집 : (SOLVED) 독자는 reader.GetPageRotation (i)을 사용해야합니다.

답변

3

reader.GetPageRotation (i);

해결 코드 :

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의 경계 상자를 요청합니다. 나는 그것이 효과가 있을지 의심 스럽다.

독자 개체에게 페이지 회전을 요청해야합니다. 나는 당신이 이미 "PdfCopy가 아니라 PdfReader를위한 주어진 예제"라고 말했기 때문에 당신 자신을 발견했다고 생각합니다.

+0

예 - 나는했다. 하지만 나는 이것을 두 번 할 필요가 있다고 생각하지 않습니다 ... 하나의 PdfReader가 필요한 정보를 얻고 하나의 PdfCopy가 복사를 수행합니다. –