C# 使用横向和纵向文档

C# 使用横向和纵向文档,c#,itextsharp,C#,Itextsharp,我目前正在编写一个pdf api。有一种方法可以将具有不同方向的选定页面合并到一个文档中。在运行时,如果所选页面处于横向,我希望像这样合并,但当前显示的所有内容都具有纵向 我在网上看过好几篇文章,但都没有帮助 这就是我目前拥有的: public static void MergePDF(string source, string destination, PageCollection pages) { try { PdfReader reader = ne

我目前正在编写一个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) {

        }
    }
谢谢你的帮助

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;
此部分将计算页面的方向,以了解旋转页面的程度,如果删除此部分,所有页面将按原样导入。如果你离开它,所有的东西都会旋转到垂直的位置

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

                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;

此部分将计算页面的方向,以了解旋转页面的程度,如果删除此部分,所有页面将按原样导入。如果您将其保留,则根据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));
            }

谢谢。

根据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));
            }

谢谢。

我没有那句台词就试过了。我甚至尝试过:doc.SetPageSize(PageSize.a4u);仍然显示我删除了switch语句并执行了此contentByte.AddTemplate(pdfImportedPagepage,0,0);为了澄清这一点,您删除了switch语句,if语句检查宽度是否大于高度?是的,我删除了,但它仍在旋转。有人告诉我这与示例中addTemplate附带的0和-f有关,我不完全理解它们。yetI在没有该行的情况下尝试过它。我甚至尝试过:doc.SetPageSize(PageSize.a4u);仍然显示我删除了switch语句并执行了此contentByte.AddTemplate(pdfImportedPagepage,0,0);这无助于澄清,您删除了switch语句,if语句检查宽度是否大于高度?是的,我删除了,它仍在旋转。有人告诉我这与示例中addTemplate附带的0和-f有关,我不完全理解他们是的,您使用
PdfWriter
而不是
PdfCopy
执行此任务是有特殊原因的吗
PdfCopy
只需按原样使用页面,包括页面的尺寸和方向……您使用
PdfWriter
而不是
PdfCopy
执行此任务是否有特殊原因
PdfCopy
只需按原样使用页面,包括其尺寸和方向……不客气。请考虑阅读(免费提供)更多关于如何使用ITEXT来处理PDF文件的信息。不客气。请考虑阅读(免费提供)更多关于如何使用ITEXT来操纵PDFS的信息。