PDFium Delphi Component Docs

带资源上限的 PDF 比对辅助函数

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;