Referência de Interfaces
O módulo Contracts (TcpdfNext\Contracts) define as interfaces compartilhadas contra as quais todos os módulos TCPDF-Next programam. Ao depender de contratos em vez de classes concretas, você pode substituir test doubles, criar implementações alternativas e manter uma API pública estável entre versões principais.
PdfDocumentInterface
Namespace: TcpdfNext\Contracts\PdfDocumentInterface
O contrato principal da API implementado pelo Document. Qualquer classe que cumpra esta interface pode ser usada como substituição direta para o modelo de documento embutido.
Métodos
Exemplo
use TcpdfNext\Contracts\PdfDocumentInterface;
use TcpdfNext\Contracts\OutputDestination;
function generateReport(PdfDocumentInterface $pdf): string
{
return $pdf
->addPage()
->font('Helvetica', size: 14)
->text('Quarterly Report')
->output(OutputDestination::String);
}FontManagerInterface
Namespace: TcpdfNext\Contracts\FontManagerInterface
Define carregamento de fontes, registro, subconjuntos e busca de métricas. O FontManager embutido implementa esta interface, mas você pode fornecer uma implementação customizada para fontes de fontes especializadas.
Métodos
Exemplo
use TcpdfNext\Contracts\FontManagerInterface;
function addCustomFonts(FontManagerInterface $fonts): void
{
$fonts->registerFont('/fonts/NotoSans-Regular.ttf', 'NotoSans');
$fonts->registerFont('/fonts/NotoSans-Bold.ttf', 'NotoSans');
if ($fonts->hasFont('NotoSans', 'B')) {
$info = $fonts->getFont('NotoSans', 'B');
echo "Ascender: {$info->ascender}";
}
}SignerInterface
Namespace: TcpdfNext\Contracts\SignerInterface
Define o contrato para qualquer provedor de assinatura digital. Implemente esta interface para integrar com certificados de software, cofres de chaves baseados em nuvem ou módulos de segurança de hardware (HSMs).
Métodos
Exemplo
use TcpdfNext\Contracts\SignerInterface;
class FileSigner implements SignerInterface
{
public function __construct(
private readonly string $certPath,
private readonly string $keyPath,
private readonly string $password,
) {}
public function sign(string $data): string
{
$cert = file_get_contents($this->certPath);
$key = openssl_pkey_get_private(
file_get_contents($this->keyPath),
$this->password,
);
openssl_pkcs7_sign(/* ... */);
// Return raw signature bytes
}
public function certificate(): string { /* ... */ }
public function chain(): array { return []; }
public function estimatedSize(): int { return 8192; }
public function algorithm(): string { return 'sha256WithRSAEncryption'; }
}HsmSignerInterface
Namespace: TcpdfNext\Contracts\HsmSignerInterface
Estende SignerInterface para módulos de segurança de hardware que nunca expõem a chave privada. Em vez de assinar dados brutos, o HSM assina um digest pré-computado.
Métodos
Todos os métodos de SignerInterface, mais:
Exemplo
use TcpdfNext\Contracts\HsmSignerInterface;
class AwsCloudHsmSigner implements HsmSignerInterface
{
public function __construct(
private readonly string $keyId,
private readonly AwsKmsClient $kms,
private readonly string $certPem,
) {}
public function sign(string $data): string
{
$digest = hash('sha256', $data, binary: true);
return $this->signDigest($digest, 'sha256');
}
public function signDigest(string $digest, string $algorithm): string
{
$result = $this->kms->sign([
'KeyId' => $this->keyId,
'Message' => $digest,
'MessageType' => 'DIGEST',
'SigningAlgorithm' => 'RSASSA_PKCS1_V1_5_SHA_256',
]);
return $result['Signature'];
}
public function certificate(): string { return $this->certPem; }
public function chain(): array { return []; }
public function estimatedSize(): int { return 16384; }
public function algorithm(): string { return 'sha256WithRSAEncryption'; }
}Usando Interfaces para Testes
Todas as quatro interfaces são projetadas para serem facilmente mocáveis com PHPUnit ou Mockery.
use PHPUnit\Framework\TestCase;
use TcpdfNext\Contracts\FontManagerInterface;
class TextRendererTest extends TestCase
{
public function testCalculatesWidth(): void
{
$fonts = $this->createMock(FontManagerInterface::class);
$fonts->method('hasFont')->willReturn(true);
$fonts->method('stringWidth')
->with('Hello', 'Helvetica', 12.0, '')
->willReturn(26.64);
$renderer = new TextRenderer($fonts);
$this->assertEqualsWithDelta(26.64, $renderer->width('Hello'), 0.01);
}
}Veja Também
- Visão Geral da API -- Todos os pacotes em resumo
- Referência de Enums -- Enums usados por estas interfaces (Orientation, Alignment, OutputDestination)
- API do Document -- A classe concreta que implementa PdfDocumentInterface
- Guia de Segurança -- Guia completo de criptografia e assinaturas digitais