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, OpenString | Abre 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, AppendToStream | Inicia uma revisão incremental nova no próprio arquivo, ou acrescenta a revisão a um novo arquivo ou stream |
| Close | Libera o smart reader subjacente e os handles do documento |
| AddSignatureField | Registra um campo de assinatura novo na página indicada e retorna o número de objeto dele, ou 0 em caso de falha |
| HasSignatureField | True quando existe um campo de assinatura com o nome totalmente qualificado |
| GetSignatureFieldNames | Preenche um TStrings com todos os nomes de campos de assinatura do AcroForm |
| GetSignatureValueObjNum | Número de objeto do dicionário de valor da assinatura, ou 0 quando o campo não está assinado |
| GetSignatureValueByName | Valores 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 |
| GetSignatureTextValueByName | Valores de texto selecionados por ValueKey: 0 = /M, 1 = /Name, 2 = /Reason, 3 = /Location, 4 = /ContactInfo, 5 = /Type |
| GetSignatureDocMDPLevelByName | O nível de transformação DocMDP (valor P) de uma assinatura de certificação, 0 quando ausente |
| GetSignaturePermissionInfoByName | Analisa as restrições DocMDP e FieldMDP de uma assinatura em um registro de relatório |
| GetSignatureSeedValueEx | Lê o dicionário de seed values /SV que restringe o que um signatário pode gravar no campo |
| GetSignatureContentsHashHexByName | Digest hexadecimal dos conteúdos assinados cobertos pelo ByteRange |
| SetSignatureValue | Grava uma assinatura pronta no espaço reservado de /Contents e registra o nível DocMDP |
| SetSignatureFieldLock | Grava um dicionário de field lock com uma ação e uma lista de nomes de campos |
| SetSignatureImage, SetSignatureAppearanceText, SetSignatureBounds | Controlam 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, ReadDocumentRange | Acesso bruto aos bytes subjacentes para que o arquivo inteiro ou um segmento do ByteRange possa ter hash calculado externamente |
| GetDSSValidationMaterial | Retorna os certificados DSS, as CRLs e as respostas OCSP de um campo e reporta se evidência VRI foi usada |
| SetSignatureFlags, EnsurePAdESExtensions | Ajustam /SigFlags e adicionam o schema de extensão ETSI PAdES |
Parâmetros
| IsOpen | True entre uma abertura bem-sucedida e o Close |
|---|---|
| SignatureFieldPosition | Offset no arquivo dos conteúdos do campo de assinatura selecionado |
| SignatureFieldLength | Comprimento 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