当前位置: 首页 > 知识库问答 >
问题:

问题:使用iText7缩放PDF的第一页。网

邵胜涝
2023-03-14

我正在尝试使用iText7扩展PDF的第一页。网其余的页面应该保持不变。

如果PDF包含一个页面,下面的方法是有效的,但是如果有多个页面,第一个页面(应该缩放)是空白的,而剩余的页面被正确添加。

我错过了什么?

public byte[] ScaleFirstPagePdf(byte[] pdf)
{
    using (var inputStream = new MemoryStream(pdf))
    using (var outputStream = new MemoryStream(pdf))
    using (var srcPdf = new PdfDocument(new PdfReader(inputStream)))
    using (var destPdf = new PdfDocument(new PdfWriter(outputStream)))
    {
        for (int pageNum = 1; pageNum <= srcPdf.GetNumberOfPages(); pageNum++)
        {
            var srcPage = srcPdf.GetPage(pageNum);
            var srcPageSize = srcPage.GetPageSizeWithRotation();

            if (pageNum == 1)
            {
                var destPage = destPdf.AddNewPage(new PageSize(srcPageSize));
                var canvas = new PdfCanvas(destPage);

                var transformMatrix = AffineTransform.GetScaleInstance(0.5f, 0.5f);
                canvas.ConcatMatrix(transformMatrix);

                var pageCopy = srcPage.CopyAsFormXObject(destPdf);
                canvas.AddXObject(pageCopy, 0, 0);
            }
            else
            {
                destPdf.AddPage(srcPage.CopyTo(destPdf));
            }
        }

        destPdf.Close();
        srcPdf.Close();

        return outputStream.ToArray();
    }
}

共有1个答案

司徒志
2023-03-14

我不能用这个代码复制空白页问题,但是肯定以这种方式生成的文件会有问题。

问题在于,您在两个内存流之间共享一个字节缓冲区——一个用于读取,另一个用于同时写入。

简单地使用另一个缓冲区或依赖默认的MemoryStream实现为我解决了这个问题,也应该为您解决这个问题,因为除了我提到的问题之外,您的代码似乎没有任何可疑之处。

以下是您应该如何创建输出流:

using (var inputStream = new MemoryStream(pdf))
using (var outputStream = new MemoryStream())

如果您仍然遇到问题,即使在这个调整之后,那么问题肯定是特定于文件的,我怀疑您可以在不共享文件的情况下获得任何帮助。

 类似资料:
  • 我试图创建一个带有页眉和页脚的PDF。页眉和页脚都是图像。由于我的pdf创建了随机数量的页面,我需要自动将其添加到每一页。我知道我需要使用某种eventhandler。不幸的是,我找不到vb.net语言中的任何示例,我只能找到java/C#示例,我真的不擅长阅读/转换这些语言vb.net.我还不是编程专家。 谁能给我指一下正确的方向吗。 Edit4:删除的随机内容不再需要回答我的问题。 下面这段代

  • 我正在将一些PDF编辑工具从iTextSharp更新到iText7。 在iTextSharp中,pdfStamper类中有一个方法:pdfStamper。ReplacePage()。然而,iText7中的pdfStamper类已被删除,我在复制相同的功能时遇到困难。 假设我有文档X,需要用文档Y的第1页替换第4页,但我希望结果保存到一个新的文档Z。 到目前为止,我有3行使用CopyPageTo方法

  • 我需要添加一个HTML块作为使用iText7的所有页面的标题。标题包含一个图像徽标和一些文本。 在关闭文档对象之前,我现在有这样一个问题: 页脚工作正常,但页眉工作正常。 标题是这样加载的: 其中,的定义如下: 当我使用方法,效果很好,但只适用于第一页。所有其他内容都遵循它。 当我尝试使用方法添加它时,所有页面中只呈现图像。 顺便问一下,有没有办法得到标题段落的实际高度?我想,一旦解决了标题定位,

  • 我正在尝试缩放pdf文件,就像复印机中的缩放功能一样,它可以按百分比缩放文档(如下所示:https://inspectapedia.com/graphics/Safari_Page_Setup.jpg),我正在使用pdfbox管理我的pdf文件。我尝试过这个代码,但为什么它不起作用?代码中没有错误。 有人知道为什么该代码不起作用吗? 编辑 我需要它在API 16上工作

  • 我有一个私人钥匙在档案里。“privatekey.pem”并且不知道如何创建谁能帮助我吗?我正在尝试使用IText7签名pdf。

  • 我有一个场景,我需要用iText7库从pdf中获取签名信息。签名可能存在,也可能不存在。当我为没有任何数字签名的PDF实例化一个新的对象时,会出现异常 “没有相关的PdfWriter用于进行间接操作。” .如果有签名,就很好用。我不确定如何纠正这个异常。 更新为包含代码示例