iTextを使用して、複数のPDFを1枚のPDFに結合する方法はこちら。
PDFからテキスト情報をiTextを使用して抽出する。(OCRではないので、PDF上で文字データをコピー&ペーストできるPDFファイルである必要がある。)今回は、取得位置を指定し、その範囲内の文字のみを抽出する。
NuGetでiTextを追加
Manage NuGetからiTextを選択する。必要なDependencyも一緒に追加される。
取得位置を計測
サンプルのPDFを用意し、ページ内の左下からみて、抽出文字の開始位置、取得文字列の範囲を計測する。
Adobe ReaderのMeasureを使用し、インチで計測し、ポイントに換算する。(インチ✕72がポイントの値となる)
Measureに行くには、Adobe Readerの右パネルからMore Toolsをクリックする。
この中からMeasureを選択する。
Measureを使用し、取得する文字列の左下の座標、文字列の横幅、縦幅を取得する。
ここではインチで取得のため、後ほどC#で使用する際にポイント変換を行う。(インチに72をかけけるとポイントとなる。)
コード
using System;
using iText.Kernel.Geom;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas.Parser;
using iText.Kernel.Pdf.Canvas.Parser.Filter;
using iText.Kernel.Pdf.Canvas.Parser.Listener;
namespace PDFReaderIText
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
string fileName = @"ファイルパスを指定する/SAMPLE.pdf";
PdfReader pdfReader = new PdfReader(fileName);
PdfDocument pdfDocument = new PdfDocument(pdfReader);
for(int pageNum = 1; pageNum <= pdfDocument.GetNumberOfPages(); pageNum++)
{
PdfPage pdfPage = pdfDocument.GetPage(pageNum);
//下記で指定する値がAdobe Readerから取得した値をポイントに変換した数値
//順番は、左下を(0,0)としたときの①x座標、②左下のy座標、③横幅、④縦幅
Rectangle rectangle = new Rectangle(81, 591, 145, 84);
Console.WriteLine(GetTextInRectangle(pdfPage, rectangle));
}
}
static string GetTextInRectangle(PdfPage page, Rectangle rect)
{
var strategy = new FilteredTextEventListener(new LocationTextExtractionStrategy(), new TextRegionEventFilter(rect));
var parser = new PdfCanvasProcessor(strategy);
parser.ProcessPageContent(page);
return strategy.GetResultantText();
}
}
}
このような実行結果を得られる。
プロジェクトは下記より。最初にNuGetのリストアが必要。