Исправление текста Itextsharp
Я использую itextsharp на vb.net, чтобы получить текстовое содержимое из файла pdf. Решение работает отлично для некоторых файлов, но не для других даже довольно простых. Проблема заключается в том, что значение токена string равно null (набор пустых квадратов)
token = New iTextSharp.text.pdf.PRTokeniser(pageBytes)
While token.NextToken()
tknType = token.TokenType()
tknValue = token.StringValue
Я могу измерить длину содержимого, но я не могу получить фактическое содержимое строки.
Я понял, что это происходит в зависимости от шрифта pdf. Если я создаю pdf файл, используя Acrobat или PdfCreator с Courier (который, кстати, является шрифтом по умолчанию в редакторе visual studio), я могу получить весь текстовый контент. Если один и тот же pdf построен с использованием другого шрифта, я получил пустые квадратные поля.
Теперь возникает вопрос: как я могу извлечь текст независимо от настройки шрифта?
Спасибо
Ответы
Ответ 1
дополняющий ответ Mark, который мне очень помогает. Имена пространств и классов реализации iTextSharp немного отличаются от java-версии
public static string GetTextFromAllPages(String pdfPath)
{
PdfReader reader = new PdfReader(pdfPath);
StringWriter output = new StringWriter();
for (int i = 1; i <= reader.NumberOfPages; i++)
output.WriteLine(PdfTextExtractor.GetTextFromPage(reader, i, new SimpleTextExtractionStrategy()));
return output.ToString();
}
Ответ 2
Отъезд PdfTextExtractor.
String pageText =
PdfTextExtractor.getTextFromPage(myReader, pageNum);
или
String pageText =
PdfTextExtractor.getTextFromPage(myReader, pageNum, new LocationTextExtractionStrategy());
Оба требуют довольно свежих версий iText [Sharp]. Фактически синтаксический анализ потока контента сам по себе - это просто изобретать колесо в этот момент. Поставьте себе немного боли, и пусть iText сделает это за вас.
PdfTextExtractor будет обрабатывать все различные проблемы с шрифтом/кодировкой для вас... все те, которые могут быть обработаны в любом случае. Если вы не можете скопировать/вставить из Reader точно, тогда в PDF не будет достаточной информации для получения символьной информации из потока контента.
Ответ 3
Вот вариант с iTextSharp.text.pdf.PdfName.ANNOTS и iTextSharp.text.pdf.PdfName.CONTENT, если кому-то это нужно.
string strFile = @"C:\my\path\tothefile.pdf";
iTextSharp.text.pdf.PdfReader pdfRida = new iTextSharp.text.pdf.PdfReader(strFile);
iTextSharp.text.pdf.PRTokeniser prtTokeneiser;
int pageFrom = 1;
int pageTo = pdfRida.NumberOfPages;
iTextSharp.text.pdf.PRTokeniser.TokType tkntype ;
string tknValue;
for (int i = pageFrom; i <= pageTo; i++)
{
iTextSharp.text.pdf.PdfDictionary cpage = pdfRida.GetPageN(i);
iTextSharp.text.pdf.PdfArray cannots = cpage.GetAsArray(iTextSharp.text.pdf.PdfName.ANNOTS);
if(cannots!=null)
foreach (iTextSharp.text.pdf.PdfObject oAnnot in cannots.ArrayList)
{
iTextSharp.text.pdf.PdfDictionary cAnnotationDictironary = (iTextSharp.text.pdf.PdfDictionary)pdfRida.GetPdfObject(((iTextSharp.text.pdf.PRIndirectReference)oAnnot).Number);
iTextSharp.text.pdf.PdfObject moreshit = cAnnotationDictironary.Get(iTextSharp.text.pdf.PdfName.CONTENTS);
if (moreshit != null && moreshit.GetType() == typeof(iTextSharp.text.pdf.PdfString))
{
string cStringVal = ((iTextSharp.text.pdf.PdfString)moreshit).ToString();
if (cStringVal.ToUpper().Contains("LOS 8"))
{ // DO SOMETHING FUN
}
}
}
}
pdfRida.Close();