TPDFlibSignDoc

Security and Signatures

Descrição

TPDFlibSignDoc fornece acesso direto aos campos de assinatura de um documento sem carregar o PDF completo na memória

A classe abre um arquivo, um stream de propriedade de quem chama ou uma string de bytes ANSI, enumera os campos de assinatura do AcroForm e lê os valores brutos de uma assinatura existente para que um verificador possa recalcular o digest de /ByteRange

Ela também faz o lado de escrita das atualizações incrementais: Append inicia uma revisão nova, AddSignatureField registra um campo novo, e a família SetSignatureValue grava no espaço reservado mantendo as revisões anteriores intactas

A demo SigningWorkbench conduz essa classe de ponta a ponta, da enumeração de campos à inspeção do ByteRange e à extração de certificados

Sintaxe

Delphi

TPDFlibSignDoc = Class
  Public
    Destructor Destroy; Override;
    Function Open(Const FileName: WideString; Const Password: WideString; ReadWrite: Boolean): Boolean;
    Function OpenStream(SourceStream: TStream; Const Password: WideString): Boolean;
    Function OpenString(Const SourceData: AnsiString; Const Password: WideString): Boolean;
    Procedure Append;
    Function AppendToFile(Const FileName: WideString): Boolean;
    Function AppendToStream(TargetStream: TStream): Boolean;
    Procedure Close;
    Function AddSignatureField(Const FieldName: WideString; PageNumber: Integer): Integer;
    Function HasSignatureField(Const FieldName: WideString): Boolean;
    Procedure GetSignatureFieldNames(Names: TStrings);
    Function GetSignatureValueObjNum(Const FieldName: WideString): Integer;
    Function GetSignatureValueByName(Const FieldName: WideString; ValueKey: Integer): AnsiString;
    Function GetSignatureTextValueByName(Const FieldName: WideString; ValueKey: Integer): WideString;
    Function GetSignatureDocMDPLevelByName(Const FieldName: WideString): Integer;
    Function GetSignaturePermissionInfoByName(Const FieldName: WideString;
      Out Report: TPDFlibSignaturePermissionReport): Boolean;
    Function GetSignatureSeedValueEx(Const FieldName: WideString;
      Out SeedValue: TPDFSignatureSeedValue): Boolean;
    Function GetSignatureContentsHashHexByName(Const FieldName: WideString): AnsiString;
    Function SetSignatureValue(Const FieldName: WideString; Const NewValue: AnsiString;
      DocMDPLevel: Integer): Boolean;
    Function SetSignatureFieldLock(Const FieldName: WideString;
      Const Action: AnsiString; Const Fields: TArray): Boolean;
    Procedure SetSignatureImage(Const FieldName: WideString; Const ImageData: AnsiString; ImageOptions: Integer);
    Procedure SetSignatureAppearanceText(Const FieldName, Text: WideString; FontSize, FontRed, FontGreen, FontBlue: Double);
    Procedure SetSignatureBounds(Const FieldName: WideString; Left, Top, Width, Height: Double);
    Function GetDocumentBytes: TBytes;
    Function GetDocumentSize: Int64;
    Function ReadDocumentRange(Offset: Int64; Buffer: Pointer; Count: Integer): Integer;
    Function GetDSSValidationMaterial(Const FieldName: WideString;
      Out Certs, CRLs, OCSPs: TStructStrArray; Out UsedVRI: Boolean): Boolean;
    Procedure SetSignatureFlags(NewFlags: Integer);
    Procedure EnsurePAdESExtensions(ESICLevel: Integer);
    Property IsOpen: Boolean Read FIsOpen;
    Property SignatureFieldPosition: Int64 Read FSignatureFieldPosition;
    Property SignatureFieldLength: Integer Read FSignatureFieldLength;
  End;

Métodos

Open, OpenStream, OpenStringAbre um arquivo, um stream ou uma string ANSI em memória, opcionalmente para acesso de leitura-gravação; Open aceita uma senha e uma flag de leitura-gravação
Append, AppendToFile, AppendToStreamInicia uma revisão incremental nova no próprio arquivo, ou acrescenta a revisão a um novo arquivo ou stream
CloseLibera o smart reader subjacente e os handles do documento
AddSignatureFieldRegistra um campo de assinatura novo na página indicada e retorna o número de objeto dele, ou 0 em caso de falha
HasSignatureFieldTrue quando existe um campo de assinatura com o nome totalmente qualificado
GetSignatureFieldNamesPreenche um TStrings com todos os nomes de campos de assinatura do AcroForm
GetSignatureValueObjNumNúmero de objeto do dicionário de valor da assinatura, ou 0 quando o campo não está assinado
GetSignatureValueByNameValores binários brutos selecionados por ValueKey: 0 = /Contents, 1 = /Cert, 2 = /Filter, 3 = /SubFilter, 11 a 14 = entradas 0 a 3 de /ByteRange como strings decimais
GetSignatureTextValueByNameValores de texto selecionados por ValueKey: 0 = /M, 1 = /Name, 2 = /Reason, 3 = /Location, 4 = /ContactInfo, 5 = /Type
GetSignatureDocMDPLevelByNameO nível de transformação DocMDP (valor P) de uma assinatura de certificação, 0 quando ausente
GetSignaturePermissionInfoByNameAnalisa as restrições DocMDP e FieldMDP de uma assinatura em um registro de relatório
GetSignatureSeedValueExLê o dicionário de seed values /SV que restringe o que um signatário pode gravar no campo
GetSignatureContentsHashHexByNameDigest hexadecimal dos conteúdos assinados cobertos pelo ByteRange
SetSignatureValueGrava uma assinatura pronta no espaço reservado de /Contents e registra o nível DocMDP
SetSignatureFieldLockGrava um dicionário de field lock com uma ação e uma lista de nomes de campos
SetSignatureImage, SetSignatureAppearanceText, SetSignatureBoundsControlam a aparência visível: uma imagem desenhada, um appearance stream somente de texto construído em v3.221.0 e limites explícitos do campo
GetDocumentBytes, GetDocumentSize, ReadDocumentRangeAcesso bruto aos bytes subjacentes para que o arquivo inteiro ou um segmento do ByteRange possa ter hash calculado externamente
GetDSSValidationMaterialRetorna os certificados DSS, as CRLs e as respostas OCSP de um campo e reporta se evidência VRI foi usada
SetSignatureFlags, EnsurePAdESExtensionsAjustam /SigFlags e adicionam o schema de extensão ETSI PAdES

Parâmetros

IsOpenTrue entre uma abertura bem-sucedida e o Close
SignatureFieldPositionOffset no arquivo dos conteúdos do campo de assinatura selecionado
SignatureFieldLengthComprimento em bytes reservado para os conteúdos da assinatura selecionada

Observações

O arquivo inteiro é materializado pelo GetDocumentBytes porque os dois segmentos do ByteRange juntos cobrem praticamente o arquivo inteiro

Para assinar sem tocar nessa superfície de baixo nível, a facade expõe o pipeline equivalente por meio das funções SignProcess documentadas

Veja também

TPDFlibSignatureVerifier, TPDFlibPFXFile, TPDFlibSigner, NewSignProcessFromFile, GetSignProcessByteRange