使用 iText7 for .NET 缩放 PDF 第一页的问题

Issue scaling the first page of a PDF using iText7 for .NET

我正在尝试使用 iText7 for .NET 缩放 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();
    }
}

我无法用这段代码重现空白页问题,但以这种方式生成的文件肯定有问题。

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

简单地使用另一个缓冲区或依赖默认的 MemoryStream 实现为我解决了这个问题,你也应该这样做,因为除了我提到的问题。

创建输出流的方法如下:

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

如果您在进行此调整后仍然遇到问题,那么问题肯定是特定于文件的,我怀疑您在不共享文件的情况下能否获得任何帮助。