これはこの質問の続きです
以下のコードを使用して、編集用にマークされたテキストを抽出する方法を見つけました。
ただし、編集対象としてマークされたテキストを超えてキャプチャされた追加の先頭および末尾の文字があります。
たとえば、ソース PDF ドキュメントでセンテンスが編集対象としてマークされている場合、以下のコードは、前のセンテンスの最後の数文字と次のセンテンスの最初の数文字もキャプチャします。
以下のコードで問題を確認できる人はいますか?
for (int i = 1; i <= rdr.NumberOfPages; i++)
{
// Get pages and corresponding annotations
PdfDictionary dict = rdr.GetPageN(i);
PdfArray annots = dict.GetAsArray(PdfName.ANNOTS);
foreach (var annItem in annots.ArrayList)
{
PdfDictionary d = PdfReader.GetPdfObject(annItem) as PdfDictionary;
PdfName typ = d.GetAsName(PdfName.SUBTYPE);
if (typ.ToString().StartsWith("/Redact"))
{
sb = new StringBuilder();
PdfObject o1 = d.Get(PdfName.QUADPOINTS);
PdfArray arr2 = o1 as PdfArray;
int numLines = arr2.ArrayList.Count / 8;
for (int k = 0; k < numLines; k++)
{
llx = float.Parse(arr2[(0 + k * 8)].ToString());
lly = float.Parse(arr2[(1 + k * 8)].ToString());
urx = float.Parse(arr2[(6 + k * 8)].ToString());
ury = float.Parse(arr2[(7 + k * 8)].ToString());
Rectangle rect = new Rectangle(llx, lly, urx, ury, 1);
List<RenderFilter> filters = new List<RenderFilter>();
filters.Add(new RegionTextRenderFilter(rect));
strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(),
filters.ToArray<RenderFilter>());
// We get the text but get extra leading/trailing chars that are not in redaction.
sb.Append(PdfTextExtractor.GetTextFromPage(rdr, i, strategy));
}
Console.WriteLine("Page: " + i.ToString());
Console.WriteLine(sb.ToString() + Environment.NewLine);
sb.Clear();
}
}
}