Bài viết kỹ thuật

Hyperlink trong HotPDF Delphi: Mẹo với Chú thích PrintHyperlink

Các hyperlink (siêu liên kết) của PDF chính là các chú thích URI (URI annotations): một hình chữ nhật bao phủ vùng nào đó trên trang mà khi nhấp vào sẽ ra lệnh cho trình xem mở một URL. Chú thích này và phần văn bản nằm bên dưới nó là hai đối tượng hoàn toàn độc lập với nhau. PrintHyperlink của HotPDF gộp chung cả hai thành một lệnh gọi duy nhất, giúp vừa vẽ đoạn văn bản vừa tính toán luôn hình chữ nhật của chú thích dựa vào số liệu đã được render. Sự tiện dụng này lại giấu đi một vài điểm đáng để ta thấu hiểu rành rọt trước khi bắt tay viết mớ code cho bản chính thức. Nó cũng chả phải điều duy nhất đáng bận tâm: AddURILink ghim vùng bấm được đè lên mảng nội dung do bạn tự tay vẽ, rồi AddGoToLink thầu khoản điều hướng nội bộ — cả hai vụ này đều được mổ xẻ phía dưới

Cách PrintHyperlink vận hành

Lệnh PrintHyperlink chui trong THPDFPage và ẵm bốn đối số: tọa độ X với Y (đo bằng point, lấy góc dưới bên trái làm chuẩn khởi điểm, hễ Y tăng thì đâm chĩa ngược lên trời), cái chuỗi nhãn cần vẽ ra, và cái link đích URL. Chui sau hậu trường, nó hú gọi lệnh TextOut theo đúng tông màu hyperlink hiện thời, xong liền tự tay đo ni tính toán luôn cái mảng hình chữ nhật đắp lên bằng thông số TextWidth cùng với TextHeight lấy từ số đo font chữ tại ngay thời điểm bấy giờ. Điều đó có nghĩa là font chữ lẫn kích thước của nó phải được định sẵn trước bước gọi lệnh này, và không được nhúc nhích dịch chuyển nửa bước ở cái quãng hở nằm giữa lúc nó đang tô màu vẽ cái nhãn và lúc đắp chú thích lên, bởi vì cả cặp việc đó được chốt sổ ngay trong cùng một nốt gọi hàm

Màu mặc định là clBlue. Lệnh SetRGBHyperlinkColor đổi màu đấy nhưng chỉ tác dụng cho mấy lệnh gọi sau nó thôi; chứ nó đếch có vòng lùi ngược để tút lại màu cho mấy mớ chú thích nhúng từ trước đó đâu. Lỡ kẹt tình huống cần các tông màu lôm côm khác biệt cho từng xúm link trên cùng trang giấy, hãy nhớ gọi SetRGBHyperlinkColor ngay trước khi thả từng chùm, xong hẵng đặt lại như nguyên thủy sau khi thả xong

Đây này một tài liệu tối giản thả ba cái link bằng hai tông màu xé lẻ:

procedure CreateLinkedReport(const FileName: string);
var
  Pdf: THotPDF;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := FileName;
    Pdf.BeginDoc;

    Pdf.CurrentPage.SetFont('Arial', [], 11);

    // Default blue for informational links
    Pdf.CurrentPage.TextOut(50, 750, 0, 'Reference links:');
    Pdf.CurrentPage.PrintHyperlink(50, 720, 'Product page', 'https://www.loslab.com/en-us/pdf-library/delphi-pdf-component.html');
    Pdf.CurrentPage.PrintHyperlink(50, 695, 'Online manual', 'https://www.loslab.com/en-us/pdf-library/delphi-pdf-component.html');

    // Red for the action link
    Pdf.CurrentPage.SetRGBHyperlinkColor(clRed);
    Pdf.CurrentPage.PrintHyperlink(50, 660, 'Purchase license', 'https://www.loslab.com/en-us/buy-hotpdf-fastspring.html');
    Pdf.CurrentPage.SetRGBHyperlinkColor(clBlue);  // restore default

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

Cái bẫy Tọa độ

HotPDF cắm tọa độ xuất phát chễm chệ dưới góc dưới bên trái, trục Y thì leo dốc lên trên đỉnh, đơn vị vạch bằng point (1/72 của một inch). Một khổ A4 ôm cỡ 595 x 842 pt; khổ giấy Letter xứ Mỹ thầu cỡ 612 x 792 pt. Tọa độ Y=750 nằm vắt vẻo lấp ló sườn trên khổ A4, còn Y=50 thì nằm tọt xuống tận dưới cùng mép đáy. Mấy tay ngang nhảy sang từ vụ đồ họa màn hình hay gõ HTML auto tưởng tượng ngược cành, thế là nổ ngay cái link đầu bay lượn ra ngoài luôn mảng nhìn thấy được

Mớ hình chữ nhật của chú thích mà PrintHyperlink nó rặn ra cũng đẻ từ chính cái hệ tọa độ đấy. Đặt trường hợp sau đó mà bạn lỡ xoay trang, scale dãn khung, hay nắn khổ giấy mà không rờ chỉnh lại mớ giá trị X/Y, thế là mảng text nhìn thấy được và mảng nhấp bấm được nó chệch nhau phéng. Cái link đó vẫn "chạy" theo đúng nghĩa đen là quẹt tay rớt nhầm vô chỗ nào đó cách chục vạn dặm cái nhãn text thì bung cái URL, cơ mà mảng vùng bấm lại đéo khớp gì với khúc mắt chữ đang đọc. Nặn bài test thì lôi cái size khổ giấy chính thức với độ phân giải bung thu phóng đúng chuẩn mà bạn sắp tung hô ra mà chọi thử, đừng có gạch thử trên máy làm việc ở độ phân giải 100% không thôi

Thêm một vụ chắc như đinh đóng cột là nó lệch móp mỏ: thử hú PrintHyperlink với cặp tọa độ cân não hì hục set đúng vừa in cái tờ A4, xong bụp phát bẻ bánh lái đổ khung qua hệ giấy dọc dài ngoằn nào đó mà chả rớt giọt mồ hôi chỉnh lại số liệu X/Y xem, cái mảng chú thích đấy đứt xích bay hẳn luôn khỏi cái lề giấy chứ chả đùa. Đối tượng chú thích đó vẫn còn dính trong tệp PDF; nhưng đa số các trình viewer tụi nó gọt cụt cái đó luôn chả the thé ho he hếng nào, thế là cái link bốc hơi mà hệ thống vờ như chả có lỗi lầm gì sất

Chữ của Nhãn đối nghịch với Đích ngắm URL

Các đối số Text với Link chả bà con gì với nhau. Bút sa vẽ "Tải hóa đơn PDF" thì cái mục tiêu nó phi thẳng URL HTTPS đầy đủ ngập ngụa param vấn truy mớ hổ lốn. Chuyện phân thân thế là nặn ra có chủ đích; cái nhãn trưng ra mặt tiền thì người trần mắt thịt xài, còn URL mục tiêu thì bốc mảng lê thê hay sinh bập bùng tự động lúc chạy lệnh

Cái sinh chuyện là lúc cái nhãn lôi toạc luôn cái chuỗi URL sống dài ngoằn nghèo phơi ra mâm. Khúc nào xui xẻo cái URL lòi ra hai dòng thì toi, do cái khung chú thích bị đo đẽo cho mỗi dòng đơn, hậu quả là nhấn vào cái dòng thứ hai coi như đấm vào không khí. PrintHyperlink không vác đồ nghề bẻ gãy luồng văn bản ra làm nhiều dòng; chốt hạ cái nhãn súc tích cho nằm gói gọn trong một dòng khớp với kích thước font và khoảng rộng cột giấy bấy giờ, hay chêm cái nhãn súc tích mô tả mà nhét cái URL kềnh càng vô làm đích ngắm, không thì bê trọn trò vá víu cho từng dòng như mâm bài ở đoạn sau

Đụng mấy thể loại tài liệu trữ kho hoặc tung ra mà chả thèm cắm cọc internet, phải bóp đầu nghĩ xem cái mớ URL đấy có nên in lố ra ở đâu đó trong nội dung hay không, chứ chả phải cứ lấp lửng dạng siêu dữ liệu chú thích là êm. Độc giả ôm cái bản PDF in trên giấy thì vứt luôn cả cái chú thích URI ấy cũng chả sơ múi được gì

Tháo vát qua ải giới hạn rẽ nhiều dòng

Trường hợp cái nhãn chót ngáng quá hớp vượt ngưỡng một dòng — giả như bưng nguyên cái mâm URL dài thòng lọng lên trang in, hoặc rớt nguyên cái câu bị ngắt lề cần châm bấm mướt mượt trọn cả đoạn — đường gỡ rối là ném luôn cái khái niệm coi nó là một mớ liên kết duy nhất vào sọt rác, mà hãy coi một dòng cõng một liên kết. Mỗi bận hú còi gọi PrintHyperlink là nó lại đo gọt cái khung hình chữ nhật bọc gọn mớ văn bản nó vừa tạc, vậy nên quất mớ lệnh bâu xâu chia sớt chung mục tiêu Link kia đẻ ra một ổ chú thích vừa khít khìn khịt rủ nhau phi thẳng vô chung cái cổng URL ấy. Dân đọc chả đào ra được kẽ hở nào; quệt dòng nào cũng kích bung bét link

procedure PrintWrappedHyperlink(Page: THPDFPage; X, TopY, LineStep: Single;
  const Lines: array of AnsiString; const Link: AnsiString);
var
  I: Integer;
begin
  for I := 0 to High(Lines) do
    Page.PrintHyperlink(X, TopY - I * LineStep, Lines[I], Link);
end;

// Usage: break the label at the positions where your layout wraps it
Pdf.CurrentPage.SetFont('Arial', [], 10);
PrintWrappedHyperlink(Pdf.CurrentPage, 50, 400, 14,
  ['https://www.loslab.com/en-us/pdf-library/',
   'delphi-pdf-component.html'],
  'https://www.loslab.com/en-us/pdf-library/delphi-pdf-component.html');

Nhiệm vụ xẻ thịt chuỗi là việc của bạn: cắt cúp ngay chỗ nào chẻ dòng cho thuận nhãn quan dựa trên kích thước chữ với độ rộng lề hiện thời, bốc TextWidth ra làm thước đo cho đám dòng ứng viên đó. Nước cờ rẽ nhánh khác là bạn lúi húi vẽ trọn ổ chữ bị bẻ kia bằng mấy câu hú TextOut cộc lốc rồi sau đó dán bồi chồng một tấm chú thích AddURILink lấp lên từng dòng — lôi trò này ra trị lúc đống văn bản đấy đã được luộc chín bung bét bởi chính tay nghề code nắn gập văn bản của riêng bạn, cũng tiện cho việc mổ xẻ chính cái chức năng đó ở phần kế tiếp

AddURILink: dán miếng bấm đè lên mọi thứ bạn tạo

PrintHyperlink thực chất là đồ đùm gói làm màu cho lẹ: nó vẽ luôn cái nhãn của chính nó rồi mổ kích thước từ cái nhãn đó đẽo thành miếng mảng hcn. AddURILink là phân nửa tầng đáy trần trụi chĩa ra:

function AddURILink(Rectangle: TRect; const URL: AnsiString;
  const Description: AnsiString = ''): THPDFDictionaryObject;

Trò này chỉ in mỗi cục chú thích — câm tịt phần vẽ chữ mà chả có tô tước màu mè gì. Cái Rectangle bị nhai ngấu theo chung đúng cái khoảng không tọa độ với mấy lệnh vẽ vời của bạn, thế nên cứ bốc lộn xào lại y xì thông số X/Y mà bạn quẳng cho cúp TextOut hay hú gọi vẽ ảnh hồi nãy là trọn bài. Khúc này lật mặt nó thành đồ mổ chuẩn bài mỗi khi cái thứ cần lòi mặt nó đã mọc rễ sẵn đó: 1 điểm chọt hotspot ngay trên cục ảnh, 1 ô chứa dưới sàn bảng, cục mớ text mới vẽ ban nãy, hoặc y bài xẻ 1 dòng mổ bẻ đoạn luộc ở đoạn gỡ rối cộm ở phía trên nọ. Miếng chú thích nó cõng cái viền tàng hình mỏng dính, nên đếch có cái gì đập vào mắt nứt mẻ gì sất; khúc chọt quẹt nhấn nhấm trọn y vạch 100% cái hình chữ nhật mà bạn đục

Hàm trả lại cả cục tự điển mớ chú thích theo khuôn THPDFDictionaryObject. Lắm cha gọi lơ đễnh hốt cục chọi giỏ sọt rác, nhưng gom nó đi cho phép bạn mài giũa ngó nghiêng vọc thêm ba cái đầu mục của ổ chú thích nọ trước khi cả đám dập máy in thành file

Hốt đôi cái chuẩn gài lọt khung. Trót chui vô động PDF/A thì cái cờ in ấn của bọn chú thích dựng sừng lên chiếu theo ba cái luật lệ mớ tiêu chuẩn ấy ép uổng. Dạt qua vạt sân PDFUACompliance thì dính đòn bóp mũi là thông số Description cấm có câm điếc lủng lỗ — nó phi thăng thành nhánh /Contents của cục chú thích, đây chính là âm ngữ mà phe đồ nghể hỗ trợ nhai ra loa điếc cho vụ liên kết — và vướng khúc đó ẻm hất hàm phun exception ngáng họng thay vì ngậm miệng thả con file vỡ vẩn ẩu tả kia. Lệnh PrintHyperlink lòi đời từ thời khai thiên lập địa trước ba cái luật này và lười nhác chả móc xích mô tả nào, thành ra chọt trúng hệ xuất tài liệu PDF/UA thì xin mời lôi bút ra mà họa cái nhãn bằng TextOut rồi ịn chú thích với AddURILink lèm thêm cái câu văn giải nghĩa cho nó vuông

Bài luật bắt chọn lù lù đó: túm cổ PrintHyperlink mỗi khi ba cái link lèm nhèm mẩu ngắn củn bạn lười chưa thèm vẽ; quất AddURILink vướng chỗ cái bãi cắm cờ nằm đè mớ nội dung đã gọt ra rành rọt đo ni tự vạch

Điều hướng luồn nách bộ nội với AddGoToLink

Mấy cục URL cắm hướng ra ngõ ngoài mới diễn mỗi trò phân nửa bãi đáp của đám link chú thích thôi. Khúc còn lại cày bừa rặt trong xó xỉnh tài liệu — cỡ mục lục dội bom trúng chóc từng chương, hay chọt link qua ngó chương khác qua phân mảng hầm bà lằng. HotPDF lòi mớ gân này nhờ cõi mạng AddGoToLink:

procedure AddGoToLink(Rectangle: TRect; TargetPageIndex: Integer;
  YPos: Single = -1; const Description: AnsiString = '');

Thòng cho ba cái ngữ nghĩa cần phanh phui đục khoét cho rõ ngọn ngành, bởi mớ này bó tay ngửi mùi qua cái signature lệnh được. Lệnh TargetPageIndex đẻ chạy từ vạch số không: trang bóc trinh nguyên cuốn là trang số 0, kề khớp với thông số CurrentPageNumber. Bãi đáp trang tới cấm có đẻ non chưa hiện diện lúc bấm phím; nếu rớt khỏi chạc, lệnh nín thinh trả cục không mà chả thêm nổi cái chú thích lủng củng — vắng ngắt exception, trắng trơn cái link, bặt tăm dòng vỗ gáy cảnh cáo. Lên khung mục lục cắm cờ phi nước kiệu trỏ xa cự ly, mài gọt vẽ mâm trang nướng xong xuôi trước đã, hẵng tua máy về mớm bâu lại cái lố link đó

YPos chốt sổ trục dọc hạ cánh trên trang bãi tới, thả chung rọ tọa độ hệ quy chiếu đồng bộ với mớ lệnh tự biên diễn đồ họa. Khung -1 nằm chiếu dưới mặc định (dân quăng quật giá trị âm cũng đớp chóc y chóc) dập mộc khống cho tọa độ đích rỗng, hù bộ trình diễn Viewer giữ ngắt cái chân vách điểm dọc hiện thời lúc nhảy cóc phi qua trang mục tiêu. Truyền tham số nạp con số ngóc đầu lên dương một phát thì cái Viewer xăm xăm ráng quất đít cuộn dọc cho chóp định vị đấy đội mâm trên đỉnh viền sổ ô hiển thị — tiện lôi Y dọc ngay chóc cái đỉnh đề mục bạn tính cắm link vào. Rờ dãn soi phóng to cỡ nhỏ cỡ chả động chạm sất. Kịch y tuồng như ông kẹ AddURILink, mục chữ Description bắt phải ói có từ ngữ bám vỉa PDFUACompliance ngậm mồm câm rỗng không xong lật gọng biến tướng thành câu lèm bèm dự bị cho con link

procedure BuildLinkedTOC(const FileName: string);
const
  Chapters: array[0..2] of string =
    ('Introduction', 'Installation', 'API Reference');
var
  Pdf: THotPDF;
  I, Y: Integer;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := FileName;
    Pdf.BeginDoc;                        // page 0 becomes the TOC page

    // Create the chapter pages first so the link targets exist
    for I := 0 to High(Chapters) do
    begin
      Pdf.AddPage;                       // pages 1..3
      Pdf.CurrentPage.SetFont('Arial', [fsBold], 14);
      Pdf.CurrentPage.TextOut(50, 780, 0, Chapters[I]);
    end;

    // Switch back to page 0 and draw the TOC entries with their links
    Pdf.CurrentPageNumber := 0;
    Pdf.CurrentPage.SetFont('Arial', [fsBold], 16);
    Pdf.CurrentPage.TextOut(50, 760, 0, 'Contents');
    Pdf.CurrentPage.SetFont('Arial', [], 11);

    Y := 720;
    for I := 0 to High(Chapters) do
    begin
      Pdf.CurrentPage.TextOut(70, Y, 0, Chapters[I]);
      Pdf.CurrentPage.AddGoToLink(
        Rect(70, Y + 14, 300, Y - 3),    // covers the entry with padding
        I + 1,                           // zero-based: chapters are pages 1..3
        780,                             // land with the heading at the top
        AnsiString('Go to ' + Chapters[I]));
      Y := Y - 25;
    end;

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

Từng lố dòng chui lọt cái khung hình chữ nhật bung rẽ phình to ngang mặt hơn tẹo cho nó nổ chạm cả con chuột vào mặt cái vùng ngón bấm, và bất kể con link nào chọt xuống thều đội đỉnh đầu vào con đề mục (hạ bút vạch ở Y=780) sát viền trên mâm ngó của ô cửa số. Lỡ táy máy thọc thêm trang chặn họng phía trước mấy cục chương mục đó, ố là la thì cả mâm TargetPageIndex trượt tuột lệch cầu 1 nấc; gõ đầu lôi hàm loop vòng nhảy lò cò dập chốt chỉ số từ mấy lượt đẻ trang giùm rather than băm mã đóng ghim lòi chốt số liệu thủ công cày code cứng ngắc

Một mẫu nặn nguyên hình tài liệu bưng trọn gói

Bộ khuôn bên lề phác ra con hình chụp sinh động vất vả nhọc thân ra ngoài đời hơn đây: đẻ tọt cái mẩu báo cáo chót cọc đục lề header đỉnh, thân lèm bèm nội dung, ịn chân đít nặn chùm dải link, rặt từ cục mã đục nắn chứ lật gọng cái form vứt vô hũ nhai với con đường nhồi TEdit thủ công cộc cằn:

procedure GenerateProductSheet(
  const FileName, ProductName, ProductURL, SupportURL: string);
var
  Pdf: THotPDF;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := FileName;
    Pdf.Compression := cmFlateDecode;
    Pdf.BeginDoc;

    // Header
    Pdf.CurrentPage.SetFont('Arial', [fsBold], 16);
    Pdf.CurrentPage.TextOut(50, 750, 0, WideString(ProductName));

    // Body paragraph placeholder
    Pdf.CurrentPage.SetFont('Arial', [], 11);
    Pdf.CurrentPage.TextOut(50, 710, 0, 'See the links below for full documentation.');

    // Footer links
    Pdf.CurrentPage.SetFont('Arial', [], 10);
    Pdf.CurrentPage.TextOut(50, 80, 0, 'Links:');
    Pdf.CurrentPage.PrintHyperlink(50, 60, 'Product page', ProductURL);
    Pdf.CurrentPage.PrintHyperlink(200, 60, 'Support', SupportURL);

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

Ngó liếc mắt cho kĩ khoản SetFont đâm lệnh tọt lên trước mỗi đám mớ hú chữ nhe răng sủa dồn cục đó nha. Thằng cờ font này chả trụ dẻo quẹo sụn bẻ qua cái AddPage, vớ vẩn rụng não quên bẵng béng set tút trét lại trước mặt PrintHyperlink lòi trang mới keng, khung hộp chữ nhật cho phần chú thích nó phệt tự đo tự trét chiếu cố với mâm mặc định mốc xì của mặt giấy thôi à, lúc đó lại ố dề thắc mắc ủa sa tế đi lệch trật lất so tính rập khuôn

Chỗ đám Viewer chập cheng múa may vụ xử chú thích trật nhịp

Chuỗi chú thích URI trên PDF chễm chệ ăn nằm tại mộc chuẩn ISO 32000-1 §12.6.4.7, bất kỳ sấp nhỏ Viewer nào tuân chuẩn hếch mũi phải bám nhây cắn cỏ nghe theo hết á. Lúc vô thực tế bung bài rụng nụ, dăm chiêu phô bày của tụi Viewer rẽ nhánh băm lầy. Quỷ sứ Adobe Acrobat đẻ ra màn vỗ mâm kêu giật thót òa đợt chọt cái quẹt đầu đời vào chùm URL lọt ngoài sổ phong thần vây cánh domain ruột; mấy thể loại trình lướt Web với đám nhãi nhép Viewer nhẹ hều thì bơ cụ nó đi mảng này sất. Nhiều cha nội Viewer PDF cấp doanh nghiệp vác mác an ninh khóa mõm dập ngòi chết lột tháo banh luôn mảng chú thích URI đánh phè ra từ não policy, do đó quẹt con link câm nín nằm vạ cứng ngắc lòi con, vắng tanh tiếng hú ré lỗi lủng quỷ nào phanh phui phơi mặt. Máy nhỏ dế PDF thì phập phồng lởn vởn ba chiêu nhồi cái link bung trong chính cái nhãn web nhét ở trong ruột app mình ắt thì đá rầm lòi ra cái browser dính của chính hệ điều hành

Ngần đấy mớ chập cheng bung bét đếch phải bọ xít bới móc giùm để bạn nhọc lòng dập tay xử nhào trên bờ cõi code chế tác đẻ file đâu nha; đó là bài vạch định đường lối policy khốn nạn của chính hệ tụi Viewer đó chớ. Cách gỡ vốn là dập gõ vạch label mấy mẩu chữ trỏ link lóng lánh nổi rõ cả mâm URL đâm ra mặt giấy rành rành cho dân đọc luôn rứa, vì phòng nhỡ tay nào chui ống hẹp kẹt cái luật thắt nghẹn an ninh ngặt nghèo đấy thì còn mót rặn tự cào gõ copy chép tay lấy đường link đó dán lên coi tiếp được chứ. Phần chú thích gán nhồi là cho tiện bốc miếng; nhưng đoạn rẽ vạch thẹo ra cắm nhãn lề text là bãi đáp phao cứu sinh phơi mặt rực lửa

Khứa lòi vạch thấu ruột thêm chiêu nữa ẵm mang về nhà đây nghen: mảng URI chú thích PDF nọ trời sinh đẻ ra rặc đếch có đèo mót thêm cái vạch kẻ lót nằm dưới đâu á nha. Chút gạch dưới đít chữ bạn nghía được nhan nhản trên tỷ cái Viewer kì thực do đích thị đám Viewer nặn óc tự trét đắp vô mâm dừa vào thể loại bản mặt của phần chú thích, chả phải là cái glyph dính đẻ chui ra từ cuộn stream luồng nội dung của bạn đâu. Nếu đói khát lằn gạch đít ngó thật trân chai mặt cọ quẹt lúc ịn giấy bưng cho cái bộ renderer lười nhác câm mù (hay khui quăng hệ biến PDF sang mẩu hình) thì thò tay lôi quất LineTo kèm bồi cú Stroke nã ở độ thọt lút lốc nhích cái Y tụt xuống 1 khúc dưới mâm baseline ngõ văn tự mà tự vẽ ên hỉ. Việc móc súng quất cọ nắn nắn kia nằm trệch sườn ở 1 lệnh họa vẽ bẻ riêng biệt, chả mảy may dây tơ rễ má gì lọt tay nịnh đầm rặn giùm từ PrintHyperlink đâu nhen nhóc

Bộ API dành cho cái mục mớ hầm hyperlink phơi mặt rành rành nhét ở chỗ này là một mẩu cắm lọt cái Thành phần (Component) HotPDF cõng phục vụ cho Delphi với C++Builder