216 lines
5.6 KiB
TypeScript
216 lines
5.6 KiB
TypeScript
import { PDFEmbedder, PDFExtractor, TInvoice, FacturXEncoder } from '../ts/index.js';
|
|
import * as fs from 'fs/promises';
|
|
|
|
/**
|
|
* Example demonstrating how to use the PDF handling classes
|
|
*/
|
|
async function pdfHandlingExample() {
|
|
try {
|
|
// Create a sample invoice
|
|
const invoice: TInvoice = createSampleInvoice();
|
|
|
|
// Create a Factur-X encoder
|
|
const encoder = new FacturXEncoder();
|
|
|
|
// Generate XML
|
|
const xmlContent = await encoder.encode(invoice);
|
|
console.log('Generated XML:');
|
|
console.log(xmlContent.substring(0, 500) + '...');
|
|
|
|
// Load a sample PDF
|
|
const pdfBuffer = await fs.readFile('examples/sample.pdf');
|
|
console.log(`Loaded PDF (${pdfBuffer.length} bytes)`);
|
|
|
|
// Create a PDF embedder
|
|
const embedder = new PDFEmbedder();
|
|
|
|
// Embed XML into PDF
|
|
const modifiedPdfBuffer = await embedder.embedXml(
|
|
pdfBuffer,
|
|
xmlContent,
|
|
'factur-x.xml',
|
|
'Factur-X XML Invoice'
|
|
);
|
|
console.log(`Created modified PDF (${modifiedPdfBuffer.length} bytes)`);
|
|
|
|
// Save the modified PDF
|
|
await fs.writeFile('examples/output.pdf', modifiedPdfBuffer);
|
|
console.log('Saved modified PDF to examples/output.pdf');
|
|
|
|
// Create a PDF extractor
|
|
const extractor = new PDFExtractor();
|
|
|
|
// Extract XML from the modified PDF
|
|
const extractedXml = await extractor.extractXml(modifiedPdfBuffer);
|
|
console.log('Extracted XML:');
|
|
console.log(extractedXml ? extractedXml.substring(0, 500) + '...' : 'No XML found');
|
|
|
|
// Save the extracted XML
|
|
if (extractedXml) {
|
|
await fs.writeFile('examples/extracted.xml', extractedXml);
|
|
console.log('Saved extracted XML to examples/extracted.xml');
|
|
}
|
|
|
|
console.log('PDF handling example completed successfully');
|
|
} catch (error) {
|
|
console.error('Error in PDF handling example:', error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Creates a sample invoice for testing
|
|
* @returns Sample invoice
|
|
*/
|
|
function createSampleInvoice(): TInvoice {
|
|
return {
|
|
type: 'invoice',
|
|
id: 'INV-2023-001',
|
|
invoiceType: 'debitnote',
|
|
date: Date.now(),
|
|
status: 'invoice',
|
|
versionInfo: {
|
|
type: 'final',
|
|
version: '1.0.0'
|
|
},
|
|
language: 'en',
|
|
incidenceId: 'INV-2023-001',
|
|
from: {
|
|
type: 'company',
|
|
name: 'Supplier Company',
|
|
description: 'Supplier',
|
|
address: {
|
|
streetName: 'Supplier Street',
|
|
houseNumber: '123',
|
|
postalCode: '12345',
|
|
city: 'Supplier City',
|
|
country: 'DE',
|
|
countryCode: 'DE'
|
|
},
|
|
status: 'active',
|
|
foundedDate: {
|
|
year: 2000,
|
|
month: 1,
|
|
day: 1
|
|
},
|
|
registrationDetails: {
|
|
vatId: 'DE123456789',
|
|
registrationId: 'HRB12345',
|
|
registrationName: 'Supplier Company GmbH'
|
|
}
|
|
},
|
|
to: {
|
|
type: 'company',
|
|
name: 'Customer Company',
|
|
description: 'Customer',
|
|
address: {
|
|
streetName: 'Customer Street',
|
|
houseNumber: '456',
|
|
postalCode: '54321',
|
|
city: 'Customer City',
|
|
country: 'DE',
|
|
countryCode: 'DE'
|
|
},
|
|
status: 'active',
|
|
foundedDate: {
|
|
year: 2005,
|
|
month: 6,
|
|
day: 15
|
|
},
|
|
registrationDetails: {
|
|
vatId: 'DE987654321',
|
|
registrationId: 'HRB54321',
|
|
registrationName: 'Customer Company GmbH'
|
|
}
|
|
},
|
|
subject: 'Invoice INV-2023-001',
|
|
content: {
|
|
invoiceData: {
|
|
id: 'INV-2023-001',
|
|
status: null,
|
|
type: 'debitnote',
|
|
billedBy: {
|
|
type: 'company',
|
|
name: 'Supplier Company',
|
|
description: 'Supplier',
|
|
address: {
|
|
streetName: 'Supplier Street',
|
|
houseNumber: '123',
|
|
postalCode: '12345',
|
|
city: 'Supplier City',
|
|
country: 'DE',
|
|
countryCode: 'DE'
|
|
},
|
|
status: 'active',
|
|
foundedDate: {
|
|
year: 2000,
|
|
month: 1,
|
|
day: 1
|
|
},
|
|
registrationDetails: {
|
|
vatId: 'DE123456789',
|
|
registrationId: 'HRB12345',
|
|
registrationName: 'Supplier Company GmbH'
|
|
}
|
|
},
|
|
billedTo: {
|
|
type: 'company',
|
|
name: 'Customer Company',
|
|
description: 'Customer',
|
|
address: {
|
|
streetName: 'Customer Street',
|
|
houseNumber: '456',
|
|
postalCode: '54321',
|
|
city: 'Customer City',
|
|
country: 'DE',
|
|
countryCode: 'DE'
|
|
},
|
|
status: 'active',
|
|
foundedDate: {
|
|
year: 2005,
|
|
month: 6,
|
|
day: 15
|
|
},
|
|
registrationDetails: {
|
|
vatId: 'DE987654321',
|
|
registrationId: 'HRB54321',
|
|
registrationName: 'Customer Company GmbH'
|
|
}
|
|
},
|
|
deliveryDate: Date.now(),
|
|
dueInDays: 30,
|
|
periodOfPerformance: null,
|
|
printResult: null,
|
|
currency: 'EUR',
|
|
notes: ['Thank you for your business'],
|
|
items: [
|
|
{
|
|
position: 1,
|
|
name: 'Product A',
|
|
articleNumber: 'PROD-A',
|
|
unitType: 'EA',
|
|
unitQuantity: 2,
|
|
unitNetPrice: 100,
|
|
vatPercentage: 19
|
|
},
|
|
{
|
|
position: 2,
|
|
name: 'Service B',
|
|
articleNumber: 'SERV-B',
|
|
unitType: 'HUR',
|
|
unitQuantity: 5,
|
|
unitNetPrice: 80,
|
|
vatPercentage: 19
|
|
}
|
|
],
|
|
reverseCharge: false
|
|
},
|
|
textData: null,
|
|
timesheetData: null,
|
|
contractData: null
|
|
}
|
|
} as TInvoice;
|
|
}
|
|
|
|
// Run the example
|
|
pdfHandlingExample();
|