使用最新版PdfSharp(C#)转换PDF为JPEG时自动旋转问题如何解决
解决PdfSharp转JPEG时竖版页面被自动旋转的问题
我之前在处理PdfSharp转JPEG的时候也踩过这个坑!问题出在PdfSharp默认会根据PDF页面的Rotation属性自动调整输出图像的方向,哪怕你的页面本身是竖版(高度大于宽度),它也可能因为这个逻辑把图像转错。下面给你两种靠谱的解决方案,都是针对最新版PdfSharp(包括PdfSharpCore)的:
方案一:手动抵消页面旋转(精准控制方向)
这个方法的核心是先获取页面的旋转属性,然后在渲染时反向旋转画布,抵消PdfSharp的自动旋转行为,确保输出图像和原始PDF页面方向一致。
using PdfSharp.Drawing; using PdfSharp.Pdf; using PdfSharp.Pdf.IO; // 加载目标PDF文档 var pdfDocument = PdfReader.Open("your-input.pdf", PdfDocumentOpenMode.Import); foreach (var page in pdfDocument.Pages) { // 获取页面的原始旋转角度(0、90、180、270) var pageRotation = page.Rotation; // 根据旋转角度确定最终图像的宽高:旋转90/270度时,宽高需要交换 XSize outputSize = pageRotation is 90 or 270 ? new XSize(page.Height, page.Width) : new XSize(page.Width, page.Height); // 创建指定尺寸的XBitmap(这里设置DPI为300,可根据需求调整) using var outputImage = new XBitmap( (int)(outputSize.Width * 300 / 72), (int)(outputSize.Height * 300 / 72), 300, 300, XImageFormat.Jpeg); using var gfx = XGraphics.FromImage(outputImage); // 先把画布背景设为白色(避免透明背景) gfx.Clear(XColors.White); if (pageRotation != 0) { // 步骤1:将画布原点移到中心 gfx.TranslateTransform(outputSize.Width / 2, outputSize.Height / 2); // 步骤2:反向旋转画布,抵消页面的原始旋转 gfx.RotateTransform(-pageRotation); // 步骤3:将原点移回页面左上角 gfx.TranslateTransform(-page.Width / 2, -page.Height / 2); } // 绘制PDF页面到画布上 gfx.DrawPdfPage(page, new XRect(0, 0, page.Width, page.Height)); // 保存最终的JPEG图像 outputImage.Save($"page_{pdfDocument.Pages.IndexOf(page) + 1}.jpg", XImageFormat.Jpeg); }
代码说明:
- 我们先处理了页面旋转带来的宽高变化,确保输出图像的尺寸符合预期;
- 通过反向旋转画布,彻底禁用了PdfSharp的自动旋转逻辑,完全按照原始页面方向渲染;
- 加入了DPI转换(PDF默认72DPI,转成300DPI更清晰),你可以根据需求调整这个数值。
方案二:直接禁用自动旋转(更简洁)
最新版的PdfSharp提供了XGraphicsPdfPageOptions参数,其中的RotatePage属性默认是true,只要把它设为false,就能直接禁止PdfSharp自动旋转页面。
using PdfSharp.Drawing; using PdfSharp.Pdf; using PdfSharp.Pdf.IO; var pdfDocument = PdfReader.Open("your-input.pdf", PdfDocumentOpenMode.Import); foreach (var page in pdfDocument.Pages) { // 确定图像的实际尺寸:如果页面有旋转,交换宽高 var imageWidth = page.Rotation is 90 or 270 ? page.Height : page.Width; var imageHeight = page.Rotation is 90 or 270 ? page.Width : page.Height; // 创建高DPI的输出图像 using var outputImage = new XBitmap( (int)(imageWidth * 300 / 72), (int)(imageHeight * 300 / 72), 300, 300, XImageFormat.Jpeg); // 关键:创建XGraphics时指定RotatePage=false using var gfx = XGraphics.FromPdfPage( page, new XGraphicsPdfPageOptions { RotatePage = false }); gfx.Clear(XColors.White); // 如果页面本身带有旋转属性,手动调整画布方向 if (page.Rotation != 0) { gfx.TranslateTransform(imageWidth / 2, imageHeight / 2); gfx.RotateTransform(page.Rotation); gfx.TranslateTransform(-page.Width / 2, -page.Height / 2); } gfx.DrawPdfPage(page, new XRect(0, 0, page.Width, page.Height)); outputImage.Save($"page_{pdfDocument.Pages.IndexOf(page) + 1}.jpg", XImageFormat.Jpeg); }
注意事项:
- 有些PDF的竖版显示是通过设置
Rotation=90实现的(原始页面是横版),这种情况你可能需要保留旋转; - 一定要检查页面的
Rotation属性,不要盲目禁用自动旋转,否则反而会导致方向错误。
总结
两种方案的核心都是控制页面旋转的应用逻辑:要么手动抵消旋转,要么直接禁用自动旋转。根据你的PDF文档特性选择合适的方法即可,一般方案二更简洁,方案一更灵活。
内容的提问来源于stack exchange,提问作者Hosein Mansouri
相关产品推荐
相关产品推荐

