首页 > 其他分享 >iTextSharp提取PDF指定区域或整页文字,包括文字大小、颜色、字体等

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

时间:2024-08-28 14:27:06浏览次数:11  
标签:文字大小 text 整页 List iTextSharp using PDF public

介绍


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;
        }
    }


}

标签:文字大小,text,整页,List,iTextSharp,using,PDF,public
From: https://blog.csdn.net/2301_77113835/article/details/141605069

相关文章

  • 【MathType】彻底解决公式大小与文章文字大小不统一(含字体的字号与磅(pt)和像素(px)之间
    在使用Mathtype的时候,有时候会出现公式大小不统一的情况,这时候手动去拖动大小的话非常不理想,并且使用格式化公式也没有效果。下面来具体分析一下导致的原因、字体的字号与磅(pt)和像素(px)之间的关系、彻底解决方法。下面图片是一个小示例(请忽略具体内容)1.大小不一致原因查看Mat......
  • Android中自定义Toast文字大小
    在Android开发中,Toast是一种轻量级的提示框,用于在屏幕上显示临时消息。一般情况下,Toast显示的文字大小是固定的,无法直接改变。但是,我们可以通过一些方法来实现在Toast中显示不同大小的文字。方法一:使用自定义布局创建custom_toast.xml布局文件,如:<?xmlversion="1.0"encoding......
  • 使用 iTextSharp 在 .NET Core 中进行 PDF 管理之合并 PDF
    介绍在当今的数字时代,以编程方式管理PDF文档是许多应用程序的常见要求。无论是生成报告和发票还是合并多个PDF文件,拥有合适的工具都可以显著简化开发流程。在本文中,我们将探讨如何利用iTextSharp(一种用于处理C#中PDF的流行库)在.NETCore应用程序中无缝合并PDF......
  • Itextsharp_v416-非商用项目中的PDF生成方案
        项目演示地址:https://gitee.com/qq28069933146_admin/itextsharp_v416_qrcoder_simple(因为itextsharp_v416涉及敏感开源协议的原因项目已删除;虽然只是LGPL协议)1、主要可参考代码如下:///<summary>///生成PDF按钮-带二维码///</summar......
  • MAUI IOS如何弹起键盘时调整页面大小
    #ifIOSusingCoreGraphics;usingFoundation;usingMicrosoft.Maui.Platform;usingUIKit;#endifnamespaceYourProject{#nullabledisablepublicclassMainPage{ publicMainPage(){InitializeComponent();#ifIOS......
  • Vue3 - Element Plus 下拉选择器 el-select 覆盖修改 placeholder样式,解决覆盖不生效
    前言如果需要Vue2版本,请访问这篇文章。本文实现了在vue3+element-plus网站开发中,完美覆盖el-select选择器样式,强力修改select下拉选择框placeholder样式,同时也支持修改文字、大小、边框、等,支持任意样式的覆盖修改!网上的教程几乎都不生效,使用本教程的方法......
  • 在Python中,你可以使用以下代码来更改ttk.Combobox下拉框选项的文字大小¹: ```python
    在Python中,你可以使用以下代码来更改ttk.Combobox下拉框选项的文字大小¹:```pythonimporttkinterastkfromtkinterimportttkroot=tk.Tk()root.geometry('500x500')#设置所有Combobox的下拉框文字大小root.option_add("*TCombobox*Listbox.font","Arial20")combob......
  • asp使用ItextSharp生成Pdf
    1.使用ItextSharp生成Pdf应用场景:将用户所填写的数据根据业务场景填入到pdf模板中并生成新的pdf。操作步骤如下:1.1.使用word制作模板制作word模板然后转成pdf,使用福昕或者其他pdf编辑器在需要填充数据的地方添加文本域(我这里使用的是破解版的福昕)。1.2.设置变量将需要填......
  • itextsharp upgrade to itext7
    WhyamIgettingduplicatepagesextractedfromiText7C#?Actuallyitisnotthesametextbeingreturnedfromsequentialpages.Insteadyougetthetextfrompage1whenyouextractpage1;thetextfrompages1and2whenyouextractpage2;thetext......
  • C# RichTextBox的上标及文字大小
    C#RichTextBox进行上下标的处理,单纯的文本控件TextBox满足不了这个功能,必须使用RichTextBox富文本控件来实现,具体效果如下:未设置上标字体大小前:设置上标的字体大小后: 具体的代码如下:this.richTextBox1.SelectedText="mm";this.richTextBox1.......