C# 为什么扫描的pfd页面在提取为图像时以顺时针旋转90度返回?

C# 为什么扫描的pfd页面在提取为图像时以顺时针旋转90度返回?,c#,itext7,C#,Itext7,我使用iText 7转换pdf页面,即从扫描文档到图像的图像,这样我就可以用ocr处理它。对于某些pdf文件,这工作得非常好,但对于其他文件,从中提取的图像返回90度旋转 考虑到工作正常的文件: 我打开word,输入一些文本和图片,然后将文件转换为pdf。当使用iText 7处理此类文件时,我可以毫无问题地输出文本和图像 考虑到引起问题的文档: 我浏览了一封信,在我的电子邮件中得到了一个pdf文件X。X只有一个图像层。如果我用iText 7解析X,并使用EventListener for Eve

我使用iText 7转换pdf页面,即从扫描文档到图像的图像,这样我就可以用ocr处理它。对于某些pdf文件,这工作得非常好,但对于其他文件,从中提取的图像返回90度旋转

考虑到工作正常的文件: 我打开word,输入一些文本和图片,然后将文件转换为pdf。当使用iText 7处理此类文件时,我可以毫无问题地输出文本和图像

考虑到引起问题的文档: 我浏览了一封信,在我的电子邮件中得到了一个pdf文件X。X只有一个图像层。如果我用iText 7解析X,并使用EventListener for Event type Render_image从字节数组中创建一个新图像,该图像将以90度旋转创建

因此,对于这两个文档,我使用相同的c代码,但输出不同

我使用了X的输出图像和旋转图像,并将其转换为pdf文件。让我们称之为Y。因此,当我再次从Y创建图像时,新图像与Y相比不会旋转我只是做了个测试,看看图像是否会一直旋转

//IEventListener的实现:

 public void EventOccurred(IEventData data, EventType type)
    {
        switch (type)
        {
            case EventType.RENDER_IMAGE:
                String filename;
                ImageRenderInfo renderInfo = (ImageRenderInfo)data;
                PdfImageXObject image = renderInfo.GetImage();
                if (image == null)
                {
                    return;
                }
                byte[] imageBytes = image.GetImageBytes(true);
                extension = image.IdentifyImageFileExtension();
                filename = String.Format(@"{0}\{1}.{2}", path, Guid.NewGuid().ToString(), extension);
                images.Add(new ImageStreamObject(imageBytes, filename));
                break;
        }
    }
//类ImageStreamObject

public class ImageStreamObject
{
    byte[] image;
    string path;

    /// <summary>
    /// Creates a data object for storing an image as a byte array and its filepath.
    /// </summary>
    /// <param name="byteArray"></param>
    /// <param name="filePath"></param>
    public ImageStreamObject(byte[] byteArray, string filePath)
    {
        image = byteArray;
        path = filePath;
    }

    public String GetImagePath()
    {
        return path;
    }
//执行图像提取的对象的构造函数:

    public PdfImageExtractor(string filePath, string imageOutputPath)
    {
        pdf = new PdfDocument(new PdfReader(filePath));
        listener = new ImageRenderListener(imageOutputPath);
        parser = new PdfCanvasProcessor(listener);
        imageBuffer = new List<string>();
    }
//从PdfImageExtractor创建图像文件的方法:

    public List<string> CreateImagesFromPdfPage(int page)
    {
        FileStream fs;
        byte[] tempImage;
        string tempPath;
        listener.GetImageStreamObjects().Clear();
        parser.ProcessPageContent(pdf.GetPage(page));
        imageStreamObjects = listener.GetImageStreamObjects();
        List<string> pathes = GetImagePathes();
        imageStreamObjects.ForEach(delegate (ImageStreamObject imageStreamObject)
        {
            tempPath = imageStreamObject.GetImagePath();
            tempImage = imageStreamObject.GetImageAsByteArray();
            fs = new FileStream(tempPath, FileMode.Create);
            fs.Write(tempImage, 0, tempImage.Length);
            fs.Flush();
            fs.Close();
        });
        return pathes;
    }

您提取的位图图像与作为资源存储在PDF中的位图图像完全相同,至少在方向方面是如此。但是,每当绘制位图资源时,它都会在绘制时受当前变换矩阵的约束,并且当前变换可以对位图进行旋转、倾斜、平移和拉伸

使用从ImageRenderInfo renderInfo绘制位图时,可以检索当前变换矩阵的值

并对其进行分析。此外,您还必须考虑页面旋转,您可以从页码页面中检索该页面


谢谢你的快速回答!对不起,我只是现在回复的很别扭。
Matrix ctm = renderInfo.GetImageCtm();
int rotation = pdf.GetPage(page).GetRotation()