翻譯|使用教程|編輯:李顯亮|2020-05-19 10:01:04.843|閱讀 3438 次
概述:PDF文件格式之所以受歡迎,是因為與其他文字處理文件格式相比,文件內容不容易修改。在本文中,將探索使用C#從PDF文件提取文本的眾多可能性中的幾種。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
PDF文件格式之所以受歡迎,是因為與其他文字處理文件格式相比,文件內容不容易修改。但是,您可以使用Aspose.PDF for .NET API從PDF文檔中提取文本。
在本文中,將探索使用C#從PDF文件提取文本的眾多可能性中的幾種。以下是將在此博客中討論的功能列表:
近日,.NET版Aspose.PDF升級到v20.5版,支持XFA表單設置/獲取值中的綁定表達式,修復PDF轉換時的一些問題,感興趣的朋友可點擊下方按鈕下載最新版。
從PDF文檔中讀取文本內容是一種常用功能。您可以按照以下步驟從文檔的所有頁面提取所有文本:
下面的代碼段遵循這些步驟,并顯示如何使用C#從整個PDF文檔中提取文本:
// Open PDF document Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf"); // Create TextAbsorber object to extract text TextAbsorber textAbsorber = new TextAbsorber(); // Accept the absorber for all pages pdfDocument.Pages.Accept(textAbsorber); // Get the extracted text string extractedText = textAbsorber.Text; // Create a writer and open the file TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt"); // Write a line of text to the file tw.WriteLine(extractedText); // Close the stream tw.Close();
探索了文檔級別的文本提取之后,讓我們從PDF文檔的特定頁面提取文本。只需按照以下步驟來滿足您的要求:
以下代碼段遵循以下步驟,以使用C#從PDF文件的任何頁面讀取文本:
// Open PDF document Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf"); // Access required page in PDF document Page page = pdfDocument.Pages[1]; // Create TextAbsorber object to extract text TextAbsorber textAbsorber = new TextAbsorber(); // Accept the absorber for specified page page.Accept(textAbsorber); // Get the extracted text string extractedText = textAbsorber.Text; // Create a writer and open the file TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt"); // Write a line of text to the file tw.WriteLine(extractedText); // Close the stream tw.Close();
考慮從頁面的特定區域查找一些文本。在這里重要的是要理解,.NET的Aspose.PDF中的基本測量單位是磅,其中72磅等于1英寸。此外,左下角被認為是頁面的原點(0,0)。以下是從PDF文檔頁面的特定區域或部分讀取文本的步驟:
下面的代碼段演示了以下步驟,使用C#從特定區域提取文本:
// Open document Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf"); // Create TextAbsorber object to extract text TextAbsorber absorber = new TextAbsorber(); absorber.TextSearchOptions.LimitToPageBounds = true; absorber.TextSearchOptions.Rectangle = new Aspose.Pdf.Rectangle(100, 200, 250, 350); // Accept the absorber for first page pdfDocument.Pages[1].Accept(absorber); // Get the extracted text string extractedText = absorber.Text; // Create a writer and open the file TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt"); // Write a line of text to the file tw.WriteLine(extractedText); // Close the stream tw.Close();
可以從PDF文檔中提取與某些模式匹配的特定文本。例如,要提取一些特定的單詞或數字。為此,需要設計一個正則表達式。API將利用該正則表達式在PDF文檔中查找匹配的文本。以下步驟是從PDF文件搜索和提取特定文本的準則:
以下C#代碼段使用正則表達式在文檔的所有頁面中搜索包含4位數字的文本,例如1999、2000等。
// open document Document pdfDocument = new Document(dataDir + @"Test.pdf"); // create TextAbsorber object to find all instances of the input search phrase TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(@"\d{4}"); //like 1999-2020 // set text search option to specify regular expression usage TextSearchOptions textSearchOptions = new TextSearchOptions(true); textFragmentAbsorber.TextSearchOptions = textSearchOptions; // accept the absorber for all the pages pdfDocument.Pages.Accept(textFragmentAbsorber); // get the extracted text fragments TextFragmentCollection textFragmentCollection = textFragmentAbsorber.TextFragments; // loop through the fragments foreach (TextFragment textFragment in textFragmentCollection) { Console.WriteLine(textFragment.Text); }
從PDF頁面上的表格中提取文本有些不同。在先前的示例中,我們一直在使用TextAbsorber類,但是從Table中提取文本有些不同。因此,您需要按照以下步驟從Table對象提取文本:
下面的代碼段遵循這些步驟,并使用C#有效地從PDF文檔中的表格單元格中提取文本:
Document pdfDocument = new Document(dataDir + "Test.pdf"); TableAbsorber absorber = new TableAbsorber(); absorber.Visit(pdfDocument.Pages[1]); foreach (AbsorbedTable table in absorber.TableList) { foreach (AbsorbedRow row in table.RowList) { foreach (AbsorbedCell cell in row.CellList) { TextFragment textfragment = new TextFragment(); TextFragmentCollection textFragmentCollection = cell.TextFragments; foreach (TextFragment fragment in textFragmentCollection) { Console.WriteLine(fragment.Text); } } } }
高亮顯示的文本在PDF文件中以注釋形式顯示。它們包含“標記文本”,這使其與文檔中的常規文本不同。以下步驟描述了如何使用C#閱讀突出顯示的文本:
以下是基于上述步驟的代碼段,可用于從PDF文件中獲取突出顯示的文本:
Document doc = new Document(dataDir + "ExtractHighlightedText.pdf"); // Loop through all the annotations foreach (Annotation annotation in doc.Pages[1].Annotations) { // Filter TextMarkupAnnotation if (annotation is TextMarkupAnnotation) { TextMarkupAnnotation highlightedAnnotation = annotation as TextMarkupAnnotation; // Retrieve highlighted text fragments TextFragmentCollection collection = highlightedAnnotation.GetMarkedTextFragments(); foreach (TextFragment tf in collection) { // Display highlighted text Console.WriteLine(tf.Text); } } }
以下是在使用C#語言從PDF文檔提取文本時優化內存消耗的兩種不同方法。
①使用Reset()和FreeMemory()方法
有時,文本提取可能會消耗大量的內存和處理器。可能是輸入文件很大且包含很多文本時。因為TextFragmentAbsorber對象將所有找到的文本片段存儲在內存中。
因此,建議的解決方案是在處理每個頁面之后調用吸收器.Reset()方法。此外,如果僅執行讀取操作,則還可以使用page.FreeMemory()方法釋放頁面對象所持有的內存。因此,需要按照以下步驟來利用最少的資源:
以下代碼段演示了使用C#從PDF文檔中提取文本:
Document pdfDocument = new Document(dataDir + @"ITF-TTF Manual.pdf"); TextFragmentAbsorber absorber = new TextFragmentAbsorber(new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts)); foreach (Page page in pdfDocument.Pages) { page.Accept(absorber); //Read something from fragments count += absorber.TextFragments.Count; absorber.Reset(); page.FreeMemory(); //GC.Collect(); }
②使用MemorySaving枚舉
用于.NET API的Aspose.PDF支持在從PDF文件讀取文本時配置內存保存模式。該TextExtractionOptions.TextFormattingMode枚舉服務資源的最優消費的目的。以下步驟概述了此方法需要遵循的步驟:
下面的代碼片段演示了使用C#進行內存節省的方法:
// Open document Document pdfDocument = new Document(dataDir + "Test.pdf"); System.Text.StringBuilder builder = new System.Text.StringBuilder(); // String to hold extracted text string extractedText = ""; foreach (Page pdfPage in pdfDocument.Pages) { using (MemoryStream textStream = new MemoryStream()) { // Create text device TextDevice textDevice = new TextDevice(); // Set text extraction options - set text extraction mode (Raw or Pure) TextExtractionOptions textExtOptions = new TextExtractionOptions(TextExtractionOptions.TextFormattingMode.MemorySaving); textDevice.ExtractionOptions = textExtOptions; // Convert a particular page and save text to the stream textDevice.Process(pdfPage, textStream); // Convert a particular page and save text to the stream textDevice.Process(pdfDocument.Pages[1], textStream); // Close memory stream textStream.Close(); // Get text from memory stream extractedText = Encoding.Unicode.GetString(textStream.ToArray()); } builder.Append(extractedText); } dataDir = dataDir + "Memory_Text_Extracted.txt"; // Save the extracted text in text file File.WriteAllText(dataDir, builder.ToString());
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn