TPDFlibSignDoc
Security and Signatures
Descrição
TPDFlibSignDoc dá acesso direto aos campos de assinatura de um documento sem carregar o PDF completo em memória
A classe abre um ficheiro, um stream da propriedade de quem chama ou uma cadeia de bytes ANSI, enumera os campos de assinatura do AcroForm e lê os valores em bruto de uma assinatura existente para que um verificador possa recalcular o digest de /ByteRange
Faz também o lado da escrita das atualizações incrementais: o Append inicia uma revisão nova, o AddSignatureField regista um campo novo, e a família SetSignatureValue escreve no espaço reservado mantendo as revisões anteriores intactas
A demo SigningWorkbench conduz esta classe de princípio a fim, 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 ficheiro, um stream ou uma cadeia ANSI em memória, opcionalmente para acesso de leitura-escrita; o Open aceita uma palavra-passe e uma bandeira de leitura-escrita |
|---|---|
| Append, AppendToFile, AppendToStream | Inicia uma revisão incremental nova no próprio documento, ou acrescenta a revisão a um novo ficheiro ou stream |
| Close | Liberta o smart reader subjacente e os handles do documento |
| AddSignatureField | Regista um campo de assinatura novo na página indicada e devolve o número de objeto deste, ou 0 em caso de falha |
| HasSignatureField | True quando existe um campo de assinatura com o nome completamente 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 em bruto selecionados por ValueKey: 0 = /Contents, 1 = /Cert, 2 = /Filter, 3 = /SubFilter, 11 a 14 = entradas 0 a 3 de /ByteRange como cadeias 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 num registo de relatório |
| GetSignatureSeedValueEx | Lê o dicionário de seed values /SV que restringe o que um signatário pode escrever no campo |
| GetSignatureContentsHashHexByName | Digest hexadecimal dos conteúdos assinados abrangidos pelo ByteRange |
| SetSignatureValue | Escreve uma assinatura concluída no espaço reservado de /Contents e regista o nível DocMDP |
| SetSignatureFieldLock | Escreve um dicionário de bloqueio de campo 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 apenas de texto construído em v3.221.0 e limites explícitos do campo |
| GetDocumentBytes, GetDocumentSize, ReadDocumentRange | Acesso em bruto aos bytes subjacentes para que o ficheiro inteiro ou um segmento do ByteRange possa ter o hash calculado do exterior |
| GetDSSValidationMaterial | Devolve os certificados DSS, as CRL e as respostas OCSP de um campo e comunica se foi usada evidência VRI |
| SetSignatureFlags, EnsurePAdESExtensions | Ajustam /SigFlags e adicionam o esquema de extensão ETSI PAdES |
Parâmetros
| IsOpen | True entre uma abertura bem-sucedida e o Close |
|---|---|
| SignatureFieldPosition | Desvio no ficheiro dos conteúdos do campo de assinatura selecionado |
| SignatureFieldLength | Comprimento em bytes reservado para os conteúdos da assinatura selecionada |
Observações
O ficheiro inteiro é materializado pelo GetDocumentBytes porque os dois segmentos do ByteRange juntos cobrem praticamente todo o ficheiro
Para assinar sem tocar nesta superfície de baixo nível, a fachada expõe o pipeline equivalente através das funções SignProcess documentadas
Consulte também
TPDFlibSignatureVerifier, TPDFlibPFXFile, TPDFlibSigner, NewSignProcessFromFile, GetSignProcessByteRange