Извлечь PDF текст по координатам - PullRequest
4 голосов
/ 13 сентября 2011

Я хотел бы знать, есть ли какая-нибудь библиотека PDF в Microsoft .NET, способная извлекать текст, задавая координаты.

Например ( в псевдокоде ):

PdfReader reader = new PdfReader();
reader.Load("file.pdf");

// Top, bottom, left, right in pixels or any other unit
string wholeText = reader.GetText(100, 150, 20, 50);

Я пытался сделать это с помощью PDFBox для .NET (который работает поверх IKVM) без удачи, и, похоже, он очень устарел и не имеет документов.

Возможно, у кого-нибудь есть хороший пример сделать это с PDFBox, iTextSharp или любой другой библиотекой с открытым исходным кодом, и он / она может дать мнеподсказка.

Заранее спасибо.

Ответы [ 5 ]

7 голосов
/ 13 сентября 2011

Ну, спасибо вам за ваши усилия.

Я получил его с помощью Apache PDFBox поверх компиляции IKVM, и это окончательный код:

PDDocument doc = PDDocument.load(@"c:\invoice.pdf");

PDFTextStripperByArea stripper = new PDFTextStripperByArea();
stripper.addRegion("testRegion", new java.awt.Rectangle(0, 10, 100, 100));
stripper.extractRegions((PDPage)doc.getDocumentCatalog().getAllPages().get(0));

string text = stripper.getTextForRegion("testRegion");

И это работает как шарм.

В любом случае, спасибо, и я надеюсь, что мой собственный ответ поможет другим. Если вам нужна дополнительная информация, просто прокомментируйте здесь, и я обновлю этот ответ.

3 голосов
/ 03 августа 2012

Это должно работать:

RenderFilter[] filters = new RenderFilter[1];
LocationTextExtractionStrategy regionFilter = new LocationTextExtractionStrategy();
filters[0] = new RegionTextRenderFilter(new Rectangle(llx,lly,urx,ury));
FilteredTextRenderListener strategy = new FilteredTextRenderListener(regionFilter, filters);

String result = PdfTextExtractor.GetTextFromPage(pdfReader, i, strategy);
Console.WriteLine(result);
3 голосов
/ 13 сентября 2011

Это не с открытым исходным кодом, но, надеюсь, это поможет вам (и, возможно, кому-либо еще, использующему ABCPDF!)

Я сделал это сегодня, перебрав доступные поля в PDF.Это означает, что используемый вами PDF-файл должен быть создан надлежащим образом, и вам необходимо знать имя поля, для которого вы хотите получить текст (вы можете решить эту проблему, добавив точку останова и просматривая доступные поля).

WebSupergoo.ABCpdf6.Doc newPDF = new WebSupergoo.ABCpdf6.Doc();
newPDF.Read("existing_file.pdf");

foreach ( WebSupergoo.ABCpdf6.Objects.Field field in newPDF.Form.Fields )
{
    if ( field.Name == "Text1" )
    {
        // update "Text1"
        field.Value = "new value for Text1";
    }
}

newPDF.Save("new_file.pdf");

newPDF.Clear();

В этом примере «Text1» - это имя обновляемого поля.Примечание. Также приведен пример сохранения обновленных полей.

Надеюсь, это хотя бы даст вам представление о том, как решить эту проблему.

2 голосов
/ 13 сентября 2011

iText's RegionTextRenderFilter - это именно то, что вы ищете.

Итак, вы хотите что-то вроде этого (простите мою Java, но это должно быть легко перевести):

PdfReader reader = new PdfReader(path);

FilteredTextExtractionStrategy regionFilter = 
  new FilteredTextExtractionStrategy( new SimpleTextExtrationStrategy, 
                                      new RegionTextRenderFilter( someRect ) );
String regionText = PdfTextExtractor.getTextFromPage(reader, 0, regionFilter );
1 голос
/ 08 марта 2019

Этот код будет работать в itext 7

PdfReader reader = new PdfReader("D:/Sample2.pdf");
PdfDocument pdfDoc = new PdfDocument(reader);
Rectangle rect = new Rectangle(208, 508, 235, 519);
TextRegionEventFilter regionFilter = new 
TextRegionEventFilter(rect.SetBbox(208, 508, 235, 519));
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
FilteredEventListener listener = new FilteredEventListener();
LocationTextExtractionStrategy extractionStrategy = listener.AttachEventListener(new LocationTextExtractionStrategy(), regionFilter);
new PdfCanvasProcessor(listener).ProcessPageContent(pdfDoc.GetPage(1));
String text = extractionStrategy.GetResultantText();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...