我需要从 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 等在线工具提取它们 也许我的代码需要一些东西。
我的方法是:
这不是一次性的,传入的 pdf 有变化,所以我想自动化这一点,我可以给程序一个 pdf,它可以返回正确的文本。
解决方案在 C# 中不是必需的。 Python 也可以很好。
有多种方法可以解决这个问题。我认为问题出在您正在使用的库上。我可以给你一些可以帮助你的图书馆。
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)
import pdfplumber
with pdfplumber.open('sample.pdf') as pdf:
first_page = pdf.pages[0]
text = first_page.extract_text()
print(text)
import fitz # PyMuPDF
document = fitz.open('sample.pdf')
page = document.load_page(0) # Page number starts from 0
text = page.get_text()
print(text)
from pdfminer.high_level import extract_text
text = extract_text('sample.pdf')
print(text)
import slate
with open('sample.pdf', 'rb') as file:
document = slate.PDF(file)
print(document[0]) # First page text
导入 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)
希望这个解决方案能够解决您的问题...