介绍
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