PDFium nổi danh là cỗ máy vạch trình soi văn đọc tệp ngắm xem ảnh trình lướt duyệt tệp (viewer engine), khối mảng lọng toạ ghim mác dóng đục trình hiển diễn quệt vẽ nặn hoạ trổ (renderer) ẩn lọt núp phía sau lưng mác uỷ trang tab PDF nải của anh bạn trình Chrome, thế nải ngỏ nên dóng lọng bộ điều thứ 1 vạch nấc nhất nải mác ghim hất tuôn phanh bung vạch rành cần xọc rọi vén trong thấu sáng (clear up) nải ngỏ ẵng đai là Component PDFium tịnh hẵng ngỏ rành lọng đai cũng sành điệu dư rẽ dóng đai có thể móc nặn cháp vạch nảy uỷ lên một dóng nải tài tệp văn hẵng trơn lủi trống hơ trống hoác chưa từng rành từng đai tồn vạch đai sinh tại hẵng sinh ra rẽ lọng đai (never existed before). Bộ tác đai phả toạ tạo giả này kẹp nới ghim uỷ nải vạch trùm API mô hệ vạch dóng vật khối trang (page-object) nải đai của PDFium: lọng đai bạn trổ rạch ngỏ nặn trơn trống một đai tài tệp văn rạch lọng ngỏ ngạch mác đai nấc mới mẻ, móc nải rẽ gác trang gắn rành dóng khất kèm kích cỡ dóng vạch rẽ cự khổ đích danh rõ ràng, xong nải quệt đánh vạch rạch vứt thả đai nải nhả rớt khối văn bảng text, mảng ngạch vector, cùng mớ nhành ghim lọng rẽ mác hất ngỏ dóng vạch hình toạ rạch đai ảnh lên trên gã nải chóp từng trang tại những cự vạch ngỏ móc chóp điểm toạ hất rẽ ngỏ đai mà bạn đích thân đai rành vạch lọng nải ngỏ chọn. Tịnh trơn trơn chẳng có chi thứ gì kiểu vạch đai ngỏ nải ghim trượt dạng như bộ mác ngỏ ngạch ngỏ ngôn lọng trổ lệnh dóng ngôn nải từ dóng diễn tả trang chi sất rẽ hẵng phả thòi rạch (page description language) đặng lọt ngỏ đai phả phải hì hụi mà rạch học cho biết lọng nải với cũng dóng vạch tịnh sút mất gã đai trình điều bộ đai lọng hất vạch phả cắm (print driver) trong bệ vòng ngỏ ngạch vạch lặp. Bộ mác ngỏ bạn phả chỉ việc dóng gọi lọng hất các phương vạch thức đai, rồi gã ngỏ thư viển kia tự móc xọc đai nải lọng trút rẽ chắp ráp dóng những cự vật PDF, xong bệ lệnh dóng SaveAs trút rớt rành nải ghim móc kết qủa đai nải ngỏ vạch lên thành lọng chuỗi rạch nải trượt phả chuỗi (serializes) đi thôi
Điều mà bạn không nhận được là một công cụ dàn trang. Điều này đủ quan trọng để nói trước, vì nó định hình cho mọi ví dụ bên dưới. PDFium Component đặt nội dung ở nơi bạn yêu cầu, theo tọa độ tuyệt đối và không ở đâu khác. Nó sẽ không ngắt dòng đoạn văn, không chuyển nội dung văn bản qua ngắt trang, cũng không tính toán bảng từ các hàng và cột. Đó là công việc của bạn. Nếu bạn đến với mong đợi một thứ gì đó sắp xếp lại văn xuôi giống như cách một trình xử lý văn bản thực hiện, hãy cân chỉnh lại ngay bây giờ: đây là một API sắp đặt vị trí ở mức độ thấp, chính xác, gần với việc vẽ trên khung tranh canvas hơn là sắp chữ một tài liệu. Đối với các hóa đơn, chứng chỉ, nhãn mác và các trang báo cáo được tạo ra, nơi bạn đã biết mỗi phần tử thuộc về đâu, độ chính xác đó chính xác là những gì bạn muốn
Mức tối thiểu để tạo ra một tệp
Ba lệnh gọi nằm giữa một TPdf trống và một tệp PDF được lưu: tạo tài liệu, thêm trang, ghi nó ra. Mọi thứ khác là nội dung bạn xếp lớp ở giữa
uses
Vcl.Graphics, // for clBlack and TColor
PDFium; // TPdf lives here
procedure CreateBlankPdf(const FileName: string);
var
Pdf: TPdf;
begin
Pdf := TPdf.Create(nil);
try
Pdf.CreateDocument; // empty in-memory document
Pdf.AddPage(0, 595, 842); // A4 portrait, in points
Pdf.AddText('First page', 'Arial', 18, 50, 780);
Pdf.SaveAs(FileName); // serialize to disk
finally
Pdf.Active := False;
Pdf.Free;
end;
end;
Một chi tiết khiến những người từng thấy các đoạn mã cũ hơn bối rối: bạn không gán Pdf.Active := True sau CreateDocument. Thuộc tính Active báo cáo xem một trình xử lý (handle) tài liệu có tồn tại hay không, và CreateDocument đã tạo một trình xử lý rồi, do đó thuộc tính này là True vào thời điểm lệnh gọi đó trả về. Việc thiết lập lại nó tốt nhất là một thao tác vô ích và tệ nhất là gây hiểu lầm cho người đọc tiếp theo. Active phát huy tác dụng khi kết thúc: gán False sẽ giải phóng tài liệu nền tảng trước lệnh Free, đây là trình tự dỡ bỏ (teardown) dọn dẹp gọn gàng. Hãy coi CreateDocument và việc mở để tải tệp là hai hành động loại trừ lẫn nhau. Thư viện từ chối tạo một tài liệu mới trên một TPdf đã có một tài liệu đang mở, vì vậy việc sử dụng lại có nghĩa là phải đóng tài liệu hiện tại trước tiên
Tọa độ bắt đầu ở phía dưới cùng bên trái
Cặp đối số thứ hai cho AddText và cho mọi lệnh gọi sắp đặt vị trí, là một điểm trong không gian người dùng PDF. Gốc tọa độ nằm ở góc dưới cùng bên trái của trang, X chạy sang phải và Y chạy lên trên. Một đơn vị là một điểm, bằng 1/72 inch, do đó một trang A4 có kích thước 595 x 842 đơn vị và US Letter là 612 x 792. Trục Y hướng lên trên đó là nguồn gốc phổ biến nhất gây ra sự nhầm lẫn "văn bản của tôi nằm ngoài trang", vì tọa độ màn hình và bitmap đặt gốc tọa độ ở trên cùng với Y tăng dần hướng xuống. Trên một trang cao 842 điểm, một tiêu đề gần đầu trang nằm ở khoảng Y 780, chứ không phải Y 60. Khi một chuỗi ký tự rơi vào vị trí không mong muốn, chiều cao của trang trừ đi giá trị Y của bạn hầu như luôn là con số bạn thực sự muốn định vị
AddPage lấy vị trí chèn làm đối số đầu tiên của nó, được biểu thị dựa trên cơ sở 1 (one-based), với 0 là phím tắt tiện lợi cho "điểm bắt đầu của tài liệu". Truyền 0 hoặc 1 cho trang đầu tiên và trang được chèn ở phía trước; truyền giá trị khớp với số lượng đếm (count) mà bạn đang gắn thêm (appending) vào để thêm ở cuối tài liệu. Trang mới được thêm vào cũng trở thành trang hiện hành, mục tiêu của những lời gọi vẽ tiếp theo, vì vậy không cần bước riêng biệt để "chọn trang này" (select this page) sau khi thêm nó. Nếu bạn thêm một vài trang và sau đó cần vẽ lại trên trang trước đó, hãy thiết lập PageNumber để di chuyển con trỏ; trong khi bạn đang lấp đầy các trang theo thứ tự khi tạo chúng, bạn có thể để nguyên như vậy
Viết văn bản và quy tắc phông chữ gây lỗi trong im lặng
Cấu trúc chữ ký (signature) của AddText mang theo mọi thứ mà một đoạn chạy duy nhất cần: chuỗi ký tự, tên phông chữ, kích thước tính bằng điểm (points), điểm neo X và Y, sau đó là màu sắc tùy chọn, byte alpha để kiểm soát độ trong suốt và góc xoay tính bằng độ
procedure WriteHeader(Pdf: TPdf; const Title, Author: string);
begin
// Title in black, default opacity, no rotation
Pdf.AddText(Title, 'Arial', 20, 50, 780);
// A lighter byline 24 points below it
Pdf.AddText('By ' + Author, 'Arial', 11, 50, 756, clGray);
// A faint diagonal draft stamp across the page
Pdf.AddText('DRAFT', 'Arial', 64, 180, 380, clGray, $30, 45.0);
end;
Giá trị alpha byte chạy từ $00 (vô hình) đến $FF (mờ đục), đây là điều tạo nên một bản nháp mờ (draft stamp) đóng vai trò là một hình mờ (watermark) chứ không phải là một khối rắn chắc: $30 tương đương khoảng mười chín phần trăm độ mờ đục, đủ để đọc xuyên qua. Tham số góc sẽ xoay dải văn bản ngược chiều kim đồng hồ quanh điểm neo của nó, vì vậy 45 độ mang lại kiểu đóng dấu vắt chéo từ góc này sang góc kia cổ điển. Không có tính năng nào trong số này cần một tính năng hình mờ riêng biệt. Hình mờ thực chất chỉ là một lời gọi AddText xoay, cỡ lớn, bán trong suốt và việc vẽ nó trước hay sau phần thân (body) sẽ quyết định nó nằm phía sau hay nằm trên cùng của nội dung
Phông chữ xứng đáng có một câu cẩn thận, bởi vì chế độ lỗi của nó xảy ra trong im lặng. Khi bạn truyền một tên phông chữ, Component PDFium yêu cầu hệ điều hành cung cấp dữ liệu TrueType của phông chữ đó và nhúng nó vào trong tài liệu, đó là lý do tại sao một tệp được tạo trên máy của bạn kết xuất giống hệt trên một máy chưa từng cài đặt phông chữ đó. Vấn đề nằm ở chỗ sẽ xảy ra chuyện gì khi tên không giải quyết được (resolves): một lỗi đánh máy, hoặc một kiểu chữ đơn giản là không có trên máy xây dựng mã. Không có ngoại lệ nào được đưa ra. Thư viện quay lui (falls back) về việc tạo một đối tượng văn bản chỉ mang cái tên đó như một nhãn, không nhúng bất cứ thứ gì và để trình xem (viewer) tự thay thế bằng bất kỳ thứ gì nó cho là gần giống. Văn bản sẽ xuất hiện trong các bài kiểm tra của bạn, có vẻ hợp lý và làm thay đổi số đo hoặc các biểu tượng ngay tại thời điểm tệp mở ra ở một nơi có cài đặt các phông chữ khác. Hãy sử dụng các tên mà bạn biết chắc có mặt trên máy đang sinh tệp, xem danh sách phông chữ như một phần phụ thuộc khi triển khai (deployment dependency) và mở tệp mẫu bằng một trình xem trên một hệ thống sạch trước khi bạn tin tưởng vào đầu ra
Hình dạng vector: xây dựng đường dẫn, sau đó xác nhận (commit) nó
Các đường thẳng, hình chữ nhật và các vùng được lấp đầy (filled regions) đều đi qua một đường dẫn (path). Bạn mở một đường dẫn với CreatePath, thiết lập điểm bắt đầu và tất cả các kiểu dáng cùng một lúc, từ chế độ tô, màu tô và màu đường viền (stroke) cùng các byte alpha riêng, độ dày đường viền, cho đến cách bo đầu (line caps) và góc nối (joins) của đường thẳng. Sau đó, bạn kéo dài đường dẫn đó bằng LineTo, BezierTo và ClosePath, và cuối cùng AddPath sẽ xác nhận (commits) đường dẫn đã hoàn thiện lên trên trang giấy. Bước xác nhận rất dễ quên và sẽ không tạo ra bất cứ hình thù nào nếu bạn bỏ qua nó
procedure DrawDivider(Pdf: TPdf; X, Y, Width: Single);
begin
// A thin horizontal rule. The rectangle overload sets a box directly:
// X, Y, Width, Height, then fill mode and colors.
Pdf.CreatePath(X, Y, Width, 0.5, fmNone, clBlack, $FF,
True, clBlack, $FF, 1.0);
Pdf.AddPath;
end;
procedure DrawTriangle(Pdf: TPdf);
begin
// Point overload: start at the first vertex, line to the rest, close.
Pdf.CreatePath(200, 300, fmWinding, clBlue, $80, True, clNavy, $FF, 2.0);
Pdf.LineTo(300, 300);
Pdf.LineTo(250, 400);
Pdf.ClosePath;
Pdf.AddPath; // nothing is drawn until this runs
end;
Hai kiểu quá tải (overloads) bao hàm các trường hợp phổ biến. Biểu mẫu có bốn tọa độ nhận vào các giá trị X, Y, chiều rộng, chiều cao và cung cấp cho bạn một hình chữ nhật căn chỉnh theo trục tọa độ (axis-aligned rectangle) chỉ trong một lệnh gọi, đây là thứ bạn thường dùng tới để vẽ một đường phân cách (rule), đường viền cho ô lưới, hoặc nền của khung bản (background panel). Biểu mẫu hai tọa độ chỉ nhận điểm bắt đầu, và bạn phải tự lần theo phần còn lại của đường viền (outline) với LineTo và BezierTo. Tham số chế độ tô quy định cách những vùng lấp đè lên nhau sẽ được vẽ màu ra sao: fmWinding (winding khác 0) phù hợp với hầu hết các hình thể khối đặc nguyên khối (solid shapes), fmAlternate (chẵn-lẻ) xử lý tốt phần rãnh khoét (cutouts) hoặc đường viền tự giao cắt (self-intersecting outlines), còn fmNone giữ lại một đường vẽ viền trống không mà không cần tô màu, giống y như đoạn mã vẽ đường chia DrawDivider ở phía trên sử dụng
Các bảng bao gồm đường dẫn và văn bản, được lắp ráp thủ công
Bởi vì không có yếu tố bảng nguyên thủy, một bảng là một vòng lặp. Bạn quyết định độ lệch tọa độ X (X offsets) của các cột và chiều cao của hàng, viết từng ô (cell) bằng AddText và vẽ các đường phân cách bằng các đường dẫn hình chữ nhật. Việc tính toán là của bạn, nhưng nó khá rõ ràng và khi đã viết, nó có thể tổng quát hóa cho bất kỳ lưới (grid) nào bạn cần
procedure DrawTable(Pdf: TPdf; Left, Top: Double);
const
ColX: array[0..2] of Double = (0, 110, 210); // column offsets
RowH = 20;
var
Y: Double;
Row: Integer;
begin
// Header row
Pdf.AddText('Item', 'Arial', 10, Left + ColX[0], Top);
Pdf.AddText('Qty', 'Arial', 10, Left + ColX[1], Top);
Pdf.AddText('Price', 'Arial', 10, Left + ColX[2], Top);
// Rule under the header
Pdf.CreatePath(Left, Top - 5, 260, 0.5, fmNone, clBlack, $FF);
Pdf.AddPath;
// Data rows, stepping Y downward each iteration
Y := Top;
for Row := 1 to 3 do
begin
Y := Y - RowH;
Pdf.AddText('Item ' + IntToStr(Row), 'Arial', 9, Left + ColX[0], Y);
Pdf.AddText(IntToStr(Row * 2), 'Arial', 9, Left + ColX[1], Y);
Pdf.AddText('$' + IntToStr(Row * 10) + '.00', 'Arial', 9, Left + ColX[2], Y);
end;
end;
Hãy chú ý đến giá trị Y giảm dần theo chiều cao của hàng ở mỗi lần duyệt qua, một lần nữa là vì đi lên phía trên có nghĩa là số dương. Đây cũng là nơi việc thiếu vắng chức năng đo kích thước chữ được bộc lộ rõ nhất: chả có gì kìm bước nổi một cái tên sản phẩm dài ngoằn bị đẩy lọt trào qua cột hàng kế tiếp cả, tại thư viện có biết đếch gì về khoản bề ngang (width) của chuỗi văn (string) hẵng đã in (rendered) ra kích thước nhiêu đâu cơ chứ. Đối với đầu ra có định dạng cố định nơi bạn kiểm soát dữ liệu, bạn cần định cỡ các cột một cách rộng rãi và tiếp tục. Đối với nội dung biến đổi thực sự, bạn có thể hạn chế các yếu tố đầu vào hoặc tự đo chiều rộng ký tự (glyph widths) trước khi đặt chúng, đó là lúc mà một thư viện dàn trang (composition library) chuyên dụng bắt đầu đáng giá
Hình ảnh và nhiều trang
Nội dung mảng điểm đồ hoạ điểm phơi (raster) sẽ được rinh rắc nhồi vạch gọi xách luồn nhét cài vô đai ngỏ đi phả ghim nải chóp thông đai phả rạch trượt xuyên tuốt qua gã phụ tác bộ uỷ rẽ (helpers) cho khoản đai dóng đai ngỏ mục đai nhãn mác đai rạch nhấp ảnh lọng hình. AddPicture vác phanh đai ngỏ vớt rạch uỷ tóm bứt lột dóng 1 thằng TPicture hẵng phả trượt ngỏ nải gác dóng ẵm mác cháp nạp (loaded) vô rạch đai nải mâm đai ngỏ đống lợp với lượm dóng ngỏ vứt dóng quăng hất mác thả cái vạch rạch bệ ngỏ hình uỷ phả lọng nải rẽ đó vạch uỷ vào ngỏ rạch bám 1 ngạch đai chóp chấm đai ngỏ móc chóp điểm toạ ngỏ mác với 1 kích nải cự độ dóng vạch rạch uỷ chóp bệ phân bề ngang đai mác uỷ lọng dóng cùng cao rạch dóng phả đai vạch chiều hòng tự phả dóng ngỏ rẽ gã quyết rạch đai dóng đai thu mảng nải ngạch phả dóng ngỏ kéo ép đai mác rạch lọng hất vạch (scale) đi tuỳ trượt lọng rẽ mác dóng đai toạ định mức kích ý (optional); AddImage nải ngỏ thảy hẵng gật uỷ rẽ rạch đai rinh móc vác chấp lấy đai lọng một phả ngỏ rạch uỷ dóng con đai vạch uỷ rẽ nhánh lối mác đai nải vạch đường nhành dóng mảng phả mác ngỏ vạch ngạch uỷ rẽ tệp chi lọng vạch ngỏ rạch bọc đó tuốt đai nải lọng hoặc nải đai gác một ngạch TBitmap thảy hẵng rành ngỏ mạch đi vạch nải lọng dóng thẳng trực rẽ ngỏ phả tiếp uỷ mác luôn đai ngỏ nải, rồi thằng dóng AddJpegImage tuôn phả dóng vạch rạch vớt đai nải tạt rạch dóng dãi thảy vạch đai uỷ mác luồng gã byte đai ngỏ dóng uỷ rẽ ngạch nải phả cuộn dòng luồng vạch đai ngỏ dóng gã JPEG mác nải uỷ dóng hẵng chằng vạch ngỏ dóng phả rạch rẽ cần trượt phả uỷ lọng vạch đi lượn rẽ nải lọng mác dóng uỷ phả vòng ngỏ lọng 2 mác đai vạch lượt nải dóng vạch uỷ phả rạch bốc đi ngỏ lại phả dóng vòng ngỏ đai đâm vòng (round trip) xuyên ngỏ đai mác phả rạch trượt nải dóng uỷ đai qua một bệ mác rạch lọng ngỏ dóng vạch uỷ đai TBitmap đai ngỏ chóp vạch rạch làm gì sất. Bệ y lọng đai dóng mác nải ngỏ đai rạch như thảy rành tuốt lọng vạch mớ mọi bệ thứ việc phả lọng rẽ chi xước ngỏ dóng đai nải mác khác thôi, bệ toạ móc uỷ rạch dóng ngỏ đai vạch mục toạ chóp độ (placement coordinates) đai phả hất uỷ nải vạch thả rơi toạ đai vẫn rành lọng hẵng đai vạch nải y nguyên đai dóng uỷ rẽ vạch cái ngỏ đai mác chóp lọng rẽ nải góc trệ đai ngỏ dóng rạch hất ngỏ vạch thấp đai mác rẽ mé lọng đai vạch rạch nải tả ngỏ rẽ bên uỷ đai dưới (lower-left corner) chóp của ngỏ lọng mảng phả đai tấm vạch uỷ ngỏ rạch hình nải trong ngỏ đai hất uỷ rẽ vạch trượt mâm lọng cái gã đai nải vạch ngỏ toạ gian đai không dóng rạch mác nải của rẽ phả nải gã khách ngỏ xài đai nải đai dóng vạch vóc đai rẽ bệ này (user space), mớ chiều bệ ngang đai uỷ dóng vạch rạch với cao đai phả mác ngỏ rẽ đai dài nải vạch đó đai nải hẵng dóng vạch rạch uỷ ngỏ chính đai ngỏ là cự phân độ vạch rẽ đai ngỏ vóc thước đai chóp nải bộ mác rạch toạ gác (size) lọng nải phả đai vạch của mảng hình trên phiến dóng ngỏ đai rạch lọng mặt vạch uỷ nải ngỏ trang phả đai dóng đai vạch (on-page) vạch đai nải đai phả cự vạch ngỏ phân độ chóp ngỏ đai bằng ngỏ uỷ rẽ dóng đai gã mác lọng vạch điểm đai nải uỷ ngỏ, rạch phả dóng chớ đai nải ngỏ ngạch hẵng uỷ rẽ mác không phải nải lọng vạch rạch đai dóng hệ phả toạ ngỏ bộ rẽ đai kích cự vạch nải dóng ngỏ lọng ngạch đai mác điểm uỷ (pixel dimensions) nải lọng vạch đai ngỏ dóng phả vạch của đai bộ chóp gã ngỏ rạch rẽ nải mác nguồn gốc dóng ngỏ đai
procedure CreateMultiPageReport(const FileName: string; PageCount: Integer);
var
Pdf: TPdf;
P: Integer;
begin
Pdf := TPdf.Create(nil);
try
Pdf.CreateDocument;
for P := 1 to PageCount do
begin
Pdf.AddPage(P, 595, 842); // append; the new page becomes current
Pdf.AddText('Page ' + IntToStr(P) + ' of ' + IntToStr(PageCount),
'Arial', 10, 50, 30); // footer near the bottom edge
// ... draw this page's body here ...
end;
Pdf.SaveAs(FileName);
finally
Pdf.Active := False;
Pdf.Free;
end;
end;
Một tài liệu gồm nhiều trang là một mảng khối uỷ trơn đai phân ngỏ rạch rẽ trượt 1 lọng đánh lằng ngỏ đai tờ phả dóng nhành lóng mẫu (single-page pattern) được đai bọc hất vạch chạy trượt ngỏ lọng lẩn uẩn kẹp quẩn quanh cuộn uỷ đai lặp lọn rạch đi dạo lại ngỏ (in a loop). Dóng mỗi 1 mác một phát thò lệnh nải rạch dóng nấc gọi AddPage ngỏ nải sẽ hất ngỏ phả trượt ngỏ dóng cắm dính cài thêm (appends) vào đai nải ngỏ 1 mảng dóng phiến tờ phả nải trang đai hất uỷ nải mới mác vạch rồi uỷ đai phả luân tráo đổi dời gác đẩy hất (makes) ngỏ đai chính mác uỷ trang ấy ngỏ đai lên dóng rạch toạ gác nải bệ của mặt trang hiện đai thời phả vạch rạch nải trồi nấp hiện nay ngỏ (current), đặng đai mà mớ nải lọng phần thân đai (body) với nấc ghim chóp rạch chân phả ngỏ nải trang (footer) đai rạch dóng bạn xọc thò đai vạch bôi quệt nặn (draw) uỷ lọng dóng nải kế ngỏ rẽ đến đai vạch ngỏ dóng (next) nải đai thả sẽ rớt rụng nải ngỏ dóng đáp lọt trúng rành đai ngay nải ngỏ rạch chóc vạch vào đai ngỏ rẽ lọng cái phiến đai dóng vạch trang rạch mác mà bạn ngỏ nải vạch đai hẵng uỷ rẽ vừa nải mới thêm ngỏ vạch đai vô nải ngỏ ngạch chóp phả đó ngỏ rạch. Tịnh trơn trượt đai nải bạn chẳng hề dóng ngỏ vạch phả nải gác ngỏ dóng nải cần vạch lại (reassign) đai phả mác lọng vạch ghim uỷ nải thằng dóng rẽ PageNumber dóng đai ngỏ vạch nải lót rúc ấp đai nải uẩn ở ngỏ đai trong rạch đai vạch cái lòng ngỏ dóng vạch của gã đai nải vạch vòng phả cuộn (loop) đai nải này sất trơn đâu cơ ngỏ, do bệ nguyên cớ đai ngỏ vì vạch nải công nải việc đai vạch ngỏ đâm thêm cài ngỏ vạch chóp đai nhét dóng vô 1 cái nải ngỏ mặt trang rẽ (adding a page) nải ngỏ phả đai vạch hẵng đã tự uỷ rẽ đai ngỏ động hất đai vạch dóng vác cuộn dời (moved) cục đai vạch trỏ con đai nải chuột rạch ngỏ vạch (cursor) dóng phả tuôn tọt ngỏ đai lọt đáp nải ngay về đai nải tới toạ bệ vị ngỏ đai rạch đó ngỏ nải đai phả rồi (there); bạn nải ngỏ chỉ trích lọng dóng mác cần rẽ uỷ dóng phả ngỏ ngạch dùng vạch lọng gọi đai nải ngỏ tới gã đai PageNumber nải ngỏ vạch phả lọng hễ rạch mác nải ngỏ khi dóng ngỏ bứt vạch mà ngỏ bạn ngỏ đai vạch lọng hất đi vạch ngỏ rạch giật lùi thối ngược (go back) đai ngỏ dóng phả vạch về lại đai nải ngỏ 1 gã đai phiến trang nải ngỏ vạch nào dóng ngỏ đai rẽ đó đai nải vạch dóng hất đánh ngỏ vạch lọt lạc rẽ trôi nải ngỏ đai mác văng sút ra khỏi (out of) ngỏ bệ cái vạch trật dóng ngỏ đai nải tự nải rẽ phả vạch cất nặn nhào (creation order) dóng đai ngỏ vạch thôi. Thò ngỏ gõ dóng vạch phả 1 hất cú đai nải SaveAs ngỏ rẽ phả một nải đai lần dóng ngỏ duy vạch nải nhất ngỏ đai dóng phả tại điểm mốc ngỏ lọng cuối (at the end), sau dóng đai bệ vạch hồi mà lọng mảng phả ngỏ phiến dóng trang mác nải rẽ chót vạch (last page) ngỏ dóng phả đai vạch đai đã rành đai vạch ngỏ được lót uỷ dóng vạch phủ đầy (filled). Giả hễ uỷ rẽ nải bạn khát ngỏ rạch vạch thèm lọng dóng nải có 1 gã ngỏ vạch cắm lọng dóng ngạch rẽ mác bộ đai nải ngỏ 1 mảng hồ vạch dóng sơ ngỏ vạch đai (profile) phả lọng ngỏ dóng nải hòng đặng đai nải vạch mác chuyên dùng lọng phả nải dóng vạch để lưu đai ngỏ cất uỷ nải (archival) đai ngỏ nải thế chóp vạch rạch nải ngỏ chỗ chắp vạch nải lọng cho phả một đai nải cái cuốn tài tệp dóng rạch ngỏ vạch trơn thông nải (plain file), đai thì đai dóng mác ngỏ cũng rành cùng đai vạch 1 lọng mác đối vật nải tài ngỏ văn (document object) vạch dóng nải nọ đai ngỏ phả hất dãi đai ngỏ phơi vạch lọng SaveAsPdfA đai dóng cùng lọng mớ nải đai phả mác gã biến vạch dóng nải bộ thể phả ngỏ đai tuân chuẩn dóng mác rạch (conformance variants) rẽ dóng đai khác nải, thế nải đai vạch nên lọng ngỏ mảng quyết định uỷ nải vạch lựa chọn (choice) nải ngỏ dóng bệ quy vạch chóp (standard) đai ngỏ xuất hất đai phả lọng nải ngỏ (output) ngỏ vạch dóng nải là 1 gã uỷ rẽ gọi lưu (save call) rạch đai nải ngỏ khác vạch rẽ (different), phả đai rạch chớ đai nải hỏng vạch dóng ngỏ đai ngạch rẽ phải lọng nải là dóng ngỏ một ngạch đai nải bộ ngỏ đai vạch lối mòn đường nhánh rạch (build path) đai vạch lọng ngỏ khác nải
Phù hợp để ứng dụng ở đâu
Điều thẳng thắn nhất là API tạo tác của Component PDFium là một lớp bao bọc mỏng, trung thực dựa trên mô hình đối tượng trang của PDFium: tạo tài liệu thực, nhúng phông chữ thực, nội dung raster và vector thực, được tuần tự hóa thành một tệp tuân thủ tiêu chuẩn. Nó không phải là, và không giả vờ là, một công cụ tài liệu có khả năng tự động điều chỉnh bố cục (reflowing document engine). Ranh giới phân chia nằm ở khâu dàn trang (text layout). Nếu đầu ra của bạn được tạo theo mẫu định sẵn (templated), như hóa đơn, chứng chỉ, nhãn mác, bảng điều khiển được kết xuất theo một lưới cố định, thì mô hình tọa độ tuyệt đối này rất trực tiếp, nhanh chóng và mã vẫn dễ đọc. Nếu đầu ra của bạn là văn bản dài cần tự động ngắt dòng và phân trang, thì bạn sẽ phải xây dựng lại một công cụ dàn trang dựa trên các hàm gọi này, và đó là công cụ sai lầm cho công việc này. Việc biết mình đang ở bên nào của ranh giới đó chính là phần quan trọng nhất của quyết định
Các phương thức khởi tạo được mô tả ở đây là một phần của Component PDFium cho Delphi, kết hợp đường dẫn tạo tác này với các tính năng kết xuất và trích xuất văn bản mà PDFium đã nổi tiếng hơn