Làm cách nào để đọc nội dung PDF với itextsharp với lớp Pdfreader. PDF của tôi có thể bao gồm Văn bản thuần túy hoặc Hình ảnh của văn bản.
Làm cách nào để đọc nội dung PDF với itextsharp với lớp Pdfreader. PDF của tôi có thể bao gồm Văn bản thuần túy hoặc Hình ảnh của văn bản.
Câu trả lời:
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
using System.IO;
public string ReadPdfFile(string fileName)
{
StringBuilder text = new StringBuilder();
if (File.Exists(fileName))
{
PdfReader pdfReader = new PdfReader(fileName);
for (int page = 1; page <= pdfReader.NumberOfPages; page++)
{
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);
currentText = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(currentText)));
text.Append(currentText);
}
pdfReader.Close();
}
return text.ToString();
}
using (var pdfReader = ...) {}
ASCIIEncoding.Convert
nên Encoding.Convert
vì nó là một phương pháp tĩnh
var pdfReader = new PdfReader(path); //other filestream etc
byte[] pageContent = _pdfReader .GetPageContent(pageNum); //not zero based
byte[] utf8 = Encoding.Convert(Encoding.Default, Encoding.UTF8, pageContent);
string textFromPage = Encoding.UTF8.GetString(utf8);
Không có câu trả lời nào khác hữu ích với tôi, tất cả dường như đều nhắm mục tiêu AGPL v5 của iTextSharp. Tôi không thể tìm thấy bất kỳ tài liệu tham khảo nào đến SimpleTextExtractionStrategy
hoặc LocationTextExtractionStrategy
trong phiên bản FOSS.
Một cái gì đó khác có thể rất hữu ích cùng với điều này:
const string PdfTableFormat = @"\(.*\)Tj";
Regex PdfTableRegex = new Regex(PdfTableFormat, RegexOptions.Compiled);
List<string> ExtractPdfContent(string rawPdfContent)
{
var matches = PdfTableRegex.Matches(rawPdfContent);
var list = matches.Cast<Match>()
.Select(m => m.Value
.Substring(1) //remove leading (
.Remove(m.Value.Length - 4) //remove trailing )Tj
.Replace(@"\)", ")") //unencode parens
.Replace(@"\(", "(")
.Trim()
)
.ToList();
return list;
}
Thao tác này sẽ trích xuất dữ liệu chỉ văn bản từ PDF nếu văn bản được hiển thị là Foo(bar)
nó sẽ được mã hóa trong PDF vì (Foo\(bar\))Tj
phương pháp này sẽ trả về Foo(bar)
như mong đợi. Phương pháp này sẽ loại bỏ nhiều thông tin bổ sung như tọa độ vị trí từ nội dung pdf thô.
Đây là giải pháp VB.NET dựa trên giải pháp của ShravankumarKumar.
Điều này sẽ CHỈ cung cấp cho bạn văn bản. Những hình ảnh là một câu chuyện khác nhau.
Public Shared Function GetTextFromPDF(PdfFileName As String) As String
Dim oReader As New iTextSharp.text.pdf.PdfReader(PdfFileName)
Dim sOut = ""
For i = 1 To oReader.NumberOfPages
Dim its As New iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy
sOut &= iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(oReader, i, its)
Next
Return sOut
End Function
Trong trường hợp của tôi, tôi chỉ muốn văn bản từ một khu vực cụ thể của tài liệu PDF nên tôi đã sử dụng một hình chữ nhật xung quanh khu vực đó và trích xuất văn bản từ đó. Trong mẫu dưới đây, tọa độ dành cho toàn bộ trang. Tôi không có công cụ tạo PDF vì vậy khi đến lúc thu hẹp hình chữ nhật đến vị trí cụ thể, tôi đã đoán một vài tọa độ cho đến khi tìm thấy khu vực.
Rectangle _pdfRect = new Rectangle(0f, 0f, 612f, 792f); // Entire page - PDF coordinate system 0,0 is bottom left corner. 72 points / inch
RenderFilter _renderfilter = new RegionTextRenderFilter(_pdfRect);
ITextExtractionStrategy _strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), _filter);
string _text = PdfTextExtractor.GetTextFromPage(_pdfReader, 1, _strategy);
Như đã lưu ý bởi các nhận xét ở trên, văn bản kết quả không duy trì bất kỳ định dạng nào được tìm thấy trong tài liệu PDF, tuy nhiên, tôi rất vui vì nó đã giữ được ký tự xuống dòng. Trong trường hợp của tôi, có đủ hằng số trong văn bản để tôi có thể trích xuất các giá trị mà tôi yêu cầu.
Đây là một câu trả lời cải tiến của ShravankumarKumar. Tôi đã tạo các lớp đặc biệt cho các trang để bạn có thể truy cập các từ trong pdf dựa trên các hàng văn bản và từ trong hàng đó.
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
//create a list of pdf pages
var pages = new List<PdfPage>();
//load the pdf into the reader. NOTE: path can also be replaced with a byte array
using (PdfReader reader = new PdfReader(path))
{
//loop all the pages and extract the text
for (int i = 1; i <= reader.NumberOfPages; i++)
{
pages.Add(new PdfPage()
{
content = PdfTextExtractor.GetTextFromPage(reader, i)
});
}
}
//use linq to create the rows and words by splitting on newline and space
pages.ForEach(x => x.rows = x.content.Split('\n').Select(y =>
new PdfRow() {
content = y,
words = y.Split(' ').ToList()
}
).ToList());
Các lớp tùy chỉnh
class PdfPage
{
public string content { get; set; }
public List<PdfRow> rows { get; set; }
}
class PdfRow
{
public string content { get; set; }
public List<string> words { get; set; }
}
Bây giờ bạn có thể lấy từng từ theo hàng và chỉ mục từ.
string myWord = pages[0].rows[12].words[4];
Hoặc sử dụng Linq để tìm các hàng có chứa một từ cụ thể.
//find the rows in a specific page containing a word
var myRows = pages[0].rows.Where(x => x.words.Any(y => y == "myWord1")).ToList();
//find the rows in all pages containing a word
var myRows = pages.SelectMany(r => r.rows).Where(x => x.words.Any(y => y == "myWord2")).ToList();
Public Sub PDFTxtToPdf(ByVal sTxtfile As String, ByVal sPDFSourcefile As String)
Dim sr As StreamReader = New StreamReader(sTxtfile)
Dim doc As New Document()
PdfWriter.GetInstance(doc, New FileStream(sPDFSourcefile, FileMode.Create))
doc.Open()
doc.Add(New Paragraph(sr.ReadToEnd()))
doc.Close()
End Sub