【问题标题】:iTextSharp how to rotate/switch page from landscape to portraitiTextSharp如何将页面从横向旋转/切换到纵向
【发布时间】:2011-07-17 17:37:30
【问题描述】:

我正在使用 iTextSharp 将多个 PDF 文件合并为一个 Pdf。我在网上找到了code sampletwo 来了解如何完成这项任务。

它们都可以正常工作,没有明显的问题,因为我能够将多个 PDF 文件合并到一个 PDF 中。

我确实遇到的问题是我希望所有页面都在 PORTRAIT 中,因为某些 PDF 文件在 LANDSCAPE 中有页面,我希望将它们旋转到 PORTRAIT。我不介意它们要么颠倒要么侧身,但它们都必须是纵向的。

查看所列示例中的代码部分:

page = writer.GetImportedPage(reader, i);
rotation = reader.GetPageRotation(i);

总是将页面旋转值返回为 0(零),因此代码部分

if (rotation == 90 rotation == 270)
{
    cb.AddTemplate(page, 0, -1f, 1f, 0, 0, 
                         reader.GetPageSizeWithRotation(i).Height);
}

永远不会被执行(如果这是应该做的,旋转页面)。

因此,根据第一个代码示例page = writer.GetImportedPage(reader, i) 的链接中的代码,我将如何将page 的页面布局从横向更改为纵向,然后再将其添加到新的合并 PDF 文档中cb.AddTemplate...?

PS。确定页面是横向还是纵向,我使用从 SO 获得的以下code(适用于上面的代码示例):

float pageXYRatio = page.Width / page.Height;
if (XYRatio > 1f)
{
    //page is landscape
}
else
{
    //page is portrait
}

任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: c# itext


    【解决方案1】:

    用那个例子http://alex.buayacorp.com/merge-pdf-files-with-itext-and-net.html 我添加了以下行:

    newDocument.SetPageSize(documents[0].GetPageSizeWithRotation(1));*
    
    newDocument = new Document();
    PdfWriter pdfWriter = PdfWriter.GetInstance(newDocument, outputStream);
    
    // START PAGE ORIENTATION FROM 1st Document 1st Page
    newDocument.SetPageSize(documents[0].GetPageSizeWithRotation(1));
    // END PAGE ORIENTATION
    newDocument.Open();
    PdfContentByte pdfContentByte = pdfWriter.DirectContent;
    

    我的 pdf 是从 SSRS 构建的,它们的大小相同,所以我使用第一个文档的第一页(我想)

    【讨论】:

      【解决方案2】:

      我用过这样的东西。

      cb.PdfDocument.NewPage();
      PdfImportedPage page1 = writer.GetImportedPage(reader, i);
      
      Rectangle psize = reader.GetPageSizeWithRotation(i);
      switch (psize.Rotation)
      {
          case 0:
              cb.AddTemplate(page1, 1f, 0, 0, 1f, 0, 0);
              break;
          case 90:
              cb.AddTemplate(page1, 0, -1f, 1f, 0, 0, psize.Height);
              break;
          case 180:
              cb.AddTemplate(page1, -1f, 0, 0, -1f, 0, 0);
              break;
          case 270:
              cb.AddTemplate(page1, 0, 1.0F, -1.0F, 0, psize.Width, 0);
              break;
          default:
              break;
      }
      

      【讨论】:

      • 谢谢。我也试过了,矩形路线。当我在 Landscape 中使用 PDF 运行代码时,Rectangle 值为: base {iTextSharp.text.Element} = {Rectangle: 841.8898x595.2756 (rot: 0 degree)} 当我在 Portrait 中使用 PDF 运行相同的代码时,矩形值为: base {iTextSharp.text.Element} = {Rectangle: 595x842 (rot: 0 degree)} 从不同的 XY 值您可以看到文件是横向或纵向的,但在两种情况下旋转都保持为 0。
      • 我必须补充一点,如果我按照我的示例代码使用 XYRatio,页面会上下颠倒,这很好,但它并没有拉伸整个 A4 页面大小,它更多的是一半拉伸。如果我能找到有关 AddTemplate 参数的更多详细信息,而不仅仅是 'float a'...'float f'
      • 这有帮助,除了当 roation 为 180 时,pdf 会消失。对于 180,您需要添加页面宽度/高度而不是 0,0。喜欢这个人:stackoverflow.com/questions/3579058/…
      【解决方案3】:
      // Instantiate the imported page as an Image
      
      const float HALF_INCH = 36f;
      // currentPosY is used to keep track of the current Y position.
      
      PdfImportedPage page = writer.GetImportedPage(reader, j);
      float scale = ((currentPosY - HALF_INCH - 10f) / page.Height);
      Image imgP = Image.GetInstance(page);
      
      if (page.Width > page.Height) { // Auto-detect landscape
       scale = ((currentPosY - HALF_INCH - 10f) / page.Width);
       imgP.RotationDegrees = 90f;   // could be 270f
      }
      
      imgP.ScalePercent(scale * 100f);
      imgP.SetAbsolutePosition(HALF_INCH, HALF_INCH);
      imgP.CompressionLevel = 9;
      imgP.Border = Image.BOX;
      imgP.BorderWidth = 1f;
      
      document.Add(imgP);
      

      【讨论】:

        【解决方案4】:

        正如你所发现的,你不能总是指望PdfReader.GetPageRotation()

        例如,如果 Document 对象是这样创建的:

        Document doc = new Document( new Rectangle(792, 612) );
        

        PdfReader.GetPageRotation()总是返回 0。

        真正一种确定页面是纵向还是横向的简化方法是比较您正在组合的每个 PDF 的每个页面的宽度和高度。如果宽度大于单个页面的高度,则向该页面添加一个字典条目并明确设置它的旋转。类似于以下HTTP handler:

        <%@ WebHandler Language='C#' Class='LandscapeToPortrait' %>
        using System;
        using System.IO;
        using System.Web;
        using iTextSharp.text;
        using iTextSharp.text.pdf;
        
        public class LandscapeToPortrait : IHttpHandler {
          public void ProcessRequest (HttpContext context) {
            HttpResponse Response = context.Response;
            Response.ContentType = "application/pdf";
            PdfReader[] readers = {
              new PdfReader(CreateReaderBytes(false)),
              new PdfReader(CreateReaderBytes(true))
            };
        
            using (Document doc = new Document()) {
              using (PdfCopy copy = new PdfCopy(doc, Response.OutputStream)) {
                doc.Open();
                foreach (PdfReader reader in readers) {
                  int n = reader.NumberOfPages;
                  for (int page = 0; page < n;) {
                    ++page;
                    float width = reader.GetPageSize(page).Width;
                    float height = reader.GetPageSize(page).Height;
                    if (width > height) {
                      PdfDictionary pageDict = reader.GetPageN(page);
                      pageDict.Put(PdfName.ROTATE, new PdfNumber(90));
                    }
                    copy.AddPage(copy.GetImportedPage(reader, page));
                  }
                }        
              }
            }
          }
          public bool IsReusable {
            get { return false; }
          }
          public byte[] CreateReaderBytes(bool isLandscape) {
            using (MemoryStream ms = new MemoryStream()) {
              Rectangle r = isLandscape
                ? new Rectangle(792, 612)
                : PageSize.LETTER
              ;
              using (Document doc = new Document(r)) {
                PdfWriter.GetInstance(doc, ms);
                doc.Open();
                for (int i = 0; i < 5; ++i) {
                  doc.Add(new Phrase("hello world"));
                  doc.NewPage();
                }
              }
              return ms.ToArray();
            }
          }
        }
        

        看看PdfDictionary class。和来自mailing listhere's a good thread 解释了iText[Sharp] 如何在每一页中存储页面旋转。

        当然,您可能想投资the book

        【讨论】:

          猜你喜欢
          • 2011-12-07
          • 2023-03-05
          • 2018-01-11
          • 2014-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-25
          相关资源
          最近更新 更多