FPdfDiff 实现CompareWith 所用的页面对齐、UTF-16 文本变更和连通视觉区域算法
AlignPdfDiffPages 在预算范围内通过最长公共子序列匹配文本、几何和视觉指纹完全一致的页面,再将剩余的精确匹配识别为移动,将未匹配的间隙配对为修改
重复页面的配对是确定性的;同时移动并修改的页面不保证被识别为移动
BuildPdfDiffTextChanges 返回从零开始的 UTF-16 偏移和长度;字符模式不拆分代理对,单词模式将空白与其他字符分组处理
BuildPdfDiffPixelRegions 将相连的变化图块组合成右边界和下边界不包含在内的像素矩形;区域可能包含图块内部未变化的像素
对齐最多接受每侧 4,096 页和 16,777,216 个单元;文本最多接受 65,536 个 token 和 16,777,216 个 UTF-16 单元,所选细节预算耗尽时会明确报告截断
type
TPdfDiffPageKind= (dpkMatched, dpkModified, dpkMoved, dpkInserted, dpkDeleted);
TPdfDiffTextMode= (dtmNone, dtmCharacters, dtmWords);
TPdfDiffPageSignature= record
Text: WideString;
VisualHash: UInt64;
Width, Height: Single;
Rotation: Integer;
end;
TPdfDiffPageSignatures= array of TPdfDiffPageSignature;
TPdfDiffPagePair= record
LeftPageIndex, RightPageIndex: Integer;
Kind: TPdfDiffPageKind;
end;
TPdfDiffPagePairs= array of TPdfDiffPagePair;
// Offsets and lengths count UTF-16 code units, starting at zero
TPdfDiffTextChange= record
LeftStart, LeftLength, RightStart, RightLength: Integer;
end;
TPdfDiffTextChanges= array of TPdfDiffTextChange;
TPdfDiffPixelRegion= record
Left, Top, Right, Bottom: Integer;
end;
TPdfDiffPixelRegions= array of TPdfDiffPixelRegion;
function AlignPdfDiffPages(const Left, Right: TPdfDiffPageSignatures;
MaxCells: Integer): TPdfDiffPagePairs;
function BuildPdfDiffTextChanges(const Left, Right: WideString;
Mode: TPdfDiffTextMode; MaxCells, MaxTokens: Integer;
out Truncated: Boolean): TPdfDiffTextChanges;
function BuildPdfDiffPixelRegions(const Mask: TBytes; Width, Height,
TileSize, MaxRegions: Integer; out Truncated: Boolean): TPdfDiffPixelRegions;