Khi làm việc có liên quan đến file PDF, ngoài việc trích xuất văn bản trong file PDF ra thì chúng ta sẽ có nhu cầu tìm kiếm vị trí của một vài từ nằm trong văn bản vừa trích xuất.

Sau khi mình tham khảo qua các thư viện xử lý PDF thì thấy rằng việc xác định tọa độ (cordinates) của văn bản trong file PDF có thể dễ dàng thực hiện với thư viện iTextSharp.

Trước khi bắt đầu, chúng ta cần lưu ý một điều rất quan trọng là trong PDF không có khái niệm "từ", "đoạn", "câu", ... Ngoài ra, các văn bản trong PDF không nhất thiết phải theo thứ tự từ trái qua phải, từ trên xuống dưới. Nói chung, nó thích nằm đâu nó nằm à :)))

Ví dụ cụm "Hello World" có thể được biểu diễn trong PDF như sau:

Draw H at (10, 10)
Draw ell at (20, 10)
Draw rld at (90, 10)
Draw o Wo at (50, 20)code-box

Hoặc cũng có thể là:

Draw Hello World at (10,10)code-box

Bạn cần interface ITextExtractionStrategy vì nó chứa phương thức RenderText mà nó sẽ được gọi cho mỗi "cụm văn bản" trong PDF. Lưu ý là mình đang dùng từ "cụm văn bản" chứ không phải là "từ" nhé. Như ở ví dụ đầu tiên, phương thức Draw được gọi 4 lần tất cả để tạo nên "Hello Word". Còn ở ví dụ thứ hai, chỉ cần gọi 1 lần duy nhất.

Đây là một lưu ý rất quan trọng bạn nhé, trong PDF không có khái niệm "từ", vì thế iTextSharp cũng không có đâu. Còn gọi "từ" hay cái gì đó là tùy thuộc vào bạn thôi :)))).

Thêm một lưu ý nữa, như đã đề cập ở trên kia, PDF không có khái niệm "đoạn". Vì trong PDF cũng không có việc nhóm các văn bản để tạo ra dòng mới. Nhiều lúc bạn sẽ thấy nội dung trong file PDF "giống như đang ngắt dòng phân đoạn", thực tế nó là một cụm văn bản hoàn toàn mới được tạo ra với tọa độ Y khác với cụm văn bản trước nó.

Đoạn code sau đây rất đơn giản để thực hiện. Code được viết minh họa bởi Chris Haas trên StackOverflow (Bài viết tham khảo: #23909893).

Class RectAndText.cs:


Class MyLocationTextExtractionStrategy.cs


Code minh họa để sử dụng 2 class trên:


Nếu tìm thấy kết quả thì t.myPoints  sẽ có giá trị theo cấu trúc như sau:


Lưu ý về tọa độ trong PDF


Chúc các bạn code vui 😀

Post a Comment

Mới hơn Cũ hơn