如何在.NET6 Web Api中使用PDFiumSharpV2放大PDF后转PNG?
问题
在.NET6 Web Api项目中使用PDFiumSharpV2将多页PDF的第一页转换为PNG,转换功能正常,但生成的PNG文本过小,像是PDF被缩小了。希望在转换为图片前将PDF放大20%,但找不到正确方法。
当前采用PDF转Bitmap再转PNG的流程,代码如下:
// PDF to image using (var doc = new PdfDocument(docObj.PdfBytes)) { var page1 = doc.Pages[0]; using (var bitmap = new PDFiumBitmap((int)page1.Width, (int)page1.Height, true)) { page1.Render(bitmap); using (var memoryStreamBmp = new MemoryStream()) { bitmap.Save(memoryStreamBmp); using (var imageBmp = System.Drawing.Image.FromStream(memoryStreamBmp)) { using (var memoryStreamPng = new MemoryStream()) { imageBmp.Save(memoryStreamPng, System.Drawing.Imaging.ImageFormat.Png); System.Drawing.Image pngImage = System.Drawing.Image.FromStream(memoryStreamPng); var pngBytes = memoryStreamPng.ToArray(); docObj.ImageBase64 = Convert.ToBase64String(pngBytes); pngImage.Save("download_test_image.png"); }; } } } }
尝试过手动增大PDFiumBitmap的宽高参数,但仅添加了空白边框,页面内容并未放大。请问如何在转换为位图前放大PDF?
解决方案
问题出在你只修改了Bitmap的尺寸,但没有在渲染PDF页面时应用缩放逻辑。PDFium的Page.Render方法默认是1:1渲染,所以单纯放大Bitmap只会留白,内容不会缩放。要实现20%的放大,需要在渲染时指定缩放比例,具体有两种方式:
方式一:使用RenderSettings设置缩放比例
通过RenderSettings的ScaleX和ScaleY参数直接指定缩放倍数(1.2即放大20%),同时创建对应缩放尺寸的Bitmap:
// PDF to image with 20% zoom using (var doc = new PdfDocument(docObj.PdfBytes)) { var page1 = doc.Pages[0]; // 放大20%,缩放比例设为1.2 var scale = 1.2f; // 计算缩放后的Bitmap尺寸 var bitmapWidth = (int)(page1.Width * scale); var bitmapHeight = (int)(page1.Height * scale); using (var bitmap = new PDFiumBitmap(bitmapWidth, bitmapHeight, true)) { // 创建渲染设置并指定缩放比例 var renderSettings = new RenderSettings { ScaleX = scale, ScaleY = scale }; // 应用缩放设置渲染页面 page1.Render(bitmap, renderSettings); using (var memoryStreamPng = new MemoryStream()) { // PDFiumBitmap直接保存为PNG,无需中间转换System.Drawing.Image bitmap.Save(memoryStreamPng, ImageFormat.Png); docObj.ImageBase64 = Convert.ToBase64String(memoryStreamPng.ToArray()); // 保存到本地文件 using (var fileStream = new FileStream("download_test_image.png", FileMode.Create)) { memoryStreamPng.Seek(0, SeekOrigin.Begin); memoryStreamPng.CopyTo(fileStream); } } } }
方式二:通过DPI调整实现缩放
PDF的页面尺寸单位是点(1点=1/72英寸),默认渲染DPI为96。如果要放大20%,可以将DPI设置为96 * 1.2 = 115.2,再计算对应Bitmap尺寸:
using (var doc = new PdfDocument(docObj.PdfBytes)) { var page1 = doc.Pages[0]; // 目标DPI,放大20% var targetDpi = 96 * 1.2f; // 计算Bitmap尺寸:(页面宽度 / 72) * DPI var bitmapWidth = (int)(page1.Width * targetDpi / 72); var bitmapHeight = (int)(page1.Height * targetDpi / 72); using (var bitmap = new PDFiumBitmap(bitmapWidth, bitmapHeight, true)) { // 按目标DPI渲染页面 page1.Render(bitmap, dpiX: targetDpi, dpiY: targetDpi); using (var memoryStreamPng = new MemoryStream()) { bitmap.Save(memoryStreamPng, ImageFormat.Png); docObj.ImageBase64 = Convert.ToBase64String(memoryStreamPng.ToArray()); using (var fileStream = new FileStream("download_test_image.png", FileMode.Create)) { memoryStreamPng.Seek(0, SeekOrigin.Begin); memoryStreamPng.CopyTo(fileStream); } } } }
额外优化
你的原代码中多次转换MemoryStream和System.Drawing.Image是多余的,PDFiumBitmap可以直接保存为PNG格式,无需中间转换,这样能提升性能并避免潜在的图像质量损失。
内容的提问来源于stack exchange,提问作者LNX
相关产品推荐
相关产品推荐

