如何基于PDF文件获取TextFragmentCollection?Aspose替代方案问询
可搜索PDF转数字文本PDF的文本片段获取方案
你要把可搜索PDF转成带数字文本的PDF,但Aspose.Pdf的Page类没有GetTextFragments()方法,以下是两种可行的替代思路:
一、Aspose.Pdf 官方替代方案:使用TextAbsorber类
Aspose.Pdf提供了TextAbsorber类,专门用于提取PDF中的文本及相关位置信息,完全可以替代你想调用的GetTextFragments()方法。修改后的代码如下:
using System; using Aspose.Pdf; using Aspose.Pdf.Text; public static void PDFSearchableToPDFNormal(String filename, String des_filename) { Document pdfDocument = new Document(filename); Document newDocument = new Document(); foreach (Page pdfPage in pdfDocument.Pages) { Page newPage = newDocument.Pages.Add(); // 创建TextAbsorber提取页面文本片段 TextAbsorber textAbsorber = new TextAbsorber(); pdfPage.Accept(textAbsorber); // 获取提取到的文本片段集合 TextFragmentCollection textFragments = textAbsorber.TextFragments; foreach (TextFragment textFragment in textFragments) { TextFragment newTextFragment = new TextFragment(textFragment.Text); newTextFragment.Position = textFragment.Position; // 保留原文本的字体、字号等样式,避免丢失格式 newTextFragment.TextState.Font = textFragment.TextState.Font; newTextFragment.TextState.FontSize = textFragment.TextState.FontSize; newTextFragment.TextState.ForegroundColor = textFragment.TextState.ForegroundColor; newPage.Paragraphs.Add(newTextFragment); } } newDocument.Save(des_filename); }
二、iText7 实现类似功能的方案
如果想用iText7,可以通过PdfTextExtractor结合LocationTextExtractionStrategy来获取带位置的文本信息,再模拟生成类似TextFragment的对象:
using System; using iText.Kernel.Pdf; using iText.Kernel.Pdf.Canvas.Parser; using iText.Kernel.Pdf.Canvas.Parser.Data; using iText.Kernel.Pdf.Canvas.Parser.Listener; using System.Collections.Generic; // 自定义类存储文本及位置信息,模拟TextFragment public class TextInfo { public string Text { get; set; } public float X { get; set; } public float Y { get; set; } public float FontSize { get; set; } } public static void PDFSearchableToPDFNormal_Itext7(String filename, String des_filename) { using (PdfReader reader = new PdfReader(filename)) using (PdfWriter writer = new PdfWriter(des_filename)) using (PdfDocument pdfDocument = new PdfDocument(reader, writer)) { PdfDocument newDocument = new PdfDocument(new PdfWriter(des_filename)); for (int pageNum = 1; pageNum <= pdfDocument.GetNumberOfPages(); pageNum++) { PdfPage page = pdfDocument.GetPage(pageNum); PdfPage newPage = newDocument.AddNewPage(page.GetPageSize()); PdfCanvas canvas = new PdfCanvas(newPage); // 使用LocationTextExtractionStrategy提取带位置的文本 LocationTextExtractionStrategy strategy = new LocationTextExtractionStrategy(); PdfTextExtractor.GetTextFromPage(page, strategy); // 提取文本片段及位置 IList<TextChunk> textChunks = strategy.GetResultantTextChunks(); foreach (TextChunk chunk in textChunks) { // 获取文本位置和样式 string text = chunk.GetText(); float x = chunk.GetStartLocation().GetX(); float y = chunk.GetStartLocation().GetY(); float fontSize = chunk.GetFontSize(); // 在新页面绘制文本 canvas.BeginText() .SetFontAndSize(PdfFontFactory.CreateFont(), fontSize) .MoveText(x, y) .ShowText(text) .EndText(); } } newDocument.Close(); } }
内容的提问来源于stack exchange,提问作者Aideed Gaming
相关产品推荐
相关产品推荐

