|
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
|