创建可搜索的 PDF 时如何在 PDF 中保留图像和样式?
Posted
技术标签:
【中文标题】创建可搜索的 PDF 时如何在 PDF 中保留图像和样式?【英文标题】:How to preserve images and styling in PDF when creating a searchable PDF? 【发布时间】:2021-05-07 19:08:36 【问题描述】:我有一个网站,我的客户可以在其中上传他们的文件(主要是 PDF)。我希望能够使 PDF 可搜索,但我不希望更改 PDF 的外观。我已经尝试创建一个 .NET 端点来实现这一点,我可以发布到。
我已经尝试将 iTextSharp 与 Tesseract 结合使用,但它们都没有给我我想要的东西。这是我尝试过的代码:
使用tesseract从pdf中获取文本:
using (var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default))
using (var img = Pix.LoadFromFile(testImagePath))
using (var page = engine.Process(img))
var text = page.GetText();
然后使用 iTextSharp 从旧版本生成 PDF:
// open the reader
PdfReader reader = new PdfReader(oldFile);
Rectangle size = reader.GetPageSizeWithRotation(1);
Document document = new Document(size);
// open the writer
FileStream fs = new FileStream(newFile, FileMode.Create, FileAccess.Write);
PdfWriter writer = PdfWriter.GetInstance(document, fs);
document.Open();
// the pdf content
PdfContentByte cb = writer.DirectContent;
// select the font properties
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252,BaseFont.NOT_EMBEDDED);
cb.SetColorFill(BaseColor.DARK_GRAY);
cb.SetFontAndSize(bf, 8);
// write the text in the pdf content
cb.BeginText();
string text = "Some random blablablabla...";
// put the alignment and coordinates here
cb.ShowTextAligned(1, text, 520, 640, 0);
cb.EndText();
cb.BeginText();
text = "Other random blabla...";
// put the alignment and coordinates here
cb.ShowTextAligned(2, text, 100, 200, 0);
cb.EndText();
// create the new page and add it to the pdf
PdfImportedPage page = writer.GetImportedPage(reader, 1);
cb.AddTemplate(page, 0, 0);
// close the streams and voilá the file should be changed :)
document.Close();
fs.Close();
writer.Close();
reader.Close();
但是,我在生成所需的输出时遇到了问题。有没有更简单的方法来实现我正在寻找的东西?这是我试图使其可搜索的 PDF 示例。我不想丢失 PDF 的图像或字体/样式。我只是想让它变得可搜索:
https://www.fujitsu.com/global/Images/sv600_c_normal.pdf
【问题讨论】:
我在您的问题中添加了itext
标签。正如我在您的其他问题下评论的那样,iText Software 可能会为您提供帮助。但是,这超出了 Stack Overflow 上可以做的事情,所以我建议你直接联系公司。
哦,您还可以获得 iText 7 + pdfOCR 的 30 天免费试用。更多itextpdf.com/en/products/itext-7/pdf-ocr-text-recognition
【参考方案1】:
如果您有兴趣为此利用商业产品,LEADTOOLS SDK 有一个带有image-over-text functionality 的 OCR 工具包。此功能将原始文件的图像设置为输出 PDF 中的叠加层,使文本可搜索并保持原始输入文件的外观。
我能够使用此代码将您的文档转换为仍代表原始文档的可搜索版本:
string folderPath = "filepath";
string inputFilename = Path.Combine(folderPath, "sv600_c_normal.pdf");
string outputFilename = Path.Combine(folderPath, "sv600_c_normal-output.pdf");
IOcrEngine engine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD);
engine.Startup(null, null, null, null);
PdfDocumentOptions pdfOptions = engine.DocumentWriterInstance.GetOptions(DocumentFormat.Pdf) as PdfDocumentOptions;
pdfOptions.ImageOverText = true;
engine.DocumentWriterInstance.SetOptions(DocumentFormat.Pdf, pdfOptions);
engine.AutoRecognizeManager.Run(inputFilename, outputFilename, DocumentFormat.Pdf, null, null);
这是示例文件的output。它是可搜索的并且与原版相似。
免责声明:我在这家公司工作
【讨论】:
谢谢,这正是我想要的!这是作为 Nuget 包提供的吗?这是免费使用还是商业图书馆? 此功能包含在Leadtools.Ocr NuGet 包中。请注意,虽然这是一个商业图书馆,但它可以免费进行 60 天的评估。超出评估期的使用需要购买。以上是关于创建可搜索的 PDF 时如何在 PDF 中保留图像和样式?的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 11 PDF 图像资产“保留矢量数据”在 SwiftUI 中不起作用?
如何使用ABBYY FineReader PDF 15来制作双层PDF
如何使用 PDF.js 和 jQuery 在 PDF 上创建可拖动元素