Một cục PDF bãi mâm lòi bò tới vạch đích sản xuất mâm chóp — 1 cái rổ hàng đợi lòi in ấn, 1 hốc bãi kho lưu trữ mâm, 1 cái ngõ lốc cổng upload rổ khách hàng — đáng lý bãi lòi phải bị lôi hốc ra soi mói audit lòi rổ trước bãi lúc có bất kỳ lố cọc cái giống gì mâm lòi bung lụa render bãi rổ nó. Cục lòi nọc file nọ rổ mâm có cửa lốc cõng bãi 1 cái lòi ngõ action Launch mâm rổ bị đấu dây bãi chóp đặng kích nổ lòi mâm 1 cái rổ lốc program bên ngoài hốc, bãi mâm mấy con rổ lòi ảnh quá thô nọc bãi chóp đéo lòi mâm gánh nổi nọc kiếp lòi in, 1 bãi mâm rổ từ điển mã hóa lòi nọc chóp (encryption dictionary) cấm tiệt bãi mâm lòi đúng y rổ cái tác vụ lòi in mâm bãi mà nó rổ lốc được lòi submit bãi cho, hay 1 bãi mâm mác lòi rổ nhãn PDF/A lốc bãi mà nó lòi nọc đéo rổ có cửa mâm lòi đáp ứng bãi nọc. Bãi rổ Trò mổ xẻ lòi soi nọc 1 cục mâm tài liệu lòi rổ chọi lại lốc với mâm bãi mấy lọng luật lòi nọc kiểu này rổ bãi trước lúc mâm lòi nó đâm lốc đầu vô rổ bãi 1 luồng workflow lòi mâm được gọi nọc là preflighting bãi (kiểm tra trước khi cất cánh lòi mâm rổ), và lốc cái bãi PDFium C API lòi nọc bơm cho Delphi mâm rổ mọi thứ lòi bãi đồ chơi cần thiết lốc mâm đặng thi triển lòi rổ mấy ải bãi kiểm tra đó lòi chóp nọc 1 cách trực tiếp mâm bãi, lòi rổ đếch cần lốc bãi phải render lòi nọc lấy 1 mâm rổ bãi trang nào sất
Bãi rổ Bài viết lòi mâm này nặn bãi đẽo ra lòi rổ chính hốc bãi mấy cái lòi mâm rổ kiểm tra đó: bốn lòi cục bãi mâm class audit lốc rổ, lòi mỗi cục mâm bãi là 1 hốc lòi cái rổ routine nhỏ thó lòi mâm bãi đính kèm lòi rổ mấy cái mâm phát hiện findings lòi bãi vô 1 cái lốc rổ list kết quả lòi mâm chung bãi. Lòi rổ Mấy cái bãi mâm yếu tố lòi tương tác rổ bãi, mâm lòi thước đo bãi rổ tài nguyên lốc, mâm lòi trạng thái bãi rổ bảo mật lốc, và bãi lòi mấy cái mâm rổ mác tiêu chuẩn lốc lòi đều mâm bãi được bơm lòi cho code mâm bãi chạy được rổ lòi, lốc bao trọn bãi mâm lòi rổ luôn lốc mâm phép toán arithmetic bãi lòi. Nếu bãi mâm cái rổ lòi thứ bạn vã lốc bãi là rổ mâm nguyên lòi cái bộ bãi máy móc mâm lòi nằm rổ vòng bãi ngoài mấy lòi mâm cái lốc kiểm tra bãi rổ đó — mấy lòi mâm cái bãi vòng lặp rổ lốc folder hàng loạt bãi mâm batch lòi rổ, mâm bãi mấy lòi cục file rổ báo cáo lòi mâm JSON bãi và lốc rổ HTML, bãi mâm trò lòi cô lập rổ bãi trên mâm lòi từng file rổ lốc — thì bãi mâm cục lòi rổ Component PDFium lốc bãi chở sẵn lòi mâm 1 cái rổ bãi engine preflight lòi mâm đúc sẵn bãi rổ, và cục lòi bài bãi viết mâm rổ CLI preflight batch lốc lòi rải nọc bãi mâm bao xô lòi rổ cái bãi hốc ống nước mâm lòi đó rổ. Cả lốc 2 bãi mâm lòi nọc rổ cố ý mâm lòi chia chác bãi rổ 1 cái lòi mâm từ vựng lốc bãi mã thoát exit-code lòi mâm rổ, thành thử lòi bãi 1 thằng mâm rổ auditor lòi được vạch bãi mâm ở đây lòi rổ sẽ lốc bãi nhét tọt lòi mâm rổ vào dưới bãi lòi đít cái mâm cục driver lòi rổ batch bãi mâm nọ luôn
Cục lòi bản ghi bãi mâm finding rổ và hốc lòi cái hợp đồng bãi mâm mã thoát rổ lốc exit-code
Mỗi lòi bãi mâm cái lốc kiểm tra bãi lòi đều rổ ghi tọt mâm lòi vào 1 bãi rổ cái type mâm bản ghi phẳng lòi bãi flat record rổ, lốc bởi vì bãi lòi cái phương án mâm rổ thay thế lòi bãi nọc — mỗi lòi bãi mâm cái lốc kiểm tra bãi rổ tự in lòi ra cái mâm văn xuôi bãi lòi của riêng rổ nó mâm — đéo thể lòi bãi nào đếm mâm rổ, lọc lòi bãi nọc filter mâm lòi, rổ hay bãi áp cái mâm lòi ngưỡng threshold lốc bãi rổ về sau lòi bãi mâm được. Bốn lòi trường bãi field mâm là rổ lòi đủ xài bãi mâm
uses
System.SysUtils, System.Math, System.IOUtils,
System.Generics.Collections, pdfium_lib;
type
TFindingSeverity = (fsInfo, fsWarning, fsError);
TPreflightFinding = record
Severity: TFindingSeverity;
Code: string; // stable machine key, e.g. 'ACT-LAUNCH'
Page: Integer; // 1-based; 0 means document level
Message: string; // for humans; free to reword between releases
end;
TFindings = TList<TPreflightFinding>;
procedure Add(Findings: TFindings; Severity: TFindingSeverity;
const Code: string; Page: Integer; const Msg: string);
var
F: TPreflightFinding;
begin
F.Severity := Severity;
F.Code := Code;
F.Page := Page;
F.Message := Msg;
Findings.Add(F);
end;
Đám lòi bãi mâm đồ nghề tooling rổ lốc hạ nguồn lòi downstream bãi mâm bấu víu rổ lòi vào Code mâm bãi, đéo lòi mâm rổ bao giờ lốc bãi bám vào lòi mâm rổ text của Message lòi bãi, cái mâm thứ lòi rổ mà được bãi lòi tự do mâm rổ thay đổi lòi bãi. Cái mâm mã thoát lòi rổ process exit code lốc bãi tuân theo lòi mâm rổ cùng 1 bãi lòi cái mâm hợp đồng rổ lốc 3 bãi giá trị lòi mâm giống y chang bãi lòi rổ bài viết mâm lòi batch nọc: 0 bãi mâm lòi nghĩa là rổ bãi file lốc mâm đéo lòi nặn ra bãi rổ cái lòi finding mâm nào bãi, 1 lòi mâm nghĩa là rổ bãi có lốc finding mâm lòi tồn tại bãi rổ, và 2 lòi mâm nghĩa là rổ bãi bản thân lốc cái mâm audit lòi bãi nọ đéo rổ thể lòi chạy mâm bãi được bởi vì lòi rổ cái bãi file lốc mâm đã tạch lòi bãi vụ parse rổ hoặc lòi mâm bãi vã 1 rổ cái password lòi mâm bãi. Giữ rịt lòi cái code 2 mâm bãi tách biệt lòi rổ là chuyện mâm lòi đáng quan tâm bãi rổ lốc. 1 bãi mâm lòi folder rổ chứa lốc mấy bãi mâm cái lòi scan nát rổ bãi corrupt lòi mâm là 1 rổ cái bãi máy scan lốc mâm hỏng lòi bãi ở rổ thượng nguồn lòi mâm, đéo bãi lòi phải là 1 mâm rổ vụ sụp đổ lòi bãi lốc compliance mâm lòi tuân thủ bãi rổ bất thình lình lòi mâm bãi, và lốc nhồi chung lòi mâm 2 rổ bãi cái đó lòi mâm lại với nhau bãi rổ lốc sẽ đẩy lòi mâm ai đó bãi rổ đi dí lòi mâm theo cái bãi vấn đề lốc mâm sai lòi bãi bét nọc
Các lòi bãi mâm yếu tố lốc rổ tương tác lòi bãi: scripts mâm, các đích lòi bãi launch rổ, lốc và mâm lòi link bên ngoài bãi rổ
PDFium lòi bãi mâm phân loại rổ lốc từng bãi cái lòi action mâm mà rổ bãi nó lòi tìm thấy mâm bãi bằng 1 rổ cái lòi mâm type số nguyên lốc bãi rổ, và lòi mâm mấy cái bãi rổ hằng số lốc từ lòi fpdf_doc.h mâm bãi rất rổ lòi đáng để mâm bãi ghim chốt rổ lòi cho lốc mâm chính xác bãi lòi nọc, bởi vì lòi mâm mấy cái bãi rổ giá trị lốc mâm copy lòi sai bét bãi sẽ rổ lòi biến 1 mâm bãi cái scanner lốc thành lòi mâm thằng mù bãi rổ im thít lòi mâm bãi. Cái lòi bãi mâm cục liệt kê rổ lốc enumeration lòi thật sự mâm bãi là PDFACTION_UNSUPPORTED = 0, PDFACTION_GOTO = 1, PDFACTION_REMOTEGOTO = 2, PDFACTION_URI = 3, PDFACTION_LAUNCH = 4, bãi lòi mâm và PDFACTION_EMBEDDEDGOTO = 5. Hãy lòi mâm chú ý bãi rổ cái thứ lòi mâm vắng mặt bãi lốc rổ: đéo lòi mâm có 1 bãi rổ thành viên lòi JavaScript mâm bãi nào ở trỏng rổ lốc. Mấy lòi cái bãi mâm script cấp độ rổ lốc document lòi bãi đéo phải mâm là lòi action bãi rổ link lốc và lòi đéo mâm bao giờ bãi rổ phơi mặt lòi mâm ra thông qua bãi rổ FPDFAction_GetType; lòi bãi mâm chúng rổ lốc được lòi mâm liệt kê bãi rổ bởi 1 lòi mâm họ bãi rổ các lốc hàm lòi gọi tách biệt mâm bãi nọc. 1 thằng lòi bãi mâm auditor lốc mà rổ lòi test mấy cái bãi mâm type action rổ chọi lòi lại với 1 bãi mâm hằng số lòi JavaScript tưởng tượng bãi rổ lốc sẽ lòi biên dịch mâm bãi, chạy rổ lòi, và mâm bãi đéo lòi tìm thấy mâm rổ gì sất lòi bãi, mãi mãi lốc mâm lòi bãi luôn rổ
const
PDFACTION_GOTO = 1; // in-document jump: harmless
PDFACTION_REMOTEGOTO = 2; // jump into another local file
PDFACTION_URI = 3; // opens an external URL
PDFACTION_LAUNCH = 4; // starts an external program
PDFACTION_EMBEDDEDGOTO = 5; // jump into an embedded file
function ActionTarget(Doc: FPDF_DOCUMENT; Action: FPDF_ACTION;
AType: ULONG): string;
var
Buf: array[0..2047] of AnsiChar;
begin
FillChar(Buf, SizeOf(Buf), 0);
if AType = PDFACTION_URI then
FPDFAction_GetURIPath(Doc, Action, @Buf, SizeOf(Buf))
else
FPDFAction_GetFilePath(Action, @Buf, SizeOf(Buf));
Result := string(UTF8String(PAnsiChar(@Buf)));
end;
procedure AuditPageActions(Doc: FPDF_DOCUMENT; Page: FPDF_PAGE;
PageNo: Integer; Findings: TFindings);
var
StartPos: Integer;
Link: FPDF_LINK;
Action: FPDF_ACTION;
AType: ULONG;
begin
StartPos := 0;
while FPDFLink_Enumerate(Page, @StartPos, @Link) <> 0 do
begin
Action := FPDFLink_GetAction(Link);
if Action = nil then
Continue; // destination-only link, nothing to flag
AType := FPDFAction_GetType(Action);
case AType of
PDFACTION_LAUNCH:
Add(Findings, fsError, 'ACT-LAUNCH', PageNo,
'Launch action targets "' + ActionTarget(Doc, Action, AType) + '"');
PDFACTION_URI:
Add(Findings, fsWarning, 'ACT-URI', PageNo,
'link opens ' + ActionTarget(Doc, Action, AType));
PDFACTION_REMOTEGOTO, PDFACTION_EMBEDDEDGOTO:
Add(Findings, fsWarning, 'ACT-XFILE', PageNo,
'cross-file destination "' + ActionTarget(Doc, Action, AType) + '"');
end; // PDFACTION_GOTO stays silent by design
end;
end;
procedure AuditDocumentBehaviors(Doc: FPDF_DOCUMENT; Findings: TFindings);
var
N: Integer;
begin
N := FPDFDoc_GetJavaScriptActionCount(Doc);
if N > 0 then
Add(Findings, fsError, 'JS-DOC', 0,
Format('%d document-level JavaScript action(s) run on open', [N]));
N := FPDFDoc_GetAttachmentCount(Doc);
if N > 0 then
Add(Findings, fsWarning, 'ATT-EMB', 0,
Format('%d embedded file attachment(s)', [N]));
end;
Cái lòi vụ bãi mâm chia chác rổ lốc mức độ lòi nghiêm trọng mâm (severity split) bãi rổ mã hóa lòi cái chính sách mâm bãi policy rổ. 1 cái lòi mâm bãi action Launch rổ lốc là 1 lòi mâm cái lỗi bãi rổ bởi vì lòi khởi động mâm bãi 1 cái rổ lốc program lòi mâm tùy ý bãi rổ là cái lòi mâm thứ nguy hiểm nhất bãi rổ lốc mà 1 lòi cú click mâm bãi trong 1 cục rổ lòi PDF có mâm bãi thể lòi làm rổ mâm lốc, và bãi lòi đéo có mâm rổ tờ hóa đơn lòi bãi nào mâm cần rổ lòi nó sất bãi lốc. Mấy lòi cái bãi mâm URI bên lòi ngoài rổ bãi là mấy cái cảnh báo mâm lòi warnings rổ bãi lốc: chúng phổ biến lòi mâm trong bãi rổ mấy cái lòi tài liệu mâm hợp pháp bãi rổ, nhưng lòi 1 thằng mâm bãi reviewer lốc nên rổ lòi nhìn thấy mâm bãi cái đích đến rổ lòi target mâm bãi mà lòi đéo cần mâm click bãi rổ lốc, bởi vì lòi bãi mâm cái text lòi của link rổ bãi nhìn thấy lòi được mâm và cái bãi đích đến rổ lòi lốc thực sự mâm bãi đéo lòi nhất thiết mâm bãi phải rổ lòi đồng ý mâm bãi với nhau rổ. Mấy lòi cú nhảy mâm bãi GoTo bên lòi rổ trong tài liệu lốc mâm là cấu trúc bãi lòi structure rổ, lốc đéo mâm phải là bãi lòi behavior hành vi rổ bãi mâm lốc, và lòi chúng bãi mâm nằm ngoài rổ lòi cái report mâm bãi hoàn toàn rổ lòi lốc — 1 bãi lòi cái preflight mâm bãi mà rổ lòi hú còi mâm bãi báo giả rổ lòi trên lốc mâm từng cái bãi lòi entry của rổ mâm mục lục lòi bãi sẽ lốc huấn luyện mâm bãi người ta lòi rổ bơ mâm mẹ bãi nó luôn rổ lòi. Đặng lòi đọc bãi mâm mấy cái rổ lốc body của lòi mâm script đằng bãi rổ sau cái lòi mâm số lượng lốc đếm bãi JavaScript lòi rổ nọc, và lòi cho mấy bãi mâm cái lốc cấp độ rổ lòi MDP chữ ký mâm bãi và lòi rổ phát hiện mâm lốc XFA bãi, cục lòi bài viết mâm bãi audit rủi ro lòi rổ lốc bảo mật mâm bãi đi lòi dạo rổ mâm y xì phóc lốc 1 cái bãi lòi bề mặt mâm nọ thông qua bãi rổ lòi cái wrapper mâm bãi object rổ lốc của component lòi mâm bãi
Các lòi mâm thước đo bãi rổ tài nguyên lốc: DPI hình lòi mâm ảnh hiệu quả bãi rổ
Một lòi bãi hình ảnh mâm lốc nằm trong rổ lòi 1 cục PDF mâm bãi đéo lòi có mâm rổ cái DPI bãi nào lòi lốc của riêng mâm bãi nó sất rổ. Nó lòi mâm có bãi pixels rổ, và lòi cái trang mâm bãi đó rổ lốc đặt mấy lòi bãi cái pixels mâm đó rổ lòi vào 1 bãi mâm cái rổ lốc hình chữ nhật lòi mâm được đo bãi rổ bằng lòi points mâm bãi, nơi lòi rổ mà 72 mâm bãi points lốc lòi tạo thành mâm bãi 1 inch rổ lòi lốc. Độ phân giải lòi mâm bãi resolution rổ lòi chỉ lốc mâm tồn tại bãi rổ như là lòi 1 mâm bãi cái tỷ lệ rổ lòi của 2 mâm bãi cái lốc đó rổ, đó lòi là mâm bãi lý do tại sao rổ lòi cùng 1 mâm bãi bức ảnh lốc lòi 600 nhân 400 mâm rổ lại sắc lòi bãi như dao cạo mâm rổ ở lòi dạng bãi lốc thumbnail mâm và lòi bãi mờ câm mâm rổ lốc rác rưởi lòi bãi ở mâm dạng rổ lòi 1 cái bãi mâm hero lốc toàn trang lòi bãi rổ. Cuộc lòi audit mâm bãi do đó rổ lòi lốc cần bãi mâm cả 2 lòi con số rổ bãi đó lòi cho mâm bãi từng bức ảnh lốc rổ: kích thước lòi mâm pixel gốc bãi rổ từ lòi mâm metadata của bãi rổ lốc ảnh lòi, và mâm bãi cái rổ lòi hình chữ nhật mâm bãi được đặt lốc rổ lòi từ cái mâm bounds bãi rổ của object lòi mâm
procedure AuditPageImages(Page: FPDF_PAGE; PageNo: Integer;
Findings: TFindings);
var
I, ObjCount: Integer;
Obj: FPDF_PAGEOBJECT;
Meta: FPDF_IMAGEOBJ_METADATA;
L, B, R, T: Single;
WidthPt, HeightPt, DpiX, DpiY, EffDpi: Double;
begin
ObjCount := FPDFPage_CountObjects(Page);
for I := 0 to ObjCount - 1 do
begin
Obj := FPDFPage_GetObject(Page, I);
if FPDFPageObj_GetType(Obj) <> FPDF_PAGEOBJ_IMAGE then
Continue;
if FPDFImageObj_GetImageMetadata(Obj, Page, @Meta) = 0 then
Continue;
if FPDFPageObj_GetBounds(Obj, @L, @B, @R, @T) = 0 then
Continue;
WidthPt := R - L; // placed size on the page, in points
HeightPt := T - B;
if (WidthPt <= 0) or (HeightPt <= 0) or
(Meta.Width = 0) or (Meta.Height = 0) then
Continue;
// 72 points = 1 inch, so placed inches = points / 72, and
// effective DPI = source pixels / placed inches.
DpiX := Meta.Width / (WidthPt / 72.0);
DpiY := Meta.Height / (HeightPt / 72.0);
EffDpi := Min(DpiX, DpiY); // the worse axis decides print quality
if EffDpi < 150.0 then
Add(Findings, fsWarning, 'IMG-LOWRES', PageNo,
Format('image %dx%d px placed at %.1fx%.1f pt = %.0f DPI effective',
[Meta.Width, Meta.Height, WidthPt, HeightPt, EffDpi]))
else if EffDpi > 600.0 then
Add(Findings, fsInfo, 'IMG-BLOAT', PageNo,
Format('image is %.0f DPI at placed size; resampling would ' +
'shrink the file with no visible loss', [EffDpi]));
end;
end;
Mấy lòi bãi cái ngưỡng mâm rổ threshold lòi lốc là mâm bãi chính sách policy rổ lòi, đéo mâm bãi phải là vật lý rổ lòi physics lốc mâm: 150 DPI lòi bãi là 1 mâm rổ cái lốc sàn lòi mâm bãi mà dưới lòi rổ nó mâm bãi việc lốc in ấn lòi mâm bãi văn phòng rổ lòi sẽ bị mâm bãi vỡ pixel rổ lòi lốc rõ mồn một mâm bãi, 300 lòi mâm bãi là cái rổ đích lòi mâm lốc thương mại bãi lòi thông thường rổ mâm, và bãi lòi bất kỳ cái mâm lốc gì bãi rổ nằm lòi mâm trên 600 bãi rổ đéo lòi mâm lốc mua được bãi lòi rổ 1 cọng chất lượng mâm lòi bãi nào lốc rổ có thể lòi mâm nhìn thấy bãi rổ được trong lòi khi mâm bãi vẫn lốc bơm phồng lòi rổ cái mâm bãi kích thước lòi file rổ mâm, đó lòi bãi là lốc rổ lý do tại sao mâm lòi bãi nó lại lòi rổ report mâm bãi như lốc là lòi mâm sự phình to bãi rổ thông tin lòi lốc informational bloat mâm bãi rổ thay vì lòi mâm là 1 cái lốc lỗi bãi rổ defect. Có 1 lòi mâm bãi lưu ý lốc rổ thành thật nọc lòi mâm: FPDFPageObj_GetBounds trả lòi về bãi mâm cái lốc hộp rổ lòi được căn chỉnh bãi mâm theo trục rổ lòi, vì vậy mâm bãi đối với rổ lốc 1 cái hình lòi mâm ảnh bãi rổ được lòi mâm đặt bãi với rổ lốc cú lòi xoay mâm bãi rotation lòi rổ, cái mâm con số bãi rổ lốc được tính toán lòi mâm bãi sẽ đánh giá lòi rổ thấp hơn mâm bãi lốc cái mật độ lòi rổ density mâm bãi thực sự. Cái lòi bãi struct mâm lốc FPDF_IMAGEOBJ_METADATA rổ lòi cũng mang mâm bãi theo rổ lốc mấy cái trường lòi mâm bãi horizontal_dpi và rổ lòi vertical_dpi mâm bãi mà PDFium lòi rổ suy ra mâm bãi lốc từ cái lòi ma trận mâm bãi biến đổi rổ lòi lốc đầy đủ transform matrix mâm bãi, và rổ lòi việc so sánh mâm bãi lốc 2 cái lòi kết quả đó mâm bãi rổ là 1 lòi mâm cách bãi lốc rẻ bèo đặng lòi mâm nhận ra bãi rổ mấy cái lòi vị trí mâm bãi đặt lốc xoay rotated placements rổ lòi mâm. Y lòi chang bãi rổ phép toán lòi points-to-pixels mâm bãi arithmetic nọ lốc lòi thúc đẩy mâm bãi việc render rổ lòi lốc theo hướng mâm bãi ngược lại rổ lòi, được lốc mâm bao xô bãi rổ trong cục bài viết xuất JPEG mâm bãi
Trạng lòi bãi mâm thái bảo mật rổ lốc: encryption lòi mâm mã hóa và bãi rổ lốc các bit lòi mâm bãi quyền rổ lòi
Mã lòi hóa bãi mâm PDF rổ lòi định nghĩa lốc 2 bãi mâm cái lòi mật khẩu rổ bãi với lốc 2 mâm lòi cái job bãi rổ khác nhau lòi lốc mâm. Mật lòi bãi khẩu người dùng mâm rổ user password lòi lốc canh gác bãi mâm trò lòi giải mã rổ bãi decryption lòi: đéo mâm bãi có nó rổ lòi thì lốc cái bãi mâm file lòi sẽ đéo rổ bãi mở được lòi lốc luôn mâm bãi, và FPDF_LoadDocument trả lòi về mâm bãi nil với rổ lòi lốc FPDF_GetLastError report lòi mâm bãi về rổ lòi FPDF_ERR_PASSWORD lốc mâm bãi. Mật lòi bãi khẩu chủ sở hữu mâm rổ owner password lòi lốc canh gác bãi mâm các quyền lòi rổ permissions bãi: 1 lòi mâm cái file bãi rổ chỉ lốc lòi được mâm bảo vệ bãi rổ bởi 1 cái lòi mật khẩu mâm bãi chủ sở hữu lốc rổ lòi mở ra mâm bãi mà rổ lòi đéo cần mâm lốc thông tin xác thực bãi lòi credentials nào rổ mâm nhưng mang lòi bãi theo rổ lòi các bit lốc mâm hạn chế bãi rổ restriction bits lòi mâm mà 1 thằng lòi reader bãi mâm tuân thủ lốc rổ lòi conforming reader mâm bãi phải tôn trọng rổ lòi lốc. Cú lòi thử load mâm bãi attempt nọ lòi rổ do đó mâm lốc là lòi bãi cọc dò mâm rổ bảo mật lòi probe đầu tiên mâm bãi lốc, và bãi lòi sự khác biệt mâm rổ đó lòi quyết định lốc mâm bãi cái mã thoát rổ lòi exit code — 1 lòi mâm cái file bãi rổ user-password lòi mâm đéo thể lốc bãi audit được rổ lòi (code 2), trong mâm bãi khi rổ lòi 1 lốc cái file mâm bãi owner-password lòi rổ audit mâm bãi bình thường lốc lòi và rổ mâm chỉ đơn thuần lòi bãi lốc tích lũy mâm lòi bãi mấy rổ cái findings
const
FPDF_ERR_PASSWORD = 4;
function AuditSecurity(const FileName: string;
Findings: TFindings): FPDF_DOCUMENT;
var
Perms: ULONG;
Revision: Integer;
begin
Result := FPDF_LoadDocument(PAnsiChar(AnsiString(FileName)), nil);
if Result = nil then
begin
if FPDF_GetLastError() = FPDF_ERR_PASSWORD then
Add(Findings, fsError, 'SEC-USERPW', 0,
'user (open) password required; audit cannot proceed')
else
Add(Findings, fsError, 'DOC-BROKEN', 0, 'file failed to parse');
Exit;
end;
Revision := FPDF_GetSecurityHandlerRevision(Result);
if Revision >= 0 then // -1 means the file is not encrypted
begin
// Opened with an empty password yet encrypted: owner-password-only.
// Anyone may read it, but the permission bits restrict what a
// conforming reader lets them do. Unencrypted files report all
// bits set, which is why the revision gate comes first.
Perms := FPDF_GetDocPermissions(Result);
Add(Findings, fsInfo, 'SEC-ENC', 0,
Format('encrypted, security handler revision %d', [Revision]));
if (Perms and 4) = 0 then // bit 3: print
Add(Findings, fsWarning, 'SEC-NOPRINT', 0,
'printing is not permitted');
if (Perms and 16) = 0 then // bit 5: copy / extract content
Add(Findings, fsInfo, 'SEC-NOCOPY', 0,
'content extraction is not permitted');
if (Perms and 2048) = 0 then // bit 12: high-resolution print
Add(Findings, fsWarning, 'SEC-LOWPRINT', 0,
'only low-resolution printing is permitted');
end;
end;
Mấy lòi bãi cái mask mâm rổ xuất phát lòi từ Bảng 22 lốc mâm bãi của ISO 32000-1 rổ lòi, cái mà mâm bãi đánh số lốc rổ lòi mấy cái bit mâm bãi từ 1 lòi rổ: bit 3 lốc mâm của giá trị lòi bãi /P rổ lòi là mask 4, lốc bãi mâm bit 5 lòi là 16 rổ bãi, bit 12 lốc lòi là 2048 mâm bãi. Liệu rổ 1 cái lòi mâm finding bãi rổ lốc cho trước lòi mâm có bãi rổ quan trọng hay không lòi mâm là 1 cái lốc bãi quyết định lòi định tuyến rổ mâm routing decision bãi. 1 cái rổ lòi mâm văn phòng lốc in bãi rổ nên bounce lòi dội mâm bãi 1 lốc cái rổ lòi file SEC-NOPRINT bãi mâm ở khâu lốc lòi intake đầu vào rổ bãi, nơi lòi mâm mà thằng bãi rổ submitter nhận được lòi mâm bãi 1 cái thông báo lốc rổ rõ ràng lòi mâm, chứ đéo bãi rổ lòi phải là mâm lốc ở chỗ RIP bãi rổ lòi ba giờ mâm bãi đồng hồ lốc trước cái rổ lòi deadline mâm bãi. 1 cái rổ lòi mâm kho lưu trữ lốc archive bãi rổ nên coi lòi mâm bản thân bãi rổ SEC-ENC lốc là 1 lòi mâm bãi cái blocker chặn đường rổ lòi, bởi mâm bãi vì trò lốc mã hóa lòi mâm bãi encryption rổ lòi và lốc việc bảo tồn mâm bãi lâu dài rổ lòi đéo thể mâm trộn lẫn bãi rổ lốc mix với nhau lòi mâm bãi — 1 lòi cái điểm rổ mâm mà trò lốc bãi kiểm tra lòi mâm tiêu chuẩn rổ bãi sắp sửa lòi làm 1 cách mâm bãi chính thức lốc rổ
Các mác lòi bãi tiêu chuẩn mâm rổ: đọc lòi bãi 1 mâm tuyên bố lốc PDF/A rổ lòi
Một lòi bãi file tuyên bố mâm rổ lốc sự tuân thủ lòi mâm PDF/A bãi rổ lòi trong cái mâm packet lòi rổ metadata XMP lốc của nó mâm bãi, thông qua rổ lòi cái mâm thuộc tính bãi pdfaid:part rổ lốc (từ 1 lòi mâm đến 4 bãi) và pdfaid:conformance (cái lòi bãi mâm chữ cái lốc rổ cấp độ level letter lòi mâm, ví dụ như b bãi rổ cho độ trung thực lòi mâm lốc thị giác visual fidelity bãi lòi hay a rổ mâm cho lốc việc gắn thẻ lòi mâm cấu trúc bãi rổ full structural tagging). PDFium's C API đéo lòi mâm bãi cung cấp lốc 1 cái rổ lòi accessor XMP nào mâm bãi; FPDF_GetMetaText chỉ lòi đọc mâm cái bãi rổ từ điển lốc Info lòi mâm bãi, nơi rổ lòi mà đéo phải mâm bãi là chỗ lốc thằng rổ lòi identification nhận dạng mâm bãi đó nó sống rổ lòi. Cửa thoát hiểm lòi mâm lốc bãi là 1 cái luật rổ lòi trong mâm bản thân bãi lốc tiêu chuẩn rổ lòi đó: ISO 19005 yêu cầu lòi mâm bãi cái rổ lốc luồng stream lòi mâm metadata XMP bãi rổ phải lòi được lưu trữ mâm bãi mà đéo nén lốc rổ lòi, lốc mâm bãi chính xác rổ lòi là để mâm bãi các tool lốc rổ có thể lòi tìm thấy nó mâm bãi mà rổ lòi đéo lốc cần 1 mâm thằng bãi lòi parser PDF rổ đầy đủ. 1 cú quét lòi bãi byte thô mâm rổ lốc do đó lòi mâm là 1 cái máy bãi rổ lòi phát hiện lốc tuyên bố lòi mâm detector hợp pháp bãi rổ — và 1 cái lòi mâm file bãi lốc mà rổ lòi tuyên bố mâm bãi của nó lốc rổ lòi lẩn trốn mâm bên trong bãi 1 cái rổ luồng lòi mâm nén lốc bãi đã vi phạm lòi mâm rổ cmn cái lốc tiêu chuẩn lòi mâm mà nó bãi rổ lòi tuyên bố mâm bãi rồi
function PdfAClaim(const FileName: string): string;
var
Bytes: TBytes;
S: RawByteString;
P, Limit: Integer;
begin
Result := ''; // empty = no PDF/A claim present
Bytes := TFile.ReadAllBytes(FileName);
if Length(Bytes) = 0 then
Exit;
SetString(S, PAnsiChar(@Bytes[0]), Length(Bytes));
P := Pos('pdfaid:part', S); // XMP identification schema
if P = 0 then
Exit;
// Handles both <pdfaid:part>2</pdfaid:part> and pdfaid:part="2":
// take the first digit after the property name.
Limit := Min(P + 32, Length(S));
Inc(P, Length('pdfaid:part'));
while (P <= Limit) and not (S[P] in ['1'..'4']) do
Inc(P);
if P <= Limit then
Result := 'PDF/A-' + Char(S[P]);
end;
Cái lòi bãi mâm finding rổ mà cái này lốc lòi tạo ra mâm bãi cố ý rổ lòi mang tính lốc thông tin mâm bãi informational, bởi vì lòi mâm 1 cái bãi rổ tuyên bố lốc claim lòi là 1 cái mâm declaration bãi rổ khai báo, đéo lòi mâm phải là bãi 1 cái rổ lốc property lòi mâm của cái bãi file rổ lòi. Cái entry lòi bãi mâm XMP rổ lốc là 1 dòng lòi mâm XML bãi mà bất kỳ rổ thằng producer lòi mâm nào cũng bãi có thể lốc rổ lòi viết được mâm bãi, bao gồm rổ cả lòi 1 mâm thằng bãi bị lốc hỏng broken rổ lòi; sự tuân thủ lòi mâm conformance bãi là cái rổ file thực sự lòi mâm lốc đáp ứng bãi rổ hàng trăm lòi mâm lọng luật rules bãi về rổ mấy lòi mâm cái font chữ bãi lốc được nhúng embedded rổ lòi, mâm không gian bãi rổ lòi màu mâm bãi độc lập lốc với thiết bị rổ lòi, và mâm bãi mấy cái feature lòi rổ bị cấm bãi. Phát lòi mâm hiện ra bãi rổ cái tuyên bố lốc claim lòi mâm nói cho bãi bạn rổ lòi biết cái file mâm bãi nào lốc rổ lòi nên định tuyến mâm route bãi tới chỗ lòi rổ validation thực sự lốc mâm bãi, và đéo lòi có gì rổ mâm thêm bãi lốc. Cái rổ lòi mâm engine preflight bãi lốc tích hợp lòi mâm của component bãi thực hiện rổ lòi cái mâm bãi validation lốc rổ lòi đó mâm bãi trên khắp rổ lòi các lốc profile PDF/A, PDF/UA, mâm và PDF/X bãi rổ, lòi và cục bài bãi viết mâm rổ lốc CLI batch bãi phơi bày lòi mâm lốc cách đấu dây rổ lòi mâm nó vào bãi lốc 1 cái lòi pipeline rổ mâm bãi với các bản report lòi mâm lốc mà 1 bãi thằng lòi auditor mâm rổ có thể lòi mâm mở lốc ra sau đó bãi rổ
Chạy lòi mâm thử với bãi 1 cái rổ lốc file lòi có vấn đề mâm bãi
Cục lòi driver xâu chuỗi mâm bãi mấy cái lốc rổ kiểm tra lòi lại với nhau mâm bãi: bảo mật rổ security lòi mâm lên đầu tiên bãi rổ, lốc bởi vì lòi nó quyết định mâm bãi rổ lòi liệu cái audit mâm bãi có chạy lốc hay rổ lòi đéo mâm bãi, sau đó lòi rổ là mấy mâm cái lốc bãi behavior lòi cấp độ mâm bãi document rổ lòi và cái tuyên bố mâm bãi tiêu chuẩn lốc rổ lòi, sau đó lòi mâm là bãi 1 cái rổ vòng lặp lòi mâm trang bãi lốc cho mấy lòi cái rổ mâm actions và bãi lòi images mâm bãi rổ
function AuditFile(const FileName: string; Findings: TFindings): Integer;
var
Doc: FPDF_DOCUMENT;
Page: FPDF_PAGE;
I: Integer;
Claim: string;
begin
Doc := AuditSecurity(FileName, Findings);
if Doc = nil then
Exit(2); // audit failure, not a verdict
try
AuditDocumentBehaviors(Doc, Findings);
Claim := PdfAClaim(FileName);
if Claim <> '' then
Add(Findings, fsInfo, 'STD-PDFA', 0,
Claim + ' conformance claimed (declaration only, not validated)');
for I := 0 to FPDF_GetPageCount(Doc) - 1 do
begin
Page := FPDF_LoadPage(Doc, I);
if Page = nil then
begin
Add(Findings, fsError, 'PAGE-BROKEN', I + 1, 'page failed to parse');
Continue;
end;
try
AuditPageActions(Doc, Page, I + 1, Findings);
AuditPageImages(Page, I + 1, Findings);
finally
FPDF_ClosePage(Page);
end;
end;
finally
FPDF_CloseDocument(Doc);
end;
if Findings.Count > 0 then
Result := 1
else
Result := 0;
end;
Chọi lòi mâm lại với bãi rổ 1 cái lốc brochure lòi mâm được ném về bãi từ 1 lòi mâm cái bãi rổ lốc agency bên ngoài lòi mâm, bãi output rổ lòi nhìn mâm sẽ lốc bãi giống rổ lòi thế này mâm bãi
> preflight_audit brochure_final.pdf
brochure_final.pdf: 5 finding(s)
[ERROR] ACT-LAUNCH page 3 Launch action targets "..\tools\setup.exe"
[ERROR] JS-DOC doc 2 document-level JavaScript action(s) run on open
[WARNING] IMG-LOWRES page 7 image 412x287 px placed at 396.0x275.8 pt = 75 DPI effective
[WARNING] SEC-NOPRINT doc printing is not permitted
[INFO] STD-PDFA doc PDF/A-2 conformance claimed (declaration only, not validated)
exit code 1
Mỗi lòi mâm dòng tự bãi rổ lốc bản thân lòi nó mâm bãi đã có thể lòi rổ hành động mâm actionable bãi lòi, nhưng lốc sự kết hợp mâm bãi rổ lòi mới là cái mâm bãi verdict rổ lòi lốc phán quyết thực sự mâm bãi. File lòi rổ này mâm bãi tuyên bố lòi PDF/A-2 mâm bãi lốc trong khi lòi rổ lại mang mâm theo bãi 1 lòi mâm cái từ điển rổ lốc bãi mã hóa encryption lòi mâm và bãi JavaScript lòi sống rổ mâm, và lốc PDF/A cấm tiệt bãi lòi mâm cả hai thứ đó rổ lòi lốc — vì vậy bãi mâm cái lòi tuyên bố rổ đó lốc có thể mâm bãi chứng minh lòi rổ được là lòi mâm sai bãi lốc lè trước khi lòi mâm rổ bất kỳ 1 thằng bãi lòi validator mâm sâu deep nào bãi chạy rổ. Đó lòi mâm chính là lốc bãi cái rổ lòi loại mâu thuẫn mâm bãi contradiction mà 1 lòi cái rổ list mâm bãi finding lốc phẳng flat lòi mâm bãi rổ phơi bày lên bề mặt lòi mâm bãi và lốc 1 cái boolean mâm rổ lòi pass/fail đậu/rớt bãi giấu nhẹm mâm lòi đi rổ
Những lòi mâm gì mà bãi rổ cuộc audit lốc lòi này mâm đéo thể bãi rổ lòi nói cho mâm bãi bạn biết rổ lòi
Sự lòi mâm thành thật bãi về rổ lốc phạm vi scope lòi mâm bãi là thứ lòi giữ cho 1 bãi mâm cái rổ lòi tool preflight mâm bãi được lốc lòi tin tưởng mâm bãi rổ. Mọi lòi mâm thứ bãi ở rổ trên lốc lòi đọc những gì mâm bãi mà cái rổ lòi file tuyên bố mâm bãi lốc về chính lòi mâm bản thân rổ nó bãi lòi: PDFium parse mâm cấu trúc bãi rổ lốc, lòi và cái mâm audit bãi này lòi rổ kiểm kê lốc inventories mâm bãi nó rổ lòi. Nó đéo mâm bãi thực hiện lốc lòi validation PDF/A mâm bãi — đéo có lòi mâm rổ bất kỳ check bãi độ bao phủ lòi lốc glyph mâm nào bãi rổ chọi lại lòi với mấy cái mâm bãi font lốc rổ nhúng embedded lòi, đéo mâm bãi rổ phân tích không lòi mâm gian bãi lốc màu lòi rổ chọi mâm bãi lại lốc lòi với các output intents mâm bãi rổ, đéo lòi mâm có 1 cái lọng luật bãi rổ cấp độ lòi mâm lốc điều khoản clause-level nào bãi lòi phân tách 1 rổ cái mâm bãi tuyên bố lốc khỏi lòi sự tuân thủ rổ conformance mâm bãi; lòi đối với rổ cái đó mâm lốc bãi bạn lòi cần mâm 1 thằng bãi validator rổ lòi lốc chuyên dụng mâm bãi như rổ là lòi engine preflight mâm bãi lốc của component rổ lòi mâm hoặc bãi veraPDF lòi. Các bit quyền lòi mâm permission bits bãi rổ lốc là những bãi lòi mâm declaration khai báo rổ lòi mà các mâm reader lốc tuân thủ rổ bãi conforming lòi mâm tôn trọng rổ, lốc đéo mâm lòi phải là mấy cái bức tường bãi rổ lòi cryptography mật mã mâm, lốc vì vậy bãi lòi SEC-NOPRINT miêu tả mâm bãi cái ý định rổ intent lòi mâm chứ đéo bãi rổ lòi lốc phải là mâm sự thực thi bãi rổ enforcement lòi mâm. Cú quét lòi mâm action scan bãi bao xô rổ lốc mấy cái lòi annotation mâm của bãi link và lòi script mâm cấp độ rổ document lốc bãi lòi; mấy cái mâm script bãi rổ bị chôn vùi lòi lốc trong các mâm bãi từ điển rổ lòi event mâm của bãi form-field lốc lòi cần các API mâm bãi form rổ ở lòi trên cùng mâm lốc bãi. Và lòi 1 mâm cú rổ check lòi chữ ký bãi signature mâm rổ, lốc nếu bãi lòi bạn mở rộng mâm rổ cái audit bãi đó lòi lốc bằng 1 cái mâm bãi, sẽ report rổ bãi cái mâm ý định intent lòi rổ được tuyên bố lòi, đéo mâm bãi phải rổ là cryptography lòi lốc được mâm verify bãi — validation lòi mâm rổ chuỗi chứng chỉ bãi lốc certificate chain lòi mâm bãi là 1 cái job rổ lòi lốc tách biệt mâm bãi. 1 cái rổ lòi audit preflight mâm lốc bãi là 1 cái lòi cuộc phỏng vấn mâm bãi đầu vào rổ intake interview lòi mâm bãi lốc, đéo lòi phải là mâm 1 phiên tòa bãi rổ trial lòi: job mâm của nó bãi là làm rổ lòi lốc cho cái quyết định mâm bãi định tuyến rổ lòi routing decision mâm lốc được báo bãi lòi thông tin rổ đầy đủ mâm informed bãi, nhanh lòi mâm, lốc và bãi lòi lặp rổ lại được mâm bãi
Ghi chú: Lố rổ Các API mâm bãi đối tượng lòi lốc document mâm, page bãi, lòi rổ annotation, lốc và mâm lòi image bãi rổ được lòi mâm sử dụng bãi lốc xuyên suốt rổ lòi trong mâm cái audit bãi này lòi rổ lốc, cùng lòi với 1 mâm cái bãi rổ wrapper Delphi cấp cao lòi mâm bãi lốc và 1 lòi mâm bãi cái engine preflight rổ lòi validation tiêu chuẩn mâm bãi đầy đủ lốc rổ lòi, được lòi mâm ship bãi rổ kèm lốc với PDFium Component