Bài viết kỹ thuật

Hello World với HotPDF trong Delphi: Chương trình PDF Đầu tiên của bạn

Bất kỳ thư viện PDF nào cũng đều ra mắt kèm với một ví dụ "hello world", và mẫu của HotPDF thì rất đáng để dừng lại tìm hiểu đôi chút, bởi vì một chương trình nhỏ gọn nhất có khả năng làm được việc thực thụ đã đòi hỏi bạn phải chốt được hai quyết định vốn sẽ đồng hành xuyên suốt mọi tài liệu sau này: đó là sử dụng loại phông chữ nào, và đoạn văn bản sẽ an tọa tại đâu trên mặt trang giấy. Đi đúng hướng ngay từ hai bước ấy rồi thì phần còn lại của API chẳng qua là các biến tấu phăng trên cùng một giai điệu gốc. Dưới đây là trọn vẹn mọi thứ, một chương trình dạng điều khiển dòng lệnh (console program) sẽ viết ra một mặt trang đơn lẻ mở lời chào mầng đến người xem bằng mười mấy thứ tiếng:

program HelloWorld;

{$APPTYPE CONSOLE}

uses
  Winapi.Windows,   // dùng lấy giá trị DEFAULT_CHARSET; trên Delphi đời trước bản XE2 cứ xài unit Windows trơn
  HPDFDoc;          // Unit chủ lực của thư viện HotPDF 

procedure CreateHelloWorld(const FileName: string);
var
  Pdf: THotPDF;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := FileName;
    Pdf.Compression := cmFlateDecode;   // nén nhỏ cuộn dòng nội dung (content streams)
    Pdf.FontEmbedding := True;          // nhúng bộ mặt chữ để nó lên hình đẹp vẹn toàn ở mọi nơi
    Pdf.BeginDoc;

    // Một face duy nhất phủ ngập bao la bảng bộ chữ mã (scripts). Mốc thông số đối số 4 là Windows charset;
    // trị số DEFAULT_CHARSET buông quyền cấp cho khối hệ thống tự bốc gắp con chữ (glyphs) trên từng sợi chuỗi.
    Pdf.CurrentPage.SetFont('Arial Unicode MS', [], 14, DEFAULT_CHARSET);

    // TextOut đo cữ theo hướng GÓC-DƯỚI-TRÁI (BOTTOM-LEFT), căn bằng point, vạch cữ Y sẽ lớn dần đi ngược vút lên.
    Pdf.CurrentPage.TextOut(72, 760, 0, 'Hello, Delphi PDF world!');     // English (Tiếng Anh)
    Pdf.CurrentPage.TextOut(72, 730, 0, 'Hola, mundo Delphi PDF!');      // Spanish (Tiếng Tây Ban Nha)
    Pdf.CurrentPage.TextOut(72, 700, 0, 'Hallo, Delphi PDF Welt!');      // German (Tiếng Đức)
    Pdf.CurrentPage.TextOut(72, 670, 0, 'Bonjour, monde PDF Delphi!');   // French (Tiếng Pháp)
    Pdf.CurrentPage.TextOut(72, 640, 0, 'Ciao, mondo Delphi PDF!');      // Italian (Tiếng Ý)
    Pdf.CurrentPage.TextOut(72, 610, 0, 'Olá, mundo Delphi PDF!');       // Portuguese (Tiếng Bồ Đào Nha)
    Pdf.CurrentPage.TextOut(72, 580, 0, 'Здравствуйте, Delphi PDF мир!'); // Russian (Tiếng Nga)
    Pdf.CurrentPage.TextOut(72, 550, 0, 'こんにちは、Delphi PDFの世界!');    // Japanese (Tiếng Nhật)
    Pdf.CurrentPage.TextOut(72, 520, 0, 'Merhaba, Delphi PDF dünyası!');  // Turkish (Tiếng Thổ Nhĩ Kỳ)
    Pdf.CurrentPage.TextOut(72, 490, 0, '你好,Delphi PDF世界');           // Chinese (Tiếng Trung)
    Pdf.CurrentPage.TextOut(72, 460, 0, '여보세요, Delphi PDF 세계!');      // Korean (Tiếng Hàn Quốc)

    Pdf.EndDoc;
  finally
    Pdf.Free;
  end;
end;

begin
  CreateHelloWorld('HelloWorld.pdf');
  Writeln('Wrote HelloWorld.pdf');
end.

Tài liệu PDF Hello World đa ngôn ngữ do thành phần HotPDF tạo ra trong Delphi

Toàn bộ ví dụ chỉ có bấy nhiêu thôi. Cuộc dạo diễn ghép đôi lời THotPDF.Create(nil) chung nhịp với try/finally ... Free chính là dạng khuôn (pattern) giữ quyền định danh quản lý sở hữu quen thuộc rành rành của Delphi (Delphi ownership pattern), và phía PDF đâu có nhòm ngó mảy may bẻ phăng nó. Cái đoạn nên cất đọng bận tâm là chuỗi cấu kết 4 bộ bước xương sống tàng ẩn chôn chặt đằng bên trong đấy: cài đặt các thông số (set properties), nện BeginDoc, vẽ vời ra hình (draw), gút dòng EndDoc. Thứ tự của nó không có chuyện tuỳ hứng đảo lộn hoán đổi chéo mâm đâu (not interchangeable)

Thiết lập các thuộc tính tài liệu trước đoạn BeginDoc

Lệnh BeginDoc là mốc điểm HotPDF đánh chốt dán keo cứng mảng thiết lập bố cục kết cấu của khung tài liệu (document's structure), cho nên bao nhiêu thể loại đè đầu chi phối tác động ngập cả khuôn tệp cần dốc sạch nén cấu cài chỉnh lót lên tít mặt trước điểm ấy (ahead of it). Khóa Compression := cmFlateDecode kéo mở mảng giải cấu nén FlateDecode khoác đè lấy mấy bọc luồng dòng content streams, cái đó nắm chốt khóa quyết định cự li đường phân cách xa lìa giữa 1 tấm file nén bó gọn chắc nịch với đồ khối ục ịch thổi dội rỗng ruột lãng hoang vô vàn. Bơm cờ hiệu FontEmbedding := True dồn gói nguyên cả bộ phông chữ mặt cái mà bạn vọc dùng quệt xài để đem chôn vào bụng khuôn file, hòng cho ra đời khung diện mặt ảnh đẹp giống i xì nhau trên nấy bộ máy cái mà từ khai sinh lập địa chửa từng nạp gài thứ mác Arial Unicode MS như nó trườn diện lên khối thiết bị tay xài. Lỡ quệt cài (Assign) dính chỉ định sai ngả đẩy hai con ấy xệ về bậu phía đằng sau lưng BeginDoc thì nó sẽ lầm lì ngoảnh mặc bơ chẳng đụng 1 chút động tĩnh làm suy xuyển mặt khối document đã cất nếp xắn chạy băng đà từ nãy (already in progress), và ứ hề ném 1 viên báo cáo hạch cảnh tỉnh lỗi (error) sất luôn để bạn dòm mà liệu cự chừng

SetFont, kế đến TextOut, và quan sát gốc tọa độ

Có hai thứ trong khâu dập lệnh quệt vẽ hay chực trói buộc ngáng cẳng mọi kẻ qua đường ngay ở mặt bìa đầu đời (first page). Tiên thiên trúng vào yếu tố nhịp dạo thứ bậc: SetFont cứ ắt buộc thảy phải lấn xông rải đường trước kì mốc gọi thả TextOut cậy nhờ nó, và nhịp vọc dồn này cũng buộc bủa lôi lại diễn sau mỗi điểm móc AddPage, tại cớ mốc phông chữ gác hạch chốt chưa đủ trình bám sinh vất vưởng chạy xộc qua một rãnh xé dòng vạch trang (page break) sất đâu. Khoản dội ải sau rớt vào mặt lưới hệ trục điểm (coordinate system). Lệnh TextOut đo cữ trỏ ngả điểm mốc lấy vách tại điểm dưới chân sát ở biên bậu trái của góc tờ (bottom-left corner), ứ phải trên đụn tả mốc dốc tít đỉnh đỉnh biên đâu nha, dẫu vậy đường cột Y thì vút độ gia nấc cơi khi hất đường gá dốc phía cao (move up), bằng chuẩn kích đo mảng phân points (1/72 nhịp thước). Thể vậy dẫn dắt minh chứng đặng sao cho những luồng nét (lines) dàn trận ngả tụt sụt tuột bãi xuôi thòng (downward) từ cữ điểm 760, tụt cái mỗi chóp móc bọc thụt trôi về móc dưới hụt mất 30 điểm đo ranh trượt sau chóp tút bám liền nhịp (last). Những gã tha khách xắn tay mò cập ở luồng trích nạp hình máy màn điện (screen graphics) cứ rập khuôn tin lấy phần mặt dạo lật úp chống hướng trỏ (opposite) thành thế gõ quẳng ốp tuốt dòng hạch ban xối (first line) trượt ngóe vuột đường gãy hẻm vực cõi rớt mép ở lề bục xệ tọt ở rìa chân dưới cùng

Một phông chữ, bao la mã vạch hệ ngôn ngữ (scripts)

Điều cắt nghĩa nguyên cớ tại làm sao gá đính duy nhất độc mỗi hàm gọi SetFont đà dư trút năng lượng oằn mình cõng một bề xả lấn hạch tuốt từ gốc mặt Latin, nhịp chùm bộ Cyrillic, hệ mảng chữ Nhật Bản, kèm tháp lượn nhánh tiếng Trung nằm sõng xoài ở trên chỉ duy độc mặt giấy là phụ cậy dựa dẫm thảy tuốt vô cái mặt ốp thân dáng gốc khuôn dập (face itself): dòng phông Arial Unicode MS xắn bao nạp nguyên lô cục mảng dải hình kí điểm mặt glyphs nhắm vơ lấy đập phủ bao mảng nạp xút xoắn của thảy tiệt gần ngập trọn dòng chữ cỗi script để ấp cất bọc dồn về nén gói nguyên cho 1 cái tập (file). Nấc cữ tham số ngàm (argument) mốc chốt dòng khóa 4 gá lấn ở đầu phím tút đệm nhét SetFont là chỗ định hạch thông danh cho cỗ mâm mảng bộ nhóm bộ chữ cái kí (character set) thuộc phân tầng bệ máy Windows, thành thế động bóc tuồn truyền (passing) khóa DEFAULT_CHARSET đẩy thông buông ngả chốt tự xâu cho hệ dập máy được tự xử tùy liệu bốc phết ra mặt chữ kí tự trọn tính hạch đè trên độ nhịp dọc tẽ (string) thay phiên thay gò rập vạch tất tuốt chùm lô ốc móc gá lồng khóa bịt trọn nguyên cõi vào 1 trang điểm nốt kế (code page) dạng phôi vớt dạt lạc nhịp thời đại tít tận bao nả vảng xa (legacy). Một cặp gá cảnh giới nhắc cấn nhét (caveats) cũng tự đeo đính nạp dạt chài hùa tuốt ngả lút chôn cùng sự việc chẻ tiện tay đấy (convenience). Bộ phông mác ấy tự dạt buộc tính điểm nạp mọc rình giáp túc trực túc tịnh trên cỗ nòng thân rập làm phôi (builds) dập tệp PDF, tại bởi HotPDF thu dồn ngốn nén gom (embeds) hễ cái gốc lõi hệ OS rập chốt phanh gỡ ra được thì nó tuồn bọc hốt trọn lấy thôi; rủi chớp trường hợp mâm ả Arial Unicode MS bốc tẩu biệt lăm (missing), máy gã Windows thì âm thầm giếm xập xẻ tráo nhét vào 1 cái mác ngáo lấp vá lút (substitute) kéo ụp cái lườn nhánh CJK tịt ngòi rập trào chưng phất lên thảy lột lộ độc dăm bọc rỗng phế trống trễ hộp không thôi. Kế đúp thảy mác phông chả gác đủ tay cõi nắn bưng được rành tuốt tất mọi nẻo gá gốc nhánh chữ (script): gánh trọn dạng bộ phông luồng hướng tạc chữ viết lách trút cữ giập dồn luồn bên ngả phải sụt nhả ngả trái như dòng lách hệ vạch tiếng Ả Rập chung chạ điệu chùm mặt Do Thái Hebrew, hay đai găm bộ thứ hạch đòi tay vát phang găm nhét điệu khối bọc vóc định hình gai cấu lằng nhằng (complex shaping), thì ông phải moi đụng rờ gỡ mác tuốt dạt mẻ phông chuyên biệt trỏ mặt phác (dedicated font) xắn dọn chực đi liền ốp chốt thủ tục gọi đai ngàm RegisterUnicodeTTF bồi lót theo các lốt luồng chùm lịnh trích xuất rập hướng ngả (right-to-left text calls), cự đó bấu nguyên mảng gã đứng thành phông mặt điểm đề tài đứng riêng rành vạch lố tự ngả gốc

Hãy chạy nó và bạn sẽ nhận được HelloWorld.pdf trong thư mục làm việc: một trang, một vài dòng văn bản đa ngôn ngữ, đã được nén, và nhúng sẵn phông chữ. Các bước tiếp theo hiển nhiên là đưa ra kích cỡ văn bản, kiểu dáng, và góc quay, cũng như chủ ý sắp đặt nhiều khối văn bản chứ không chỉ một, cả hai điều đó đều được giải quyết trong mẫu code TextOut. Khi bạn muốn vẽ các đường ranh, các khung chữ, và hình ảnh thay vì chỉ một mình chữ viết, cái gốc đối tượng mặt trang (page object) đấy dạt chứa thảy luôn cả những trích hàm nớ

Các lệnh TextOut, SetFont, và thao tác tài liệu được hướng dẫn tại đây là một phần của Thành phần HotPDF dành cho Delphi và C++Builder