[英]Unable to read text in a specific location in a pdf file using iTextSharp
我被要求閱讀 pdf 文本並做一些事情正在提取文本。 我正在使用 iTextSharp 讀取 PDF。 這里的問題是 PdfTextExtractor.GetTextFromPage 沒有給我頁面的所有內容。 例如
在上面的 PDF 中,我無法閱讀以藍色突出顯示的文本。 我無法閱讀的字符的 Rest。 下面是執行上述操作的行
`string filePath = "myFile path";
PdfReader pdfReader = new PdfReader(filePath);
for (int page = 1; page<=1; page++)
{
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
string currentPageText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);
}`
這里有什么建議嗎?
我在 SO 中經歷了很多查詢和解決方案,但並不特定於這個查詢。
文本提取不提取這些文本的原因很簡單:這些文本不是 static 頁面內容的一部分,而是表單字段,但是 iText 中的“文本提取”(以及其他 ZBCD1B68617759B1DFCFF0403A6B5 庫) static 頁面內容的文本”,因此。 您錯過的那些文本不受文本提取的影響。
如果您想讓表單域值也受文本提取代碼的約束,您首先必須展平表單域可視化。 這里的“扁平化”意味着使它們成為 static 頁面內容的一部分,並刪除所有表單字段動態。
您可以在閱讀此行中的 PDF 后添加
PdfReader pdfReader = new PdfReader(filePath);
代碼來展平這個 PDF 並將展平的 PDF 加載到pdfReader
中,例如像這樣:
MemoryStream memoryStream = new MemoryStream();
PdfStamper pdfStamper = new PdfStamper(pdfReader, memoryStream);
pdfStamper.FormFlattening = true;
pdfStamper.Writer.CloseStream = false;
pdfStamper.Close();
memoryStream.Position = 0;
pdfReader = new PdfReader(memoryStream);
從這個重新初始化的pdfReader
中提取文本也會為您提供表單字段中的文本。
不幸的是,在內容 stream 的末尾添加了扁平化的表單文本。 由於您選擇的文本提取策略SimpleTextExtractionStrategy
只是按照繪制的順序返回文本,因此之前的表單字段內容都在最后被提取。
您可以通過使用不同的文本提取策略來更改此設置,即替換此行:
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
使用LocationTextExtractionStrategy
(它是 iText 發行版的一部分)已經返回了更好的結果; 不幸的是,表單字段值與我們認為在同一行的 static 內容並不完全相同,因此出現了一些意外的換行符。
ITextExtractionStrategy strategy = new LocationTextExtractionStrategy();
使用 Horizo HorizontalTextExtractionStrategy
(來自包含 Java 和 C# 版本的此答案)結果會更好。 但請注意,這種策略並非普遍更好,請閱讀答案文本中的警告。
ITextExtractionStrategy strategy = new HorizontalTextExtractionStrategy();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.