Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# iTextSharp如何将页面从横向旋转/切换到纵向_C#_Itext - Fatal编程技术网

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

C# iTextSharp如何将页面从横向旋转/切换到纵向,c#,itext,C#,Itext,我正在使用iTextSharp将多个PDF文件合并为一个PDF。关于如何完成这项任务,我在网上找到了一个答案 它们都可以工作,没有明显的问题,因为我可以将多个PDF文件合并到一个PDF中 我的问题是,我希望所有的页面都是纵向的,因为一些PDF文件的页面是横向的,我希望它们旋转到纵向。我不介意它们要么倒过来,要么横着,但它们都必须是肖像 查看所列示例中的代码部分: page = writer.GetImportedPage(reader, i); rotation = reader.GetPage

我正在使用iTextSharp将多个PDF文件合并为一个PDF。关于如何完成这项任务,我在网上找到了一个答案

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

我的问题是,我希望所有的页面都是纵向的,因为一些PDF文件的页面是横向的,我希望它们旋转到纵向。我不介意它们要么倒过来,要么横着,但它们都必须是肖像

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

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文档中

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

任何帮助都将不胜感激


谢谢

我用过这样的东西

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

正如你所发现的,你不能总是依靠别人

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

Document doc = new Document( new Rectangle(792, 612) );
PdfReader.GetPageRotation()
将始终返回0

决定一个页面是纵向的还是横向的一个非常简单的方法是比较要合并的每个PDF的每个页面的宽度和高度。如果宽度大于单个页面的高度,请向该页面添加词典条目,并显式设置其旋转。如下所示:


使用制度;
使用System.IO;
使用System.Web;
使用iTextSharp.text;
使用iTextSharp.text.pdf;
公共级景观拓扑图:IHttpHandler{
公共void ProcessRequest(HttpContext上下文){
HttpResponse Response=context.Response;
Response.ContentType=“application/pdf”;
PdfReader[]读卡器={
新的PDF阅读器(CreateReaderBytes(false)),
新的PDF阅读器(CreateReaderBytes(true))
};
使用(文档文档=新文档()){
使用(PdfCopy copy=newpdfcopy(doc,Response.OutputStream)){
doc.Open();
foreach(读卡器中的PdfReader读卡器){
int n=reader.NumberOfPages;
对于(int page=0;page高度){
PdfDictionary pageDict=reader.GetPageN(第页);
pageDict.Put(PdfName.ROTATE,新的PdfNumber(90));
}
copy.AddPage(copy.GetImportedPage(阅读器,第页));
}
}        
}
}
}
公共布尔可重用{
获取{return false;}
}
公共字节[]CreateReaderBytes(布尔岛景观){
使用(MemoryStream ms=new MemoryStream()){
矩形r=岛景
?新矩形(792612)
:PageSize.LETTER
;
使用(单据单据=新单据(r)){
PdfWriter.GetInstance(doc,ms);
doc.Open();
对于(int i=0;i<5;++i){
添加文件(新短语(“hello world”);
doc.NewPage();
}
}
返回ToArray女士();
}
}
}
请看下面的图片。通过解释iText[Sharp]如何在每页中存储页面旋转

当然,你可能会想投资。

举个例子 我添加了以下行:

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

谢谢。我也试过,矩形路线。在横向中使用PDF运行代码时,矩形值为:base{iTextSharp.text.Element}={Rectangle:841.8898x595.2756(rot:0度)}在纵向中使用PDF运行相同代码时,矩形值为:base{iTextSharp.text.Element}={Rectangle:595x842(rot:0度)}从不同的XY值中,您可以看到文件是横向或纵向的,但在这两种情况下旋转都保持为0。我必须补充一点,如果按照示例代码使用XYRatio,页面会翻转过来,这很好,但它不会拉伸到整个A4页面大小,而是拉伸了一半。如果我能找到AddTemplate参数的更多细节,而不仅仅是“float a”…“float f”,这会有所帮助,只是当roation为180时,pdf会消失。对于180,您需要添加页面宽度/高度,而不是0,0。就像这个家伙:
<%@ 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();
    }
  }
}
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;
// 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);