Một chú thích (annotation) chả phải là mớ nội dung khắc trên trang giấy. Hồi bạn xướng gọi TextOut cọ cọ hay nặn ra cái hình chữ nhật vẽ vời, đống nét mực đó bám rễ vĩnh viễn tạc thành cuộn luồng dữ liệu của trang đó, nướng chín khét vào đống byte mà cục kết xuất render nó sơn vạch ra rành rành. Một mẩu chú thích thì lật mặt thành hẳn cái rương tự điển rẽ nhánh lủng lẳng móc tọt vào trang giấy qua ngõ cái mảng /Annots, có cái hình chữ nhật ôm riêng, mớ giao diện hiện diện riêng, với chu trình vòng đời cũng đặc thù xé lẻ nốt. Thằng trình duyệt đọc được quyền moi ra, đá lôi dịch ổ, búng chìm khuất lấp, hay cạo trọc tiễn vong nó khỏi bản PDF mà chả cần xê xích vặt dù chỉ 1 cọng nét của đám trang giấy ẩn mình dưới mâm đó. Cái ranh giới rẽ lối đó chính là rốn lõi sinh tồn của loài chú thích, nhưng mặt khác cũng là bãi đẻ ra đôi điều giật nẩy mình cho dân mới bập vào: xó xỉnh tọa độ rớt đáp của con chú thích, với cái nết mặt mũi lòi ra dòm ra sao chừng rơi lọt tay vô một bộ viewer cụ thể nào đó
HotPDF phanh phui phơi mâm cái xớ lố subtype (loài con) thuộc chuẩn ISO 32000 mọc ra nhờ nguyên cọc gia phả hàm gọi AddXxxAnnotation vắt trên mâm đối tượng trang (page object). Ráo trọi sấp đó đều đúc chung một cốt cách khuôn hình: một cái hình chữ nhật đóng cọc vị thế cho miếng chú thích cắm rễ trên nền trang xài hệ tọa độ không gian người dùng của PDF (PDF user space), bồi thêm nhúm hành trang chở theo (như mẩu text, mác tên một cái mộc dấu stamp, hoặc đôi cọc điểm point), và nặn ra 1 cái màu. Xào đúng vị cái miếng mảng hình chữ nhật đó là rũ sạch bọt mớ nhọc nhằn rồi. Vế tàn dư bám đuôi là móc thấu ruột soi cho ra lò loài chú thích nào nó ẵm gánh sẵn luôn cái giao diện hiển diện của riêng thân nó, và lò loài nào thì khoán mớ lười nhác xù vứt tẹt sang vai lũ Viewer nặn dập xào nấu

Hình chữ nhật đại diện cho chú thích, không phải văn bản
Mỗi tiếng hú lệnh đẻ chú thích thẩy vô 1 biến TRect, và cái khoảng hình chữ nhật nọ gánh cái nghĩa xé tà trật khấc dòm lại mớ tọa độ bạn quăng vô TextOut à nha. Bới loại ghi chú văn bản thì nó đóng cái cục hotspot mồi chọt click đâm búng, cái xó be bé xíu lót đít cắm cờ cho cái icon ẻm ngự và cũng là cái rốn mà mảng nhấn chuột sẽ dội nổ lòi ra nắp bình chứa cái dòng comment đó. Còn vớ loại vẽ chải mảng hộp vuông hoặc text lơ lửng tự do thì ẻm giăng bao xài hết công suất độ bẹt hiển diện cho cả khung đó luôn. Với mộc dấu thì đó là khung rào bắt mớ đồ họa của cái dấu đó thu vắn nhóp tọt vào. Đống số liệu xài lốc điểm point PDF user-space, canh thọc đo vút từ cái hóc dưới tít nách trái, leo dốc chữ Y trồi lên thiên đình chóp lăng, đồng lõa y bài quy ước với trọn vẹn băng nhóm HotPDF rập khuôn
Mẩu chú thích dạng note (ghi chú văn bản) là dòng phái nhẹ hều nhất. Bạn chỉ việc độn ruột chữ cho ẻm, thẩy 1 khung hình chữ nhật cho cái biểu tượng, quăng cái cờ lệnh liệu coi lú ra sẵn lúc khui bảng không, chọn mác tên biểu tượng, với cái màu trét thôi
Pdf.CurrentPage.AddTextAnnotation(
'Reviewer: confirm the totals on this line before sign-off.',
Rect(120, 700, 140, 720), // icon hotspot, ~20pt square
False, // closed until the reader clicks it
taComment, // bubble icon
clBlue);
Khuôn chữ nhật ở trỏng nặn bé mót có toan tính đó, đâu cỡ chừng độ hai chục point mỗ vạch vuông, vướng víu lẽ mẩu text note nó phơi mặt cái mã hình icon ốm nhom chừng nào có chọt nhấn ẻm thì thưa bệ. Chơi ngông banh hạch giãn tọt toạch vạch chữ nhật bự phang ra ngõ thì chả ôm lòi ra cái tờ ghi chú mập ú nụ húp béo đâu nhá; bạn rặn cái bãi hotspot hứng đạn click khổng lồ chà bá với mỗi cái hột nhúm icon xí muội kẹp xó xỉnh tọt ở 1 góc lề kìa. Cột cờ Open lèo lái quyết coi ẻm giương vây bong bóng ngỏ tung lúc mở toang trang vỗ mặt chăng. Tọng cả tá mớ note True rặt bâu vô thế là tụi nó đè sấp chồng chất lên lưng nhau bẹp nhẹp rồi lấn đè bẹp dí mâm chữ nội dung dưới rốn luôn, thành thử chừa cái đặc quyền đó cho chóp mẩu 1 nốt duy nhất bạn đoan chắc tọng vào họng độc giả bóc liền chóc
Cái mác tên gọi icon nặn đẻ từ kho THPDFTextAnnotationType, đè chuẩn mapping móc y chóc ra bầy icon thông lệ: taComment, taKey, taNote, taHelp, taParagraph, taNewParagraph, cùng xâu taInsert. Cặp icon đó gọt thay áo đúng duy nhất cái nước sơn. Lệch quỹ đạo hành vi thì cấm có; nhưng tọc mạch cho hay cái xớ là đéo phải Viewer nào cũng chiều trét lút lột rành rọt tả bảy cái hột bậu xậu này đâu nhe; dàn an tâm chắc bắp ăn rơ thông xuốt cả mảng app già háp với nít nôi bấu víu rặt taComment, taNote, với taHelp
Free text viết tràn trang, song thân phận vẫn là annotation
Một cục chú thích dạng free text phơi cái mã dòm ngó i xì mâm nội dung văn tự (content) thiệt vì mớ chữ chình ình vạch nọc phơi bày chả thèm ỉ ôi cú chọt click, ngự trỏng lọt thỏm giữa lồng kính chữ nhật hệt dáng chú thích phụ đề. Kì thực cốt ẻm vẫn rặc loài annotation (chú thích) nha, ẵm mang thấu mớ khả năng bóc tách lột ra nhẹ tễnh, đúng chuẩn y phóc bài toán húp sò bạn khao khát chọt cắm cái dấu review phang mác draft nháp mà sau cữ đó chúa tể hay khứa review dọn vứt xó bay màu nó êm ru. Cú lột xác lệnh hàm đổi hột icon cùng cờ mở phanh thay bằng cọc mốc bóp ịnh căn lề (justification)
Pdf.CurrentPage.AddFreeTextAnnotation(
'DRAFT - not for distribution',
Rect(200, 210, 400, 235), // the box the text is laid into
ftCenter, // ftLeftJust / ftCenter / ftRightJust
clRed);
Khúc này cái miếng mâm hộp chữ nhật phang quyền lực mạnh bạo lấn án xa so với phái text note, bởi rốn chữ nó vắn vắt cuốn khúc với lườn lách nắn eo lọt thỏm trong hốc đó. Ép khuôn hộp ngắn tủn phọt mỏ thì lố lề dưới chữ cạo gọt tịt xén lút cành; ép ốm tong teo dẹt lép thì ẻm uốn lách bẻ nắn thọt vỡ đội hình gãy ở mấy đoạn nẻ chả lường. Trò búng mốc dập lề lôi tọt từ kho THPDFFreeTextAnnotationJust và chỉ rặn mót được mỗi ba chòm giá trị đó thôi á. Căn nguyên free text nằm lọt lố chú thích vẽ đè markup, ông thần đọc vác tròng vào app chỉnh sửa xoi mói dễ ẹc thọc móc lôi khoanh, lạng bóp di dời, hay trảm bửa xóa bỏ trọn rập 1 khối y hệt, đây chính chóc là vạch đường lằn ranh quyết nổ búng đầu ngón tay lôi free text quẩy hay đẽo thủ công gõ mớ chữ nọc ra thẳng mâm TextOut cho vuông. Nếu ghim xích lấp mác là vĩnh cửu bất diệt, lôi cọ họa vẽ ẻm rành ra. Lại nếu bấu mác kiểu nắn gọt xào mổ ý hòng tống khứ rút củi về, thì lôi tuột nắn cho ẻm thân phận chú thích à nghen
Đẽo vẽ hình học với lằn kẻ chỉ mặt điểm tên xoi mói
Ba mớ vuông hụp, vo tròn, rồi nét gạch kẻ chỉ mặt chính danh lũ markup bạn quăng chiêu dập chỉ định chọt sấn một mảng cõi vạch thay vì nhọc nhằn lèm bèm chõ bằng lời lải nhải. Cú đẻ AddCircleSquareAnnotation ôm chòm thầu bọc đôi phái lồng hộp qua kho THPDFCSAnnotationType bới móc ra nấc csCircle hoặc bốc csSquare, cõng theo chòm vuông mâm rập khung chuồng xích cho mớ hình hộc nọ
// A box drawn around a figure that needs attention
Pdf.CurrentPage.AddCircleSquareAnnotation(
'Check this region against the source data',
Rect(50, 300, 120, 360),
csSquare,
clGreen);
// A line, given two points rather than a rectangle
var
StartPt, EndPt: THPDFCurrPoint;
begin
StartPt.X := 130; StartPt.Y := 360;
EndPt.X := 250; EndPt.Y := 320;
Pdf.CurrentPage.AddLineAnnotation(
'Points from the note to the figure',
StartPt, EndPt,
clBlue);
end;
Chiếu tướng ngó cho tỏ thì mẩu chú thích nắn lằn kẻ kia quẫy thoát li vỡ trận trò rập khuôn hình chữ nhật đó: ẻm nuốt hai cục rốn mốc THPDFCurrPoint, một cọc khởi bệ và một mũi kết hậu, bởi cái đường thẳng nó nặn phôi nhờ hai nanh nhọn đầu mút, nào đâu có nạp sinh vì mớ lồng khung chữ nhật. Màu sơn quất nhát cọ độ nét chải đường. Đói cồn cào đám mũi tên cắm nhọn hở, HotPDF rặn mót đẻ thêm mớ nhồi overload cho AddLineAnnotation hẩu nuốt trọn bầy mớ phong cách xén mút đuôi lằn kẻ đó, cơ mà cọc mẫu mộc trần trụi ba cái vế đùn đẩy thì rặn phọt ra trần trùi trụi con lằn kẻ cộc lốc trọc lóc, vốn dĩ đó là thứ đa bận mấy cọc ghim báo hiệu chõ mũi vô thèm khát vớ lấy à
Lỗ xào phái text-markup (vạch nổi text) nó xài quăng nhát dập sấn trọn vô dải cõi vạch bạn đã dàn binh bố trận phủ phục đâu đấy rồi. Cú tọc AddHighlightAnnotation vớt cái mâm lồng chữ nhật, nội dung chữ phụ (có vắng chả chết chóc gì), rồi cái màu lót ấp tự vạch nhả mặc định ngả khè tông vàng nín thở, trét láng bóp nhuộm phơn phớt y như cọ viết lông dạ dạ quang. Mớ đó là để lót lưng nằm bẹp chồng lấn con text hàng thật giá thật ở bển, suy ra mâm hộp rập chữ nhật kia phải đục đẽo bám sát ăn rơ khuôn lố ranh ngữ văn bạn trát, có nghĩa bấy dông bạn phải lôi mớ đống tọa độ đó chọt tính ra khớp khít y vạch số má dội cho nhát TextOut hơn là cắn bút nhắm đại nặn mò
Con dấu phụ thuộc vào trình duyệt để lên hình
Đỉnh nhai óc gây ức chế ngó mâm nảy mặt dị biệt lẹo vẹo trật vuột rạch trời khấn lạy qua sấp mớ Viewer rờ đọc đích thị là lò mộc dấu stamp, vạch nhẽ ra rễ để tỏ cặn kẽ cũng trọn lẽ đáng bát cơm. Cú gọi hú AddStampAnnotation dán nhãn nòi mộc dấu mọc ruột chuẩn đét vắt từ THPDFStampAnnotationType, bọc hàng sấp mớ values cựa satApproved, satConfidential, satFinal, satDraft, với satForComment
Pdf.CurrentPage.AddStampAnnotation(
'Approved for release on review',
Rect(50, 400, 200, 440),
satApproved,
clGreen);
Cái mác con dấu nọ tợ một mảnh giấy kêu réo đệ trình. Dân PDF đẻ nặn ra trọn ổ bầy danh mục tên gọi các loại mộc con dấu nhưng lờ xịt nặn gọt nọc vẽ nghệ thuật rớt núp váy sau bầy lũ kia, thành thử ông mỗi app Viewer tự ói rặn tuôn ra lò bọc mâm xào mổ cái chữ "APPROVED" hay rũ cờ "CONFIDENTIAL" theo phong cách tự rặn mót riêng ẻm, còn thọt mấy khứa lại nín thinh chả rải hột nốt bọt bèo trét gì sất hễ hộc tên lạ hoắc chả đánh vần trúng hốc ruột ẻm. Mâm lồng chữ nhật ghim nẹp đẽo ni ranh hốc giam chóp xào đồ họa thu kéo co nắn vào lọt thỏm, còn nấc màu rải nhón chân thì rớt cái phận mồi bả hint mà trúng Viewer nó chịu ợ ra nuốt hay câm bơ đi chả ai thọc bắt vạ ẻm. Giả lỡ cục mộc dấu ép mâm tạc hình phải trăm mắt nhìn đều y một giọt sao y đúc, bãi đổ an lòng bám rễ vách chắc bắp chả cắm dội đống stamp hờ tiêu chuẩn gì sất: mím môi vác cọ tự vạch họa nhát trét cái mộc dập bằng mâm TextOut phối chùm hú gọi lằn mốc vẽ vời nọ, hay quăng ịn ẻm bẹp lố free text annotation mà bạn nắm cán thọc cọ đẽo ngắm màu mè. Đu đọt níu vào cọc stamp chuẩn dọn mâm chỉ đành chừng não bạn khao khát cái nước màu rặt sành điệu thói mốc của con app Viewer thân thuộc với độc giả nhắm tọt cho dải đó ngậm lố bấp bênh rủi ro dòm chệch hụt
Chút nhồi thêm lố nặn dập đính nách kẹp giò theo tệp bám đuôi đít form shape mâm lồng chữ nhật cõng mồi payload ruột trượt. Lệnh gõ hú AddFileAttachmentAnnotation cạp xơi con miêu tả dăm ba câu, nhắm đường link chỉ đích danh con file bứng ruột đục tọng thọc, mâm hộp chữ nhật đẽo dán cái icon cây ghim kẹp giấy, thêm nốt màu mè sơn. Khứa con tệp kẹp chui nách rúc ruột ẩn lút trĩ kĩ trong bụng PDF, và con nhúm icon ló đầu đó là cái càng tay nấm rơm dụ rốn người đọc bứng quặp kéo ẻm ra nổ lòi
AcroForm fields khác rọt chú thích ở mảng nào
Cái mâm mớ nhùng nhằng lú mề thiêu đốt trôi tuột hàng giờ hụp lặn nhọc xót nhất đó là bốc mảng annotation xào đục ức hiếp ẻm y hệt cọc form field. Đám hai lứa đồng lõa móc ruột đu bám vào mâm trang giấy xuyên nách hẻm /Annots, chớ hề cái ốc form field thì nọc cốt nhĩ chính hiệu là 1 nấc lòi subtype xé nháp biến dị của annotation sứt sẹo chọc ra (gọi là widget ấy), đó là uẩn khúc vạch lưng sao bộ sậu lũ dòm vẻ có bà con cật ruột. Chúng đéo rúc thế chỗ dội hụp nhau sất. Một cục form field ngậm bóc 1 hột giá trị ngậm miệng, cõng theo cái mác tên gọi, chui lọt vắt nấc bốc xô xé trong lề luật tab order xó lùi, và ôm nọc được ấn búng submit nổ đi, reset dọn bãi, hay thọc cọ bọc kịch bản script lùa xào gõ trét chọc chọt; vớt nặn tạo lò ẻm bằng rập nòng hú lệnh AddTextField, AddCheckBox, với AddPushButton kìa, chả phải rổ mớ bọ annotation vãi nhả nhai nãy giờ. Lốc markup annotation ôm vỏn vẹn lú nhú câu thọc thọt comment hay dán rập nét khối lốc, rỗng tuếch giá trị mớ hạch gì hòng búng gởi submit dội ra nách, và rành rành rớt vách thành củ nợ đồ chọc xạo sai mâm ngay phút mốt chừng lòi rốn bạn cần móc đục nhồi ngậm thu húp data mồi nhập liệu
Phép test băm lằn thực chiến phọt phệt chả kén não gọt móp. Nín thở bóp lòi, hễ ông kẹ người dùng phải múa phím tọng lộc, nhón lựa chọt khều, hoặc rấp dập bấm chọc ngỏ ý ép cuốn tài liệu ngậm mồm bưng rốn ghi lòng mớ rập khuôn nọ, tọt húp là đứt tay cần hốc AcroForm field. Nhược chăng bạn lúm rải ném chút nhúm note, xẻ lằn tô mảng vạch bãi, hoặc dập ịn nhát mộc phơi mặt trạng thái gánh kẹp đu cọng vắt cuốn tệp tài liệu dạo trôi dạt cơ mà đếch cõng tạc miếng số data thọt nào, trúng phóc cái mỏ dội thèm húp của 1 con annotation lòi con ra đó. Bứng đẽo trộn nháo nhào múc dập cả rổ sẽ nặn đẻ rớt ra sấp tệp tài liệu nghía bộ cánh coi thì lòi chuẩn phết cơ mà trượt quẫy đứt đoạn hành vi thì phế vãi xỉ: mảng "field" khỉ gió chả cha nội nào gõ thọt đút vô được, hay nhúm comment nhạt toẹt bốc hơi không lơi dấu lúc dọn trọc reset form. Cái vòi xúc tu ngọ nguậy lấp tương tác đập nhả với mảng lũ phái field, màn cắn bắt lỗi kiểm validation, với nanh vuốt submit búng mồi rải thẩy, ẻm gom tọt bốc rãnh xé mâm lột chuyên mục xào rẽ nhánh vắt vẳng phơi bục trong lốc thăm dò dạo xơi trường bãi AcroForm fields hụp lặn nhát lệnh hành động rẽ xớ nhón riêng à nha
Gộp nắn mảnh vụn thành 1 mâm trang giấy nguyên đai
Bầy lố mảnh rời chắp ráp ghép lót nặn tụ mâm thạch y chóc cách bộ sậu rổ còn lại bầy binh lố lốc HotPDF khua khoắng nhồi nổ. Setup lót dọn mớ tệp tài liệu nhét đục hốc properties, xướng gọi BeginDoc, thọc cọ múa họa rẽ nhát băm đẽo vạch mớ hốc nội dung trang hăm hở dọn nọng nuốt chùm mảng text với graphics nhót mốc cần nhồi vô, ghim dội nọc phọt lố mớ annotations rải bồi cõng vách chóp ngự thiên, xong cụp vòi dập nút đít rào đóng khóa vớt EndDoc. Annotations ẻm móc đẻ rốn ịn chọc chui nách bấu lòi vô cọng CurrentPage hốc rốn, thế là tuột đít cú lốc nảy trang mới AddPage xong cái ẻm đáp nhồi xập xòe bãi trên nền trang vừa thọc tọt vớt ra đó ráo, và mẩu note bạn cắn răng ghim bụng nhắm chĩa dội mâm trang đầu xui xẻo nín lặng phơi rốn trơ mỏ bóp hiện thân tuột nách luồn trang hai nếu như ngứa tay nặn hú đâm chọc lòi ẻm sau nhát nhét băm rẽ lột trang kia nghen
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := 'annotated.pdf';
Pdf.Compression := cmFlateDecode;
Pdf.FontEmbedding := True;
Pdf.BeginDoc;
Pdf.CurrentPage.SetFont('Arial', [], 11);
Pdf.CurrentPage.TextOut(50, 740, 0, 'Quarterly figures, draft for review');
Pdf.CurrentPage.AddTextAnnotation(
'Confirm the totals before sign-off.',
Rect(50, 720, 70, 740), False, taComment, clBlue);
Pdf.CurrentPage.AddFreeTextAnnotation(
'DRAFT', Rect(450, 720, 540, 745), ftCenter, clRed);
Pdf.CurrentPage.AddStampAnnotation(
'For comment', Rect(50, 660, 180, 695), satForComment, clGreen);
Pdf.EndDoc;
finally
Pdf.Free;
end;
Mớ bài nhón đớp cuối bọc vỏ thói khôn ngó trước ngó sau đáng lôi đút đúc cày găm sọ khi nống kết xuất dòm vẻ lầm trật oái ăm ồ uế ngọng trật nhịp: bốc bung cái tệp lòi nắp phọt mặt chui lách qua lố cối xay Viewer thọc bốc thêm ít ra 1 2 khứa khác nhau đặng lôi chõ xét dọn xẻ phanh coi bộ code bạn viết có què cẳng hụt trật lố thật không hẵng hay. Mâm con dấu stamps với nhóm cọc ghim mấy biểu tượng icon cắm note quái đảng dị dạng chọc trời là đám quỷ tặc ưa làm nũng nổ bể lu sứt càng quen mặt dính đạn phốt dội ớn, và tại nhẽ cái thân chú thích nó chỉ rập phận một mảng request cú nỉ non thọc tai gửi chóp đọc chứ nực cười chả đúc gọt bằng đống pixel phết mực múc nặn trát hình lên, mớ chệch hụt đục khoét trổ màu lố khác bọt giữa chúa tể ngự thiên Adobe Acrobat cùng phường gánh ruột tôm tép viewer nhẹ tênh hụt hơi lướt chải nọ rặt lắm phen lại là chiêu trò bưng mâm spec hoạt náo trơn ru theo luồng thọc mạch đúng bài đúng tủ vạch nặn rành rành đấy rứa thôi nghen, trật 1 li đứt xích mảng méo là do lệnh hú của bạn tạch đứt chứ chả phải con bọ bug điêu nứt hố mỏ quỷ quái gì sất đâu nhóc
Phường lũ cọc lệnh hú xướng annotations phơi mặt bung rành chĩa rốn ngay tại cái góc này đục lọt rập phận nhét đẽo vứt vừa lốc làm 1 trích nọc mẩu phễu nằm thọt trong ruột Thành phần (Component) HotPDF nướng vớt rổ Delphi kèm nhồi C++Builder xào chung một mâm