Referencia de Interfaces
El módulo Contracts (TcpdfNext\Contracts) define las interfaces compartidas contra las que programan todos los módulos de TCPDF-Next. Al depender de contratos en lugar de clases concretas puedes sustituir dobles de prueba, crear implementaciones alternativas y mantener una API pública estable entre versiones mayores.
PdfDocumentInterface
Namespace: TcpdfNext\Contracts\PdfDocumentInterface
El contrato API principal implementado por Document. Cualquier clase que cumpla esta interface puede usarse como reemplazo directo del modelo de documento integrado.
Métodos
Ejemplo
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 la carga, registro, subsetting y búsqueda de métricas de fuentes. El FontManager integrado implementa esta interface, pero puedes proporcionar una implementación personalizada para fuentes de origen especializado.
Métodos
Ejemplo
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 el contrato para cualquier proveedor de firma digital. Implementa esta interface para integrarte con certificados de software, bóvedas de claves en la nube o módulos de seguridad de hardware (HSMs).
Métodos
Ejemplo
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
Extiende SignerInterface para módulos de seguridad de hardware que nunca exponen la clave privada. En lugar de firmar datos sin procesar, el HSM firma un digest precomputado.
Métodos
Todos los métodos de SignerInterface, más:
Ejemplo
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'; }
}Uso de interfaces para testing
Las cuatro interfaces están diseñadas para ser fácilmente mockeables con PHPUnit o 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);
}
}Ver también
- Resumen API -- Todos los paquetes de un vistazo
- Referencia de Enums -- Enums usados por estas interfaces (Orientation, Alignment, OutputDestination)
- API de Document -- La clase concreta que implementa PdfDocumentInterface
- Guía de Seguridad -- Guía completa de cifrado y firmas digitales