Các phương thức báo cáo preflight THotPDF

Cú pháp

type
  THPDFPreflightFormat = (pfText, pfJSON, pfHTML, pfCSV);

function CreatePreflightReport(const SourceFile: TFileName): AnsiString;
function CreatePreflightReport(
  const SourceFile: TFileName;
  const Password  : AnsiString): AnsiString;
function CreatePreflightReport(
  const SourceFile: TFileName;
  const Password  : AnsiString;
  const Format    : THPDFPreflightFormat): AnsiString;
procedure SavePreflightReport(
  const SourceFile: TFileName;
  const ReportFile: TFileName);
procedure SavePreflightReport(
  const SourceFile: TFileName;
  const ReportFile: TFileName;
  const Password  : AnsiString);
procedure SavePreflightReport(
  const SourceFile: TFileName;
  const ReportFile: TFileName;
  const Password  : AnsiString;
  const Format    : THPDFPreflightFormat);
function ValidatePDFVT(
  const SourceFile: TFileName;
  out Report      : AnsiString): Boolean;
function ValidatePDFVT(
  const SourceFile: TFileName;
  const Password  : AnsiString;
  out Report      : AnsiString): Boolean;
procedure EmbedPreflightReportInPDF(
  const SourceFile: TFileName;
  const TargetFile: TFileName);
procedure EmbedPreflightReportInPDF(
  const SourceFile: TFileName;
  const TargetFile: TFileName;
  const Password  : AnsiString);
function LoadAndValidatePreflightReport(
  const EmbeddedFile  : TFileName;
  out OriginalReport: AnsiString;
  out CurrentReport : AnsiString): Boolean;
function LoadAndValidatePreflightReport(
  const EmbeddedFile  : TFileName;
  const Password      : AnsiString;
  out OriginalReport: AnsiString;
  out CurrentReport : AnsiString): Boolean;
function ComparePreflightReports(
  const ReportA: AnsiString;
  const ReportB: AnsiString): AnsiString;
function RepairPDFFromPreflightReport(
  const SourceFile: TFileName;
  const TargetFile: TFileName;
  out RepairsApplied: AnsiString): Boolean;
function RepairPDFFromPreflightReport(
  const SourceFile: TFileName;
  const TargetFile: TFileName;
  const Password  : AnsiString;
  out RepairsApplied: AnsiString): Boolean;
function AggregatePreflightReports(
  const Reports: array of AnsiString): AnsiString;
type
  THPDFPreflightProfile = record
    DisableChecks  : AnsiString;
    DisableWarnings: AnsiString;
    DisableHints   : Boolean;
  end;
function LoadPreflightProfile(
  const ProfileFile: TFileName): THPDFPreflightProfile;
function ApplyPreflightProfile(
  const Report : AnsiString;
  const Profile: THPDFPreflightProfile): AnsiString;
function ValidatePreflightProfile(
  const Profile: THPDFPreflightProfile;
  out UnknownNames: AnsiString): Boolean;
function GetBuiltInPreflightProfile(
  const Name: AnsiString): THPDFPreflightProfile;
procedure SavePreflightProfile(
  const Profile    : THPDFPreflightProfile;
  const ProfileFile: TFileName);
function CreatePreflightReportWithProfile(
  const SourceFile : TFileName;
  const Password   : AnsiString;
  const ProfileFile: TFileName;
  const Format     : THPDFPreflightFormat): AnsiString;
function MergePreflightProfiles(
  const A, B: THPDFPreflightProfile): THPDFPreflightProfile;
function DiffPreflightProfiles(
  const A, B  : THPDFPreflightProfile;
  out OnlyInA: AnsiString;
  out OnlyInB: AnsiString): Boolean;
procedure EmbedPreflightReportAsXMP(
  const SourceFile: TFileName;
  const TargetFile: TFileName);
procedure EmbedPreflightReportAsXMP(
  const SourceFile: TFileName;
  const TargetFile: TFileName;
  const Password  : AnsiString);
function ConvertPreflightReportToVeraPDFStyle(
  const Report: AnsiString): AnsiString;

Mô tả

CreatePreflightReport đọc một PDF đầu vào và trả về báo cáo văn bản với các kiểm tra cấu trúc nhẹ. Các overload có mật khẩu dùng đường nạp có nhận biết mật khẩu sẵn có cho các PDF mã hóa được hỗ trợ SavePreflightReport ghi cùng báo cáo đó ra một tệp văn bản đích

ValidatePDFVT chạy một lượt xác thực PDF/VT tập trung và chỉ trả về True khi các marker và cấu trúc bắt buộc đều có mặt. Báo cáo văn bản trả về sẽ kiểm tra lời khai XMP pdfvtid:GTS_PDFVTVersion, namespace siêu dữ liệu PDF/VT, khớp ngày sửa đổi PDF/VT với xmp:ModifyDate, marker gốc PDF/X, không có mã hóa, output intent PDF/X, DPartRoot của catalog, DPartRootNode, NodeNameList, sự có mặt của document part, số trang có thể nạp và độ phủ DPart ở cấp trang. Thuộc tính ngày của PDF/VT và XMP có thể được ghi dưới dạng văn bản phần tử hoặc thuộc tính RDF trên phần tử rdf:Description

Báo cáo kiểm tra header PDF, marker EOF, việc marker %%EOF cuối có nằm gần cuối tệp hay không, offset startxref cuối cùng, việc offset đó trỏ tới bảng xref hay xref stream, số lượng marker %%EOF và startxref, cân bằng marker revision và thứ tự marker cuối, marker trailer hoặc XRef stream, số trang có thể nạp, trạng thái mã hóa, catalog, cây trang, marker đối tượng trang, MediaBox, tham chiếu từ điển thông tin, tham chiếu gốc, số object gián tiếp, số định nghĩa object gián tiếp, số object lớn nhất, số object trùng số, tính duy nhất của số object, số object catalog, số object cây trang, số object trang, số trang khai báo của cây trang, tính nhất quán giữa số đếm của cây trang và số trang có thể nạp, tính nhất quán giữa object trang và số trang có thể nạp, cân bằng giữa stream và endstream, độ phủ mục /Length của stream, số bảng xref, số subsection xref, số mục bảng xref, số entry free và in-use của xref, số hàng xref lỗi, tính hợp lệ của hàng xref, độ phủ xref so với số object, số xref stream, số object stream, số trailer, /Size của trailer, việc /Size của trailer có bao phủ số object lớn nhất hay không, các tham chiếu gián tiếp trailer /Root và /Info, việc các object được tham chiếu đó có được định nghĩa hay không, việc trailer /Root có trỏ tới object catalog hay không, số mục và cấu trúc cặp của mảng trailer /ID, sự có mặt của /Root, /Info, /ID và /Encrypt trong trailer, số lượt incremental update ước tính, trạng thái linearization, các box của trang đã nạp, số trường biểu mẫu, số từ điển tài nguyên, số tài nguyên phông, số chương trình phông nhúng (/FontFile, /FontFile2, /FontFile3), số image XObject, số form XObject, số tài nguyên ColorSpace, số annotation và các số đếm con của widget/link, số lần dùng chuỗi filter cho FlateDecode, DCTDecode, CCITTFaxDecode, JBIG2Decode, LZWDecode, ASCIIHexDecode, ASCII85Decode, RunLengthDecode và JPXDecode, độ phủ nhúng phông, tính nhất quán số lượng annotation, các gợi ý tuân thủ PDF/A / PDF/X / PDF/UA / Tagged PDF / transparency, các cờ tính năng được chọn, các cảnh báo JavaScript hoặc action (bao trùm toàn bộ tập action của PDF 1.7 sec 12.6.4: GoTo*, Thread, URI, Sound, Movie, Hide, Named, SubmitForm, ResetForm, ImportData, SetOCGState, Rendition, Trans, và GoTo3DView, cùng các kiểm tra cũ JavaScript / Launch / OpenAction / AdditionalActions / EmbeddedFile / RichMedia và các cảnh báo loại trừ lẫn nhau của PDF/A), tổng cảnh báo và một bản tóm tắt đậu/rớt tổng quát Các helper này nhằm cung cấp các kiểm tra nhanh trong tiến trình trước khi chuyển tệp cho các bộ xác thực tiêu chuẩn bên ngoài; chúng không thay thế cho một bộ máy xác thực preflight đầy đủ cho PDF/A, PDF/X, PDF/UA hoặc ISO 32000

Overload Format chấp nhận pfText (đường văn bản thuần mặc định, ổn định theo byte với các overload cũ), pfJSON (tài liệu JSON thân thiện với CI), pfHTML (báo cáo HTML tự chứa, sẵn cho dashboard, có CSS nội tuyến và các dòng tô màu theo mức độ), hoặc pfCSV (các dòng thân thiện với bảng tính cho metadata, kiểm tra, gợi ý, cảnh báo và giá trị tóm tắt). Đầu ra JSON nhóm các mục thành các trường cấp cao input, size, pdfVersion và xrefStyle cùng các mảng checks, info, hints và warnings

và một object summary chứa các giá trị failed, warnings và result Đầu ra CSV dùng tiêu đề ổn định category,name,status,value,spec, với văn bản tham chiếu ISO trong spec khi chẩn đoán có câu chuẩn tương ứng đã được ánh xạ Bộ mã hóa JSON dựng sẵn thoát ", \ và các byte điều khiển; các chuỗi byte UTF-8 đi qua nguyên vẹn

Mỗi mục checks, hints và warnings đều có thể mang trường spec tùy chọn, nêu rõ điều khoản ISO mà chẩn đoán nhắm tới (ví dụ ISO 32000-1 sec 7.5.5 cho các kiểm tra liên quan đến trailer, ISO 19005-1 sec 6.6.2 cho cảnh báo loại trừ lẫn nhau giữa PDF/A và JavaScript) Ánh xạ này bao phủ mọi kiểm tra, gợi ý và cảnh báo mà báo cáo phát ra đến v2.122.0 Một JSON Schema chính thức (draft 2020-12) mô tả cấu trúc đầu ra pfJSON được công bố tại Docs/preflight-schema.json để các consumer phía sau có thể xác thực đầu ra trước khi phân tích

EmbedPreflightReportInPDF ghi một bản sao của PDF nguồn ra TargetFile rồi nối báo cáo preflight ở định dạng văn bản cũ sau %%EOF cuối cùng dưới dạng các dòng chú thích kiểu PDF (mỗi dòng được thêm tiền tố % ) Trình đọc PDF bỏ qua phần byte được nối thêm vì chúng nằm ngoài đồ thị object, nhưng các luồng lưu trữ, trình soạn thảo văn bản và công cụ kiểu grep vẫn có thể trích báo cáo nhúng để kiểm tra về sau Đồ thị object gốc, bảng cross-reference và trailer không bị sửa đổi

LoadAndValidatePreflightReport trích báo cáo mà EmbedPreflightReportInPDF đã nối thêm trước đó, chạy lại thuật toán preflight hiện tại trên các byte nguồn nằm trước khối chú thích nhúng, rồi so sánh giá trị InputFingerprint Hàm trả về True khi cả hai fingerprint trùng nhau, cho biết báo cáo nhúng vẫn mô tả đúng tệp như nó đang tồn tại trên đĩa Khi xác thực thất bại, người gọi có thể xem OriginalReport và CurrentReport để diff phần đã thay đổi

ComparePreflightReports tạo ra phần thân kiểu unified diff cho hai báo cáo Các dòng chung có tiền tố hai dấu cách, các dòng chỉ có trong ReportA có tiền tố -  và các dòng chỉ có trong ReportB có tiền tố +  Thuật toán được tối ưu cho đầu ra cặp khóa/giá trị có cấu trúc tốt do CreatePreflightReport tạo ra, nơi thứ tự dòng là xác định; đây không phải là cài đặt LCS tổng quát nhưng cho ra diff gọn, dễ đọc cho trường hợp điển hình là các báo cáo gần như không đổi

RepairPDFFromPreflightReport áp dụng một tập con bảo thủ của các sửa chữa ở mức byte cho một PDF bị hỏng: nó bỏ các byte thừa nằm sau dấu %%EOF cuối cùng, và tự thêm %%EOF nếu không thấy dấu này ở bất kỳ đâu Hàm trả về True khi đã áp dụng ít nhất một sửa chữa; RepairsApplied liệt kê các sửa chữa, mỗi thay đổi một dòng Các sửa chữa trên đồ thị object (dựng lại bảng xref, vá độ dài stream, sửa từ điển trailer) được cố ý để ngoài phạm vi vì các sửa như vậy có thể làm tệp vốn còn cứu được trở nên khó cứu hơn; hãy dùng công cụ khôi phục PDF chuyên dụng cho các hư hại sâu hơn

AggregatePreflightReports nhận một mảng báo cáo theo từng tệp và tạo ra một bản tóm tắt hàng loạt duy nhất Mỗi mục trong mảng được phân tích theo các trường Input, Size và Summary; phần tổng hợp phát ra một dòng cho mỗi tệp cùng tổng số báo cáo đạt, lỗi và cảnh báo, tổng số byte đã quét và số lượng kết quả tổng cộng Hữu ích cho các pipeline CI và các vòng lặp shell xử lý một thư mục PDF rồi muốn có một bản tóm tắt ngắn gọn ở cuối

LoadPreflightProfile và ApplyPreflightProfile cho phép người gọi tinh chỉnh đầu ra báo cáo mà không phải chạy lại phân tích Tệp profile dùng định dạng kiểu INI với ba phần tùy chọn: [disable-checks] liệt kê các tên kiểm tra cần ẩn; [disable-warnings] liệt kê các tên cảnh báo cần ẩn; và [options] chấp nhận hints=false để ẩn toàn bộ các dòng Hint Sau khi lọc, dòng Summary được tính lại để các mục bị ẩn không còn đóng góp vào tổng Failed và Warnings; phần còn lại của báo cáo đi qua nguyên trạng

ValidatePreflightProfile duyệt qua các danh sách DisableChecks và DisableWarnings của profile đã nạp rồi báo mọi tên không được cài đặt preflight hiện tại nhận ra Hữu ích để phát hiện các tệp profile được viết cho phiên bản HotPDF mới hơn hoặc cũ hơn, vốn nếu không sẽ âm thầm không ẩn gì vì tên không khớp với bất kỳ kiểm tra hay cảnh báo nào được phát ra

GetBuiltInPreflightProfile trả về các bản ghi profile sẵn sàng dùng cho những quy trình phổ biến Các tên được nhận biết là không phân biệt hoa thường: default / '' trả về một profile rỗng; compact tắt mọi dòng Hint để báo cáo ngắn hơn; silent-actions tắt mọi cảnh báo hành động của PDF 1.7 sec 12.6.4 cùng EmbeddedFile và RichMedia, dành cho các quy trình chủ động nhúng đa phương tiện hoặc hành động tương tác và không muốn preflight báo động về chúng Tên không nhận biết cũng trả về profile rỗng

SavePreflightProfile ghi một bản ghi THPDFPreflightProfile trở lại tệp INI theo đúng định dạng mà LoadPreflightProfile đọc vào Hai hàm này là hai phép nghịch đảo chính xác với các profile hợp lệ, nên người gọi có thể xây dựng quy trình 'nạp preset, chỉnh, lưu': P := GetBuiltInPreflightProfile('compact'), sửa P.DisableChecks rồi SavePreflightProfile(P, 'tuned.ini') để dùng lại sau

CreatePreflightReportWithProfile là một wrapper tiện dụng một cửa, ghép các thành phần hiện có CreatePreflightReport, LoadPreflightProfile, ApplyPreflightProfile và các bộ chuyển đổi định dạng để người gọi đã có sẵn PDF nguồn, mật khẩu tùy chọn, tệp profile và định dạng đích có thể dùng một lệnh duy nhất thay vì xâu chuỗi bốn lệnh Gán ProfileFile rỗng sẽ bỏ qua bước profile

MergePreflightProfiles trả về hợp hai profile đã loại trùng: DisableChecks và DisableWarnings gom các tên từ cả hai đầu vào, còn DisableHints là phép OR logic Hữu ích khi chồng một preset lên các tinh chỉnh riêng của dự án

DiffPreflightProfiles báo cáo khác biệt cấu trúc giữa hai profile Trả về True khi chúng tương đương; ngược lại trả về False và điền OnlyInA / OnlyInB bằng các dòng ngăn bởi newline theo dạng check:<name>, warn:<name> hoặc option:hints=false mô tả những mục chỉ xuất hiện ở mỗi bên

EmbedPreflightReportAsXMP là biến thể thân thiện với lưu trữ của EmbedPreflightReportInPDF: nó ghi một bản sao của PDF nguồn với báo cáo preflight được nối thêm dưới dạng khối chú thích kiểu PDF, trong đó payload là XMP / RDF (xmlns:hotpdf="http://www.loslab.com/hotpdf/preflight/") Mỗi dòng báo cáo trở thành một phần tử hotpdf:<name> với mức độ nghiêm trọng được mang dưới dạng thuộc tính ở các dòng kiểm tra Các công cụ hiểu XMP quét tệp để tìm dấu xpacket có thể hiển thị báo cáo nhúng; trình đọc PDF vẫn bỏ qua phần byte nối thêm vì chúng nằm ngoài đồ thị object Đây cố ý không phải là một tích hợp XMP đúng chuẩn: payload XMP không được tham chiếu từ mục /Metadata trong catalog, nên các trình đọc XMP chỉ theo liên kết catalog sẽ không thấy nó

ConvertPreflightReportToVeraPDFStyle biến một báo cáo preflight của HotPDF thành tài liệu JSON đi theo khung tổng quát của đầu ra xác thực veraPDF, với trường cấp cao profile, mảng jobs chứa itemDetails / taskResult / validationResult và mảng ruleViolations dưới validationResult.details Đây là dạng giống phong cách veraPDF chứ không tương thích dây dẫn với veraPDF; mục tiêu là để các công cụ phía sau vốn đã tiêu thụ JSON của veraPDF có thể thích ứng với đầu ra HotPDF bằng cách đổi tên trường tối thiểu thay vì phải học lại một bố cục dữ liệu hoàn toàn khác

Ví dụ

var
  PDF: THotPDF;
begin
  PDF := THotPDF.Create(nil);
  try
    PDF.SavePreflightReport('Input.pdf', 'PreflightReport.txt');
    PDF.SavePreflightReport('Encrypted.pdf', 'EncryptedReport.txt', 'user-password');
    PDF.SavePreflightReport('Input.pdf', 'PreflightReport.json', '', pfJSON);
    PDF.SavePreflightReport('Input.pdf', 'PreflightReport.html', '', pfHTML);
    PDF.SavePreflightReport('Input.pdf', 'PreflightReport.csv', '', pfCSV);
    PDF.EmbedPreflightReportInPDF('Input.pdf', 'Input-with-report.pdf');
    if not PDF.LoadAndValidatePreflightReport(
      'Input-with-report.pdf', OriginalReport, CurrentReport)
    then
      WriteLn('Embedded preflight report no longer matches the source.');
  finally
    PDF.Free;
  end;
end;

Xem thêm