使用 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())
如果您在进行此调整后仍然遇到问题,那么问题肯定是特定于文件的,我怀疑您在不共享文件的情况下能否获得任何帮助。
我正在尝试使用 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())
如果您在进行此调整后仍然遇到问题,那么问题肯定是特定于文件的,我怀疑您在不共享文件的情况下能否获得任何帮助。