C# 为什么扫描的pfd页面在提取为图像时以顺时针旋转90度返回?
我使用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的实现: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
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()