创建可搜索的 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 上创建可拖动元素

如何从扫描页面的 PDF 中制作可搜索的 PDF? [关闭]

将图像转换为可搜索的 pdf [关闭]

如何制作3层的PDF电子书