xinvoice/ts/formats/pdf/pdf.embedder.ts
2025-04-03 15:53:08 +00:00

78 lines
2.2 KiB
TypeScript

import { PDFDocument } from 'pdf-lib';
import type { IPdf } from '../../interfaces/common.js';
/**
* Class for embedding XML into PDF files
*/
export class PDFEmbedder {
/**
* Embeds XML into a PDF
* @param pdfBuffer PDF buffer
* @param xmlContent XML content to embed
* @param filename Filename for the embedded XML
* @param description Description for the embedded XML
* @returns Modified PDF buffer
*/
public async embedXml(
pdfBuffer: Uint8Array | Buffer,
xmlContent: string,
filename: string = 'invoice.xml',
description: string = 'XML Invoice'
): Promise<Uint8Array> {
try {
// Load the PDF
const pdfDoc = await PDFDocument.load(pdfBuffer);
// Convert the XML string to a Uint8Array
const xmlBuffer = new TextEncoder().encode(xmlContent);
// Make sure filename is lowercase (as required by documentation)
filename = filename.toLowerCase();
// Use pdf-lib's .attach() to embed the XML
pdfDoc.attach(xmlBuffer, filename, {
mimeType: 'application/xml',
description: description,
});
// Save the modified PDF
const modifiedPdfBytes = await pdfDoc.save();
return modifiedPdfBytes;
} catch (error) {
console.error('Error embedding XML into PDF:', error);
throw error;
}
}
/**
* Creates an IPdf object with embedded XML
* @param pdfBuffer PDF buffer
* @param xmlContent XML content to embed
* @param filename Filename for the embedded XML
* @param description Description for the embedded XML
* @param pdfName Name for the PDF
* @param pdfId ID for the PDF
* @returns IPdf object with embedded XML
*/
public async createPdfWithXml(
pdfBuffer: Uint8Array | Buffer,
xmlContent: string,
filename: string = 'invoice.xml',
description: string = 'XML Invoice',
pdfName: string = 'invoice.pdf',
pdfId: string = `invoice-${Date.now()}`
): Promise<IPdf> {
const modifiedPdfBytes = await this.embedXml(pdfBuffer, xmlContent, filename, description);
return {
name: pdfName,
id: pdfId,
metadata: {
textExtraction: ''
},
buffer: modifiedPdfBytes
};
}
}