当前位置: 首页 > 知识库问答 >
问题:

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

路昆杰
2023-03-14

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

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

考虑到导致问题的文档:我扫描一封信,并将一个PDF文件X发送到我的电子邮件。X只有一个图像层。如果我用iText 7解析X,并从字节数组中创建一个新图像(使用事件类型的EventListenerRender_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;
    }

共有1个答案

沃侯林
2023-03-14

您提取的位图图像与它存储在PDF中的资源完全一样(至少在方向方面)。但是每当绘制位图资源时,它在绘制时受制于当前转换矩阵,并且当前转换可以显著地旋转、倾斜、平移和拉伸位图。

在从ImageRenderInfo renderInfo绘制位图时,可以使用

Matrix ctm = renderInfo.GetImageCtm();

并分析它。此外,您必须考虑页面旋转,您可以从页码中检索

int rotation = pdf.GetPage(page).GetRotation()
 类似资料: