You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用最新版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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:57:40