iTextSharp提取PDF指定区域或整页文字,包括文字大小、颜色、字体等

介绍


iTextSharp:是一个从JAVA项目iText衍生的.Net版本的开源项目。iText是一个PDF库,可让您创建,移植,检查和维护可移植文档格式(PDF)的文档,从而使您可以轻松地向软件项目添加PDF功能。我们甚至提供文档来帮助您进行编码。

可以操作PDF的库还有

PDFsharp :PDFsharp是一个开源.NET库,它可以通过任何.NET语言轻松地动态创建和处理PDF文档。相同的绘图例程可用于创建PDF文档,在屏幕上绘图或将输出发送到任何打印机。
https://www.nuget.org/packages/PDFsharp/
Aspose.PDF:用于.NET的Aspose.PDF是PDF文档创建和处理组件,它使您的.NET应用程序无需使用Adobe Acrobat即可读取,编写和处理现有的PDF文档。它还允许您创建表单并管理嵌入PDF文档中的表单字段。
https://www.nuget.org/packages/Aspose.PDF/
Spire.PDF:Spire.PDF for .NET是一个通用的PDF库,使软件开发人员可以在自己的.NET应用程序中生成,编辑,阅读和操作PDF文件。作为独立的PDF组件,Spire.PDF for .NET无需安装Adobe Acrobat,即可为用户提供令人难以置信的丰富功能。
https://www.nuget.org/packages/Spire.PDF/
Rotativa:是一个提供免费API的框架,用于提供在ASP.NET MVC应用程序中打印PDF文档的极其简单的方法。Rotativa基于wkhtmltopdf工具,用于在HTML中创建一个在浏览器中呈现的PDF文档。

安装iTextSharp NuGet包

PM> Install-Package iTextSharp

创建TextInfoModel.cs实体,用来保存PDF文字信息。

    public partial class TextInfoModel
    {
        /// <summary>
        /// 文字
        /// </summary>
        public string Text { get; set; }
        /// <summary>
        /// 字体
        /// </summary>
        public string FontName {  get; set; }
        /// <summary>
        /// 字体大小
        /// </summary>
        public float FontSize {  get; set; }
        /// <summary>
        /// 字体颜色
        /// </summary>
        public BaseColor TextColor { get; set; }

        public TextInfoModel(string text,string fontName,float fontSize,BaseColor textColor)
        {
            Text = text;
            FontName = fontName;
            FontSize = fontSize;
            TextColor = textColor;
        }

    }
}

自定义ITextExtractionStrategy 文本提取策略,创建TextWithStateExtractionStrategy.cs类继承ITextExtractionStrategy 

using iTextSharp.text.pdf.parser;
using iTextSharp.text;
using PDF_dome.Models;
using System.Collections.Generic;
namespace PDF_dome.Common
{
    /// <summary>
    /// 用于提取文本及其状态信息
    /// </summary>
    public class TextWithStateExtractionStrategy : ITextExtractionStrategy
    {
        private List<TextInfoModel> listText = new List<TextInfoModel>();
        public void RenderText(TextRenderInfo renderInfo)
        {
            
            // 获取字体名称
            string fontName = renderInfo.GetFont().PostscriptFontName;

            // 获取字体大小
            float fontSize = renderInfo.GetSingleSpaceWidth() * 1000;

            // 获取文本颜色
            BaseColor fillColor = renderInfo.GetFillColor();

            // 获取文本去掉空格
            string text = renderInfo.GetText().Replace(" ", "").Replace("\n", "").Replace("\r", "");
            //将字符串每一个字符转换成一个字符数组
            char[] texts = text.ToCharArray();
            //如果是多个字符添加多条一样的字体颜色
            foreach (var item in texts)
            {
                TextInfoModel textInfo = new TextInfoModel(item.ToString(), fontName, fontSize, fillColor);
                listText.Add(textInfo);
            }

        }

        public void BeginTextBlock() { }

        public void EndTextBlock() { }

        public void RenderImage(ImageRenderInfo renderInfo) { }
        /// <summary>
        /// 提取文字,每一个文字的字体、字体颜色、字体大小
        /// </summary>
        /// <returns></returns>
        public List<TextInfoModel> GetResultant() => listText;
        public string GetResultantText() => "";
    }
}

创建PDFPageModel.cs实体保存每一页PDF文字

using System.Text;
using iTextSharp.text;
using System.Collections.Generic;
using System.Linq;
namespace PDF_dome.Models
{
    public class PDFPageModel
    {
        /// <summary>
        /// 第几页
        /// </summary>
        public int Index { get; set; }
        /// <summary>
        /// 唯一码是否正确
        /// </summary>
        public bool IsUID { get; set; }=false;
        /// <summary>
        /// 所有文字
        /// </summary>
        public string Texts { get { return GetTexts(); } }
        /// <summary>
        /// 页面文字信息
        /// </summary>
        public List<TextInfoModel> TextInfo { get; set; }
        public PDFPageModel(int index, List<TextInfoModel> textInfo)
        {
            Index = index;
            TextInfo = textInfo;
        }
        /// <summary>
        /// 获取所有文字
        /// </summary>
        /// <returns>字符串</returns>
        public string GetTexts()
        {
            StringBuilder sb = new StringBuilder();
            foreach (var item in this.TextInfo)
            {
                sb.Append(item.Text);
            }
            return sb.ToString();
        }
        /// <summary>
        /// 获取所有文字
        /// </summary>
        /// <returns>数组</returns>
        public List<string> GetTextList()
        {
            return this.TextInfo.Select(x => x.Text).ToList();
        }

        /// <summary>
        /// 获取每一个文字颜色
        /// </summary>
        /// <returns>List</returns>
        public List<BaseColor> GetBaseColorList()
        {
            return TextInfo.Select(x => x.TextColor).ToList();
        }
    }
}

创建PdfTextStateExtraction.cs 获取指定区域或整个页面方法。

using System.Collections.Generic;
using iTextSharp.text.pdf.parser;
using iTextSharp.text.pdf;
using PDF_dome.Models;
using System.util;
using System.IO;
using System;
namespace PDF_dome.Common
{
    public class PdfTextStateExtraction
    {

        /// <summary>
        /// 识别PDF指定区域(矩形)
        /// </summary>
        /// <param name="stream">pdf文件</param>
        /// <param name="rectangleJ">指定区域</param>
        /// <returns></returns>
        public static List<PDFPageModel> ExtractTextWithState(Stream stream, RectangleJ rectangleJ)
        {
            List<PDFPageModel> list = new List<PDFPageModel>();
            using (PdfReader reader = new PdfReader(stream))
            {
                for (int page = 1; page <= reader.NumberOfPages; page++)
                {
                    // 创建矩形区域
                    var rect = new iTextSharp.text.Rectangle(rectangleJ);
                    //var rect = new iTextSharp.text.Rectangle(llx, lly, urx, ury);

                    //位于指定矩形区域内的文本
                    RenderFilter[] filter = { new RegionTextRenderFilter(rect) };
                    //创建extWithStateExtractionStrategy对象,收集文本及其状态(如字体、大小、颜色等)
                    TextWithStateExtractionStrategy textWithState = new TextWithStateExtractionStrategy();

                    //应用 RenderFilter,并将结果传递给TextWithStateExtractionStrategy
                    ITextExtractionStrategy strategy = new FilteredTextRenderListener(textWithState, filter);

                    PdfTextExtractor.GetTextFromPage(reader, page, strategy);
                    List<TextInfoModel> listText = textWithState.GetResultant();
                    PDFPageModel pDFPageModel = new PDFPageModel(page, listText);
                    list.Add(pDFPageModel);
                }
            }
            return list;
        }

        /// <summary>
        /// 识别整页内容
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        public static List<PDFPageModel> ExtractTextWithState(Stream stream)
        {
            List<PDFPageModel> list = new List<PDFPageModel>();
            using (PdfReader reader = new PdfReader(stream))
            {
                for (int page = 1; page <= reader.NumberOfPages; page++)
                {
                    TextWithStateExtractionStrategy textWithState = new TextWithStateExtractionStrategy();
                    PdfTextExtractor.GetTextFromPage(reader, page, textWithState);
                    list.Add(new PDFPageModel(page, textWithState.GetResultant()));
                }
            }
            return list;
        }
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值