使用 iText 7 (C#) 从 PDF 中提取用于 OCR 的图像时的空白图像

问题描述

当使用 iText7 从多页 PDF 文件提取图像时,输出图像似乎将文本“清理”到完全删除实际文本的程度。除了公司徽标、图片、一些行,有时还有页码之外,图像几乎完全是白色的。大部分文字已全部删除。看起来图像清理已经失控了。起初我认为这是一个许可问题,因为我在没有获得许可的情况下从 NuGet 安装。在我收到试用许可证后,问题仍然存在。我没有看到调整图像清理参数的方法(如果这是问题的话)。以下是我能够从 Internet 上的各种来源拼凑起来的 IEventListener 接口的实现。即使这个问题没有得到任何答案,我希望这门课对寻找如何实现 iText IEventListener 的示例的人有所帮助。

public class RenderListener : IEventListener
{
    private string _outputDir;
    private string _extension;
    private int _pageNum;
    private int _textLength;
    private int _exceptionCount;
    private List<byte[]> _images;
    private List<string> _filenames;
    public bool HasText
    {
        get
        {
            return _textLength > 0;
        }
    }
    public bool HasImages
    {
        get
        {
            return (_images != null) ? _images.Count > 0 : false;
        }
    }

    public int ExceptionCount { get => _exceptionCount; set => _exceptionCount = value; }

    public RenderListener(string outputDir)
    {
        ExceptionCount = 0;
        _textLength = 0;
        _pageNum = 0;
        _images = new List<byte[]>();
        _outputDir = outputDir;
        _filenames = new List<string>();
    }
    public void SaveImages() { [...] }
    public void EventOccurred(IEventData data,EventType type)
    {
        switch (type)
        {
            case EventType.RENDER_TEXT:
                TextRenderInfo textRenderInfo = (TextRenderInfo)data;
                var text = textRenderInfo.GetText();
                if(!String.IsNullOrEmpty(text))
                {
                    _textLength += text.Length;
                }
                break;
            case EventType.RENDER_IMAGE:
                try
                {
                    ImageRenderInfo imageRenderInfo = (ImageRenderInfo)data;
                    
                    
                    PdfImageXObject image = imageRenderInfo.Getimage();
                    if (image == null)
                    {
                        return;
                    }
                    byte[] imageByte = null;
                    string pageNumFormatted = _pageNum.ToString("00000000");
                    try
                    {   
                        imageByte = image.GetimageBytes(true);
                        if (imageByte == null)
                        {
                            return;
                        }
                        switch (ImageDataFactory.Create(imageByte).GetoriginalType())
                        {
                            case ImageType.JPEG:
                                _extension = "jpg";
                                break;
                            case ImageType.PNG:
                                _extension = "png";
                                break;
                            case ImageType.GIF:
                                _extension = "gif";
                                break;
                            case ImageType.BMP:
                                _extension = "bmp";
                                break;
                            case ImageType.TIFF:
                                _extension = "tif";
                                break;
                            case ImageType.WMF:
                                _extension = "wmf";
                                break;
                            case ImageType.jpeg2000:
                                _extension = "jp2";
                                break;
                            case ImageType.jbig2:
                                _extension = "jbig2";
                                break;

                            default:
                                _extension = "jpg";
                                break;
                        }
                        _images.Add(imageByte);
                        _filenames.Add($"{pageNumFormatted}.{_extension}");
                    }
                    catch (Exception ex2)
                    {
                        ExceptionCount++;
                    }
                    _pageNum++;
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                break;

            default:
                break;
        }
    }

    public ICollection<EventType> GetSupportedEvents()
    {
        ICollection<EventType> ret = new List<EventType>();

        ret.Add(EventType.RENDER_IMAGE);
        ret.Add(EventType.RENDER_TEXT);
        return ret;
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)