Riferimento Interface
Il modulo Contracts (TcpdfNext\\Contracts) definisce le interface condivise contro le quali tutti i moduli TCPDF-Next programmano. Dipendendo da contratti anziché da classi concrete puoi sostituire test double, creare implementazioni alternative e mantenere un'API pubblica stabile tra versioni principali.
PdfDocumentInterface
Namespace: TcpdfNext\\Contracts\\PdfDocumentInterface
Il contratto API primario implementato da Document. Qualsiasi classe che soddisfa questa interface può essere utilizzata come sostituto drop-in per il modello di documento integrato.
Metodi
Esempio
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
Definisce caricamento, registrazione, subsetting e ricerca metriche dei font. Il FontManager integrato implementa questa interface, ma puoi fornire un'implementazione personalizzata per sorgenti font specializzate.
Metodi
Esempio
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
Definisce il contratto per qualsiasi fornitore di firma digitale. Implementa questa interface per integrarti con certificati software, key vault basati su cloud o moduli di sicurezza hardware (HSM).
Metodi
Esempio
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 per moduli di sicurezza hardware che non espongono mai la chiave privata. Invece di firmare dati grezzi, l'HSM firma un digest pre-calcolato.
Metodi
Tutti i metodi da SignerInterface, più:
Esempio
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'; }
}Utilizzo delle Interface per i Test
Tutte e quattro le interface sono progettate per essere facilmente mockabili 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);
}
}Vedi Anche
- Panoramica API -- Tutti i package a colpo d'occhio
- Riferimento Enum -- Enum utilizzati da queste interface (Orientation, Alignment, OutputDestination)
- API Document -- La classe concreta che implementa PdfDocumentInterface
- Guida Sicurezza -- Guida completa a crittografia e firme digitali