1

我目前正在编写一个pdf api。有一种方法可以将具有不同方向的选定页面合并到一个文档中。在运行时,如果所选页面是横向的,我想像那样合并,但目前显示的所有内容都有纵向。

我在网上查看了几个帖子,但没有一个有帮助。

这是我目前拥有的:

public static void MergePDF(string source, string destination, PageCollection pages) {
        try {
            PdfReader reader = new PdfReader(new RandomAccessFileOrArray(source), null);


            Document doc = new Document();
            PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(destination, FileMode.Create));
            doc.Open();
            PdfContentByte contentByte = writer.DirectContent;

            foreach (Page page in pages) {
                float width = reader.GetPageSize(page.Number).Width;
                float height = reader.GetPageSize(page.Number).Height;


                PdfImportedPage pdfImportedPagepage = writer.GetImportedPage(reader, page.Number);

                doc.NewPage();
                if (width > height) {
                    doc.SetPageSize(PageSize.A4.Rotate());
                } else {
                    doc.SetPageSize(PageSize.A4);
                }
                iTextSharp.text.Rectangle psize = reader.GetPageSizeWithRotation(page.Number);

                switch (psize.Rotation) {
                    case 0:
                        contentByte.AddTemplate(pdfImportedPagepage, 1f, 0, 0, 1f, 0, 0);
                        break;
                    case 90:
                        contentByte.AddTemplate(pdfImportedPagepage, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(page.Number).Height);
                        break;
                    case 180:
                        contentByte.AddTemplate(pdfImportedPagepage, -1f, 0, 0, -1f, 0, 0);
                        break;
                    case 270:
                        contentByte.AddTemplate(pdfImportedPagepage, 0, 1.0F, -1.0F, 0, reader.GetPageSizeWithRotation(page.Number).Width, 0);
                        break;
                    default:
                        break;
                }

            }

            doc.Close();

        } catch (Exception ex) {

        }
    }

谢谢您的帮助。

4

2 回答 2

4
if (width > height) {
                    doc.SetPageSize(PageSize.A4.Rotate());

你已经告诉你的程序,如果它比它高(横向)宽,那么它应该被旋转为纵向。只需删除该旋转段

                switch (psize.Rotation) {
                    case 0:
                        contentByte.AddTemplate(pdfImportedPagepage, 1f, 0, 0, 1f, 0, 0);
                        break;
                    case 90:
                        contentByte.AddTemplate(pdfImportedPagepage, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(page.Number).Height);
                        break;
                    case 180:
                        contentByte.AddTemplate(pdfImportedPagepage, -1f, 0, 0, -1f, 0, 0);
                        break;
                    case 270:
                        contentByte.AddTemplate(pdfImportedPagepage, 0, 1.0F, -1.0F, 0, reader.GetPageSizeWithRotation(page.Number).Width, 0);
                        break;
                    default:
                        break;

这部分正在计算页面的方向以了解旋转多少,如果您删除它,所有页面将完全按原样导入。如果您离开,它将全部旋转以垂直定位

于 2013-01-08T15:34:40.080 回答
2

根据 MKL 的建议,这很有效:

 Document doc = new Document();
            PdfCopy copy = new PdfCopy(doc, new FileStream(destination, FileMode.Create));
            doc.Open();

            foreach (Page page in pages) {
                doc.NewPage();
                copy.AddPage(copy.GetImportedPage(reader, page.Number));
            }

谢谢。

于 2013-01-08T16:39:40.593 回答