Kĩ thuật lấy text

Một phần của tài liệu XÂY DỰNG hệ THỐNG từ điển BKDICTIONARY sử DỤNG CHUẨN DICT (Trang 47 - 52)

II. KIẾN THỨC CHUNG

2. Kĩ thuật lấy text

a. Kĩ thuật lấy text trên các phần mềm nền Windows.

Từ những nghiên cứu về kĩ thuật hook Windows API trên đây. Ta đề xuất một cách lấy về text trên môi trường Windows như sau:

i. Ý tường thực hiện:

 Hầu hết text hiển thị trên nền hệ điều hành windows ( trừ text trên ảnh, pdf) đều sử dụng một trong số các hàm thuộc thư viện “GDI32.DLL” của Windows gồm : TextOutA,TextOutW, ExtTextOutA, ExtTextOutW,

DrawTextA, DrawTextW, DrawTextExA, DrawTextExW, TabbedTextOutA, TabbedTextOutW.

 Khi một vùng trên màn hình có sự thay đổi, thì mỗi tiến trình tự gọi một trong các hàm trên để vẽ lại text trong vùng đó.

Vì vậy muốn lấy text ta chỉ cần thay đổi các hàm trên bằng bằng các hàm mới của chúng ta thực hiện công việc của hàm cũ và còn đưa về dữ liệu text trong tham số. Rồi sau đó gọi lại các hàm vẽ text.

ii. Cách thực hiện:

 Xây dựng một DLL có chứa các hàm mới của các hàm vẽ text ở trên, và 2 hàm có mục đích thay đổi bảng IAT đã viết ở trên là:ReplaceIATEntryInOneMod

và hàm ReplaceIATEntryInAllMods.

 Sử dụng một trong các cơ chế ở trên để chèn DLL đã xây dựng vào hệ điều hành và các chương trình chạy trên đó.

 Khi DLL được nạp vào thì tiến hành thay các hàm vẽ text cũ ở trên bằng các hàm mới đặt trong DLL đó.

 Khi cần lấy text ở vùng nào của màn hình thì chỉ việc vẽ lại vùng màn hình đó bằng cách cho vùng đó bất hợp lệ ( invalidate).

 Khi đó các hàm đã xây dựng sẽ trả về text có trong vùng màn hình đó

Kĩ thuật này áp dụng cho mọi chương trình trên Windows sử dụng các hàm của Windows để vẽ text. Bao gồm gần như tất cả các chương trình chạy trên windows trừ text ở dạng mutilmedia, dạng pdf. Để có thể lấy được text trên những môi trường này chúng ta phải tiến hành theo cách khác. Cụ thể text trên ảnh thì phải sử dụng nhận dạng, còn trên pdf thì ta sẽ đi nghiên cứu sau đây.

b. Kĩ thuật lấy text trên PDF.

i. Giới thiệu PDF và lập trình trên PDF.

PDF là viết tắt của Portable Document Format, một chuẩn do hãng Adobe đưa ra nhằm lưu trữ tài liệu thông tin an toàn, bảo mật và nâng cao khả năng chia sẻ giữa các nền tảng khác nhau và chia sẻ qua mạng dễ dàng hơn.

Ngay khi ra đời, PDF đã chứng tở được những ưu thế vượt trội trong môi trường thông tin hợp nhất, nơi thông tin luôn luôn biến động đòi hỏi sự trao đổi liên tục. Nó được sử dụng rộng rãi và trở thành chuẩn mở ISO 32000.

Không phải vô cớ mà PDF được sử dụng nhiều như hiện nay, đó là do những ưu điểm vượt trội của PDF so với những định dạng tài liệu khác:

 Tính mở

 Tính đa nền. PDF có thể dễ dàng trao đổi qua các nền tảng khác nhau như Windows, Unix, Mac, mobile mà không làm thay đổi khuôn dạng.

 Tính xác thực và độ tin cậy cao.

 Khả năng bảo mật cao.

 Tính chia sẻ cao do định dạng pdf thường nhỏ hơn rất nhiều các định dạng tài liệu khác.

Để đạt được những tính năng trên, Adobe đã xây dựng cho PDF thành một nền tảng phát triển riêng, chính vì vậy một số hành động với các tài liệu thông thường không thể thực hiện được theo cách làm truyền thống. Cụ thể ở đây là muốn lấy text trên PDF không hề dễ dàng. Nó phải thông qua nền tảng phát triển do Adobe cung cấp. Cụ thể là thông qua những hàm API của PDF library API.

Nền tảng lập trình cho PDF được Adobe cung cấp tương thích với tất cả các nền tảng hệ điều hành trên PC, Mac cũng như mobile. Vì vậy nếu ta lập trình trên Windows thì việc chuyển nó sang các nền tảng khác cũng rất dễ dàng để làm việc với PDF. Điều đó thực hiện được là do cơ chế đa lớp của Acrobat core API như sơ đồ dưới đây:

Hình 3.Mô hình phân lớp của Acrobat core API

Hiện tại, để làm việc với PDF, người dùng thường chủ yếu sử dụng 2 phần mềm là Adobe Acrobat và Adobe Reader. Trong đó Adobe Acrobat là phiên bản thương mại cung cấp nhiều tính năng như tạo, chỉnh sửa, cung cấp nhiều tính năng bảo mật và chia sẻ thông tin khác. Còn Adobe Reader là phiên bản miễn phí cung cấp cho người dùng những tính năng cơ bản để làm việc với PDF. Đa số người dùng chỉ dùng phiên bản Adobe Reader cho mục đích đọc file pdf là chính.

ii. Nhận dạng text trên pdf.

Chúng ta không thể trực tiếp nhận text từ pdf mà phải phát triển một plugin cho phép lấy về text.

Ý tưởng cơ bản của kĩ thuật nhận dạng text trên pdf như sau:

• Xây dựng một plugin gắn vào phần mềm đọc pdf, plugin này sẽ đóng vai trò một cầu nối thực hiện các tác vụ trên pdf như bắt vị trí chuột trong file pdf, xác định text trong vùng chuột, trả về text nằm trong vùng đó. • Trên Windows ta chỉ cần thực hiện các hàm hook chuột như bình thường

và nhận dạng xem nếu dưới chuột là phần mềm Adobe Reader hoặc Adobe Acrobat thì tiến hành gọi các hàm lấy về text do plugin cung cấp.

Cụ thể như sau:

 Xây dựng plugin:

Plugin này là liên kết động mở rộng cho Adobe Acrobat hoặc Adobe Reader.Nó chứa những hàm mà ta tạo ra được viết bằng Acrobat core API. Những hàm này sẽ được liên kết động trong quá trình các phần mềm này hoạt động và thực hiện các tác vụ mà ta mong muốn.

Khi muốn cài đặt một plugin ta chỉ cần copy file plugin có đuôi .api hoặc .dll vào thư mục \Program Files\Adobe\Acrobat\plug_ins. Chương trình sẽ tự động liên kết khi khởi tạo.

Tuy nhiên, có một vấn đề khó khăn gặp phải là việc phát triển plugin chỉ được hỗ trợ đầy đủ trên phiên bản thương mại Adobe Acrobat. Còn trên phiên bản miễn phí Adobe Reader thì có một số hàm API sẽ không hoạt động. Chính xác hơn là không hoạt động cho đến khi ta bỏ tiền ra mua quyền phát triển trên Adobe Reader. Có thể giải thích điều này qua cấu trúc tổ chức của Acrobat SDK như sau:

Hình 4. Cấu trúc tổ chức Acrobat SDK

Trong đó PDF library SDK là phần có thể phát triển trên cả 2 phiên bản Adobe Acrobat và Adobe Reader. Còn phần Adobe Acrobat SDK chỉ được hỗ trợ đầy đủ trên bản thương mại Adobe Acrobat.

 Lấy text thông qua plugin:

Mọi việc chỉ đơn giản là xác định xem đó có phải là trên file pdf hay không rồi gọi hàm lấy text tương ứng:

if (GetClassName(WND, wClassName, sizeof(wClassName) /

sizeof(TCHAR))) {

//MessageBox(NULL,wClassName,"anc",0);

if (strcmp(wClassName, "AVL_AVView")!=0)

GetTextUnderWindows(hdc, X,

Y,lpString,cbCount,"NULL");

else GetTextUnderPDF(NULL); }

Hàm GetTextUnderPDF như sau:

void GetWordUnderPointPDF(PVOID parm) {

MessageBox(NULL,"filePDF",NULL,0);

AVDoc avDoc = AVAppGetActiveDoc();

if (!avDoc) {

return; }

AVPageView pageView = AVDocGetPageView(avDoc);

if (!pageView) {

return; }

AVCursor acur=AVSysGetCursor();

if(!acur) {

return; }

AVDevCoord xpoint,ypoint;

AVPageViewGetMousePosition(pageView,&xpoint,&ypoint);

PDDoc pdDoc=AVDocGetPDDoc(avDoc);

//buffer[0] = 0;

if (AVPageViewGetPageNum(pageView) > PDBeforeFirstPage) {

AVDevRect resultRect;

resultRect.left = xpoint-10;

resultRect.right = xpoint+10;

resultRect.top = ypoint;

resultRect.bottom = ypoint-1;

AVPageViewDrawRectOutlineWithHandles(pageView, &resultRect, true, true, NULL, NULL);

ASFixedRect fixedRect;

PDTextSelect pdtext=PDDocCreateTextSelect

(pdDoc,AVPageViewGetPageNum(pageView),&fixedRect);

AVPageViewInvalidateRect (pageView, NULL);

AVPageViewDrawNow(pageView);

}

}

iii. Vấn đề mã hóa và bảo mật trên pdf.

Một trong những ưu điểm làm nên thành công của pdf là khả năng bảo mật thông tin tốt hơn các định dạng tài liệu khác. Ưu điểm đó là do khả năng mã hóa và bảo vệ thông tin của nền tảng pdf.

Khi làm việc với các tài liệu này, phần mềm làm việc với pdf sẽ tự động vô hiệu hóa tất cả các can thiệp từ người dùng. Chính vì vậy các plugin cũng sẽ bị vô hiệu hóa nên sẽ không thể thực hiện được việc lây text trên pdf.

Đây là một điểm đặc trưng cơ bản khi làm việc với pdf nhằm bảo vệ thông tin khi người dùng không muốn người khác sao chép thông tin cần bảo mật.

Một phần của tài liệu XÂY DỰNG hệ THỐNG từ điển BKDICTIONARY sử DỤNG CHUẨN DICT (Trang 47 - 52)