iTextSharp 在我想要横向显示的页面之后旋转页面

iTextSharp is rotating the page after the one I want to landscape

我根据一些建议拼凑了这段代码。它几乎可以工作,但它会在需要的页面之后旋转页面。我的示例中的第一页是横向的,但第二页是旋转的页面。我不明白这是怎么回事。

        Document document = new Document();
        PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outFile, FileMode.Create));
        document.Open();
        PdfContentByte cb = writer.DirectContent;
        PdfReader reader = new PdfReader(bytes);
        int pages = reader.NumberOfPages;
        for (int i = 1; i <= pages; i++)
        {
            document.NewPage();
            PdfImportedPage page = writer.GetImportedPage(reader, i);

            Rectangle psize = reader.GetPageSizeWithRotation(i);
            document.SetPageSize(psize.Width > psize.Height ? PageSize.A4.Rotate() : PageSize.A4);

            switch (psize.Rotation)
            {
                case 0:
                    cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
                    break;
                case 90:
                    cb.AddTemplate(page, 0, -1f, 1f, 0, 0, psize.Height);
                    break;
                case 180:
                    cb.AddTemplate(page, -1f, 0, 0, -1f, 0, 0);
                    break;
                case 270:
                    cb.AddTemplate(page, 0, 1.0F, -1.0F, 0, psize.Width, 0);
                    break;
            }                
        }
        document.Close();
        writer.Close();

你们看到了吗?

我尝试按照 mkl 的建议使用 PdfCopy。到目前为止它似乎工作正常并且简单得多。这是我正在使用的。

        using (Document document = new Document())
        {
            using (PdfCopy copy = new PdfCopy(document, new FileStream(outFile, FileMode.Create)))
            {
                document.Open();
                PdfReader reader = new PdfReader(bytes);
                for (int page = 0; page < reader.NumberOfPages;)
                {
                    ++page;
                    copy.AddPage(copy.GetImportedPage(reader, page));
                }
            }
        }

我有一个案例,通过我们的文件系统进入的 pdf 文档偶尔会被客户的扫描仪轮换 属性。这导致发送它们的另一个系统出现问题。我使用 Erosebe 的代码和 mkl 的修复来创建一个 class 以在将来有人需要时正确地执行此操作。

输出将是一个方向正确且旋转为 0 的文档。它使用 itextsharp。

using System;
using System.IO;
using iTextSharp.text.pdf;
using iTextSharp.text;

public static void UnRotate(string inputPath, string outputPath)
{
    using (Document document = new Document())
    {
        using (PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outputPath, FileMode.Create)))
        {
            using(PdfReader reader = new PdfReader(inputPath))
            {
                document.Open();
                PdfContentByte cb = writer.DirectContent;

                int pages = reader.NumberOfPages;

                for (int i = 1; i <= pages; i++)
                {
                    iTextSharp.text.Rectangle psize = reader.GetPageSizeWithRotation(i);
                    document.SetPageSize(psize.Width > psize.Height ? PageSize.LETTER.Rotate() : PageSize.LETTER);

                    document.NewPage();
                    PdfImportedPage page = writer.GetImportedPage(reader, i);

                    switch (psize.Rotation)
                    {
                        case 0:
                            writer.DirectContent.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
                            break;

                        case 90:
                            writer.DirectContent.AddTemplate(page, 0, -1f, 1f, 0, 0, psize.Height);
                            break;

                        case 180:
                            writer.DirectContent.AddTemplate(page, -1f, 0, 0, -1f, psize.Width, psize.Height);
                            break;

                        case 270:
                            writer.DirectContent.AddTemplate(page, 0, 1f, -1f, 0, psize.Width, 0);
                            break;

                        default:
                            throw new InvalidOperationException(string.Format("Unexpected page rotation: [{0}].", psize.Rotation));
                    }
                }
                document.Close();
            }
            writer.Close();
        }
    }
}