如何使用 iTextSharp 缩放 PDF 页面,同时保持方向?

2024-02-28

如何在 itextsharp 中保持旋转的同时缩放 pdf 页面? 我有以下内容,但我失去了旋转:

    public static void ScaleToLetter(string inPDF, string outPDF)
    {
        PdfReader reader = new PdfReader(inPDF);
        Document doc = new Document(PageSize.LETTER);
        Document.Compress = true;
        PdfWriter writer = PdfWriter.GetInstance(doc, 
            new FileStream(outPDF, FileMode.Create));
        doc.Open();
        PdfContentByte cb = writer.DirectContent;
        int rotation;

        PdfImportedPage page;
        for (int pageNumber = 1; pageNumber <= reader.NumberOfPages; pageNumber++)
        {
            page = writer.GetImportedPage(reader, pageNumber);
            rotation = reader.GetPageRotation(pageNumber);

            cb.AddTemplate(page, 
                PageSize.LETTER.Width / reader.GetPageSize(pageNumber).Width, 
                0, 0, 
                PageSize.LETTER.Height / reader.GetPageSize(pageNumber).Height, 
                0, 0);
            doc.NewPage();
        }
        doc.Close();
    }

我遇到了类似的问题,并通过更改每个页面的高度和宽度(从字母到字母旋转)来使其工作。换句话说,如果当前页面又薄又高,那么它就是垂直的。但如果它又宽又短,那么它就是水平的,我应该旋转页面。

这是您更改的代码:

    public static void ScaleToLetter(string inPDF, string outPDF)
    {
        using (var reader           = new PdfReader(inPDF))
        using (var doc              = new Document(PageSize.LETTER))
        {
            Document.Compress       = true;
            using (
                var writer          = PdfWriter.GetInstance(doc,
                    new FileStream(outPDF, FileMode.Create)))
            {
                doc.Open();
                var cb              = writer.DirectContent;

                PdfImportedPage page;
                for (var pageNumber = 1; pageNumber <= reader.NumberOfPages; pageNumber++)
                {
                    page            = writer.GetImportedPage(reader, pageNumber);

                    if (page.Width <= page.Height)
                        doc.SetPageSize(PageSize.LETTER);
                    else
                        doc.SetPageSize(PageSize.LETTER.Rotate());
                    doc.NewPage();

                    cb.AddTemplate(page,
                        doc.PageSize.Width / reader.GetPageSize(pageNumber).Width,
                        0, 0,
                        doc.PageSize.Height / reader.GetPageSize(pageNumber).Height,
                        0, 0);
                }
                doc.Close();
            }
        }
    }

我还需要限制比例,所以我最终得到了这个:

 public static void ScaleToA4(string inPDF, string outPDF)
    {
        using (var reader        = new PdfReader(new MemoryStream(File.ReadAllBytes(inPDF))))
        using (var document      = new Document(PageSize.A4))
        using (var ms            = new MemoryStream())
        using (var writer        = PdfWriter.GetInstance(document, ms))
        {
            document.Open();
            var cb               = writer.DirectContent;

            for (var pageNumber  = 1; pageNumber <= reader.NumberOfPages; pageNumber++)
            {
                var page         = writer.GetImportedPage(reader, pageNumber);
                document.SetPageSize(page.Width <= page.Height ?
                    PageSize.A4 : PageSize.A4.Rotate());
                document.NewPage();

                var widthFactor  = document.PageSize.Width / page.Width;
                var heightFactor = document.PageSize.Height / page.Height;
                var factor       = Math.Min(widthFactor, heightFactor);

                var offsetX      = (document.PageSize.Width - (page.Width * factor)) / 2;
                var offsetY      = (document.PageSize.Height - (page.Height * factor)) / 2;
                cb.AddTemplate(page, factor, 0, 0, factor, offsetX, offsetY);
            }
            document.Close();
            File.WriteAllBytes(outPDF, ms.GetBuffer());
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 iTextSharp 缩放 PDF 页面,同时保持方向? 的相关文章

随机推荐

  • 在 Java 中,/(即正斜杠)在 $Lambda$15/0x00000008000a9440@32e6e9c3 等对象引用中意味着什么?

    在 JShell 中 如果我这样做 interface Foo String foo Foo gt hi I get created interface Foo 2 gt Lambda 15 0x00000008000a9440 32e6e
  • 如何在 Java 中使用 Blender 模型?

    真的只是一个一般性问题吗 假设我正在制作一款游戏 并在 Blender 中制作了一个角色模型 我将如何在 Java 中使用这个模型 我会以某种方式导入它吗 Thanks 通常 在搅拌机中制作模型时 您可以以某种格式导出模型 以便稍后将其导入
  • Django 重写模型 Clean() 与 Save()

    保存模型时 我需要执行一些操作 尤其是从管理员那里执行 我将几个字段大写并检查以确保其中一个字段或另一个字段已填充 我还创建了场蛞蝓 现在 这些功能被分为覆盖清理和保存功能 它现在可以使用 但我很好奇何时使用它们 我浏览了文档 但找不到具体
  • 如何从 .js 文件中的 jQuery 函数访问 PHP 会话变量?

    如何从 js 文件中的 jQuery 函数访问 PHP 会话变量 在此代码中 我想从会话变量中获取 值 function progressbar progressbar value 37 您可以通过 PHP 生成 javascript 文件
  • 自定义 UITableView 动态单元格高度

    我搜索了无数博客和文章 了解如何确定自定义 UITableViewCell 的动态高度及其详细文本 我真的很难找到任何关于这方面的好的文档 我需要做的是让单元格根据里面的文本生长 但高度永远不要低于 70 我已经在 StackOverflo
  • c++ 传递数组而不是可变长度参数列表

    所以我有一个采用可变长度参数列表的函数 例如 int avg int count stuff 我可以用它来称呼它avg 4 2 3 9 4 而且效果很好 它需要维护这个功能 有没有办法让我也用数组来调用它而不是列出变量 例如 avg 4 m
  • Django 模型中没有此类列错误

    我正在向 Django 模型添加一个新字段 但无论新字段是什么 当我尝试运行 makemigrations 时都会收到 no such column 错误 File Users hugokitano canopy lib python2 7
  • 找到二维直方图的峰值

    我做了一些二维直方图 x y 数据 我得到一张像这样的图像 我想要一种方法来获得 x y 存储最大值的点的坐标H 例如 在上图的情况下 它将是具有近似坐标的两个点 1090 1040 and 1110 1090 这是我的代码 import
  • 剃刀 - 单选按钮的绑定问题

    我正在努力为单选按钮绑定 ans 我正在做一个小项目 我有两个模型问题和答案 我想要实现的目的是提取问题列表并根据设置用户将有多种选择或在文本框中输入答案 使用单选按钮 我似乎无法绑定 ans 它得到一个空对象 有人可以指出我正确的方向吗
  • Azure DevOps 添加自定义选项卡以生成摘要

    我想将自定义选项卡添加到我的构建摘要中 在这些选项卡中我想显示结果PowerShell 测试代码覆盖率任务 结果大约是50 200 htm生成的报告报告生成器 https github com danielpalme ReportGener
  • 在 .NET 中表示不可变列表的最佳方式是什么?

    我最近开始使用 F 进行 实际工作 并重新发现了不可变数据结构的美妙之处 例如 F 中的可区分联合和记录 我还发现它们在 C 中使用起来非常简单 特别是因为它们不需要对 F 运行时有任何直接依赖 然而 当涉及到在这些结构中表示列表时 我还没
  • 正则表达式替换 sublime 中替换中包含部分匹配的值?

    我想出了这个正则表达式来查找所有以 并包含 下划线 w w 我基本上是在寻找变量 比如 var foo etc 如何使用正则表达式组替换内容 例如 如何删除下划线并使下一个字母大写 例如 varFoo 替换表达式为 1 u 2 1 2是捕获
  • 如何使用 Raphael.JS 根据鼠标移动绘制一条线

    我试图随着鼠标在纸上移动画一条线 我只知道如何使用画线path 但想知道是否有人有想法来画一条线mousemove 请帮我解决这个问题 这是使用 raphael 的此类示例的链接 与拉斐尔一起绘画 图片来源 Jonas http irunm
  • 本地域与本地主机的性能

    TCP 连接之间是否存在性能差异 本地主机 127 0 0 1 解析到本地计算机的域 或者更具体地说 后面的连接是通过环回设备还是通过实际网络 我问的原因是我正在考虑更改许多 PHP 应用程序中的数据库设置 以便它们使用完整的域而不是本地主
  • 如何在telnet客户端实现tab补全

    我有一个为 telnet 客户端打开连接的服务器 例如 例如 我运行服务器 server在另一个窗口中 我将 telnet 客户端作为 telnet localhost 9999 运行 当我运行 telnet 客户端时 我将收到新的 CLI
  • 转到 mod 供应商而不更新到最新版本

    我试图弄清楚是否可以在没有 go 工具更新我的 go mod 文件的情况下运行 go modvendor 我特别go get package subpackage commit并提交我的go mod使用正确的版本 然后我跑go mod ve
  • 获取 CLPlacemark 的正确缩放区域

    我在用着MKLocalSearch搜索某些地方 例如城市或城市中的街道 并将其显示在MKMapView 我像这样显示地标 let loc placemark location CLLocation of CLPlacemark var ma
  • 根目录中的新 git 存储库包含子目录中的现有存储库

    我正在开发一个目前不受任何修订控制的大型代码库 是的 确实如此 我一直在一个深层目录中开发一个组件 并创建了一个隐蔽的 git 存储库来跟踪我的更改 我现在想将所有代码添加到源代码管理中 并为整个目录树创建一个存储库 我希望新的外部存储库包
  • 使用 Web Audio Api 播放 Stream 中的点击声音

    我有一个奇怪的问题 我正在使用网络音频播放来自服务器的流 我通过以下方式做到这一点 var d2 new DataView evt data var data new Float32Array d2 byteLength Float32Ar
  • 如何使用 iTextSharp 缩放 PDF 页面,同时保持方向?

    如何在 itextsharp 中保持旋转的同时缩放 pdf 页面 我有以下内容 但我失去了旋转 public static void ScaleToLetter string inPDF string outPDF PdfReader re