首页 文章

iTextSharp如何旋转/切换页面从横向到纵向

提问于
浏览
16

我正在使用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) 在将 cb.AddTemplate... 添加到新的合并PDF文档之前,我将如何将 page 的页面布局从Landscape更改为Portrait?

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

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

任何帮助,将不胜感激 .

谢谢

4 回答

  • 0

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

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

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

    PdfReader.GetPageRotation()always 返回0 .

    确定页面是纵向还是横向的一种非常简单的方法是比较每个PDF页面的每个页面的宽度和高度're combining. if the width is greater than the height of an individual page, add a dictionary entry to that page and explicitly set it'的旋转 . 像下面这样的东西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 . 和here's a good thread来自mailing list解释iText [Sharp]如何在每页中存储页面旋转 .

    当然,你可能想投资the book .

  • 12

    我用过这样的东西 .

    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;
    }
    
  • 6

    用那个例子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构建的,它们的大小相同,所以我使用第一篇文档的第一页(我想)

  • 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);
    

相关问题