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

Ria*_*aan 16 c# itext

我正在使用iTextSharp将多个PDF文件合并为一个Pdf.我发现了一个代码示例2在网络上对如何完成这个任务.

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

我所遇到的问题是我希望所有页面都在PORTRAIT中,因为一些PDF文件在LANDSCAPE中有页面,我希望它们可以旋转到PORTRAIT.我不介意他们要么颠倒,要么侧身,但他们都必须是肖像.

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

page = writer.GetImportedPage(reader, i);
rotation = reader.GetPageRotation(i);
Run Code Online (Sandbox Code Playgroud)

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

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

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

那么,基于第一个代码示例链接中的代码,在将其添加到新的合并PDF文档之前,我将page = writer.GetImportedPage(reader, i)如何更改page从Landscape到Portrait 的页面布局cb.AddTemplate...

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

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

任何帮助,将不胜感激.

谢谢

Gui*_*tos 13

我用过这样的东西.

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;
}
Run Code Online (Sandbox Code Playgroud)


kuu*_*nbo 6

正如您所知,您不能总是指望PdfReader.GetPageRotation().

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

Document doc = new Document( new Rectangle(792, 612) );
Run Code Online (Sandbox Code Playgroud)

PdfReader.GetPageRotation()始终返回0.

确定页面是纵向还是横向的真正简化方法是比较您要合并的每个PDF的每个页面的宽度和高度.如果宽度大于单个页面的高度,请向该页面添加字典条目并明确设置其旋转.像下面的HTTP处理程序:

<%@ 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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

看一下PdfDictionary类.和这里是一个很好的线程邮件列表,说明如何iText的[夏普]存储在每个页面的页面旋转.

当然,你可能想投资本书.