从嵌入字体的 pdf 中提取文本

问题描述 投票:0回答:1

我需要从 pdf 文件中提取文本 - 看起来很简单。 这是我的问题。

当我在 Adobe Acrobat 等 pdfviewer 中打开 pdf 时,我看到的文本是普通文本,我可以阅读它。

当我使用

iText7
来提取文本时,我会得到这样的文本
R!"ina sa$!m!js
虽然应该是
Rēķina saņēmējs

问题是嵌入字体,其中字符

!
是 unicode 字符,但应用该字体时,它会呈现为
ē

任何如何处理这个问题的想法。我尝试像这样从 pdf 中提取字体本身

using System;
using System.IO;
using iText.IO.Source;
using iText.Kernel.Font;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas.Parser;
using iText.Kernel.Pdf.Canvas.Parser.Listener;

class PdfFontExtractor
{
private string pdfPath;
private string outputDir;

public PdfFontExtractor(string pdfPath, string outputDir)
{
    this.pdfPath = pdfPath;
    this.outputDir = outputDir;

    if (!Directory.Exists(outputDir))
    {
        Directory.CreateDirectory(outputDir);
    }
}

public void ExtractFonts()
{
    using (PdfReader reader = new PdfReader(pdfPath))
    {
        using (PdfDocument pdfDoc = new PdfDocument(reader))
        {
            for (int i = 1; i <= pdfDoc.GetNumberOfPages(); i++)
            {
                PdfPage page = pdfDoc.GetPage(i);
                ExtractFontsFromPage(page);
            }
        }
    }
}

private void ExtractFontsFromPage(PdfPage page)
{
    PdfDictionary resources = page.GetResources().GetResource(PdfName.Font);

    foreach (PdfName fontName in resources.KeySet())
    {
        PdfDictionary fontDict = resources.GetAsDictionary(fontName);
        ExtractFont(fontDict);
    }
}

private void ExtractFont(PdfDictionary fontDict)
{
    PdfDictionary fontDescriptor = fontDict.GetAsDictionary(PdfName.FontDescriptor);
    if (fontDescriptor != null)
    {
        PdfStream fontFileStream = null;

        if (fontDescriptor.ContainsKey(PdfName.FontFile))
            fontFileStream = fontDescriptor.GetAsStream(PdfName.FontFile);
        else if (fontDescriptor.ContainsKey(PdfName.FontFile2))
            fontFileStream = fontDescriptor.GetAsStream(PdfName.FontFile2);
        else if (fontDescriptor.ContainsKey(PdfName.FontFile3))
            fontFileStream = fontDescriptor.GetAsStream(PdfName.FontFile3);

        if (fontFileStream != null)
        {
            byte[] fontData = fontFileStream.GetBytes();

            if (fontData.Length > 1000)
            {
                string fontName = fontDict.GetAsName(PdfName.BaseFont).GetValue();
                fontName = fontName + ".ttf";

                string fontPath = Path.Combine(outputDir, fontName);
                File.WriteAllBytes(fontPath, fontData);
                Console.WriteLine($"Extracted font: {fontPath}");
            }
            else
            {
                Console.WriteLine(
                    $"Skipped invalid font: {fontDict.GetAsName(PdfName.BaseFont).GetValue()}"
                );
            }
        }
    }
}

}

它创建了文件,但无法打开它们。 我知道可以使用 i2PDF 等在线工具提取它们 也许我的代码需要一些东西。

我的方法是:

  1. 从pdf中提取字体
  2. 从字体中的字形创建图像
  3. OCR 图像并与字形代表的 unicode 字符进行比较
  4. 根据收集的数据更改返回的 pdf 文本中的文本

这不是一次性的,传入的 pdf 有变化,所以我想自动化这一点,我可以给程序一个 pdf,它可以返回正确的文本。

解决方案在 C# 中不是必需的。 Python 也可以很好。

c# pdf itext itext7
1个回答
-1
投票

有多种方法可以解决这个问题。我认为问题出在您正在使用的库上。我可以给你一些可以帮助你的图书馆。

  1. PyPDF2
import PyPDF2

with open('sample.pdf', 'rb') as file:
    reader = PyPDF2.PdfFileReader(file)
    number_of_pages = reader.numPages
    page = reader.getPage(0)
    text = page.extract_text()
    print(text)
  1. pdf水管工
import pdfplumber

with pdfplumber.open('sample.pdf') as pdf:
    first_page = pdf.pages[0]
    text = first_page.extract_text()
    print(text)
  1. PyMuPDF(菲茨)
import fitz  # PyMuPDF

document = fitz.open('sample.pdf')
page = document.load_page(0)  # Page number starts from 0
text = page.get_text()
print(text)
  1. pdfminer.6
from pdfminer.high_level import extract_text

text = extract_text('sample.pdf')
print(text)
  1. 石板。
import slate

with open('sample.pdf', 'rb') as file:
    document = slate.PDF(file)
    print(document[0])  # First page text
  1. PyPDF4:

导入 PyPDF4

with open('sample.pdf', 'rb') as file:
    reader = PyPDF4.PdfFileReader(file)
    number_of_pages = reader.numPages
    page = reader.getPage(0)
    text = page.extract_text()
    print(text)

希望这个解决方案能够解决您的问题...

© www.soinside.com 2019 - 2024. All rights reserved.