import { PDFDocument } from 'pdf-lib';
import { extrahiereEingebetteteDateien } from './pdf-attachment.util';
const XML = '';
async function pdfMitAnhang(
...anhaenge: { name: string; inhalt: string }[]
): Promise {
const doc = await PDFDocument.create();
doc.addPage();
for (const a of anhaenge) {
await doc.attach(Buffer.from(a.inhalt, 'utf8'), a.name, {
mimeType: 'text/xml',
});
}
return Buffer.from(await doc.save());
}
describe('extrahiereEingebetteteDateien', () => {
it('liest einen eingebetteten ZUGFeRD-Anhang aus', async () => {
const pdf = await pdfMitAnhang({ name: 'factur-x.xml', inhalt: XML });
const dateien = await extrahiereEingebetteteDateien(pdf);
expect(dateien).toHaveLength(1);
expect(dateien[0].name).toBe('factur-x.xml');
expect(dateien[0].inhalt.toString('utf8')).toBe(XML);
});
it('liefert jeden Anhang nur einmal, obwohl er in /Names und /AF steht', async () => {
const pdf = await pdfMitAnhang(
{ name: 'xrechnung.xml', inhalt: XML },
{ name: 'anhang.txt', inhalt: 'Lieferschein' },
);
const dateien = await extrahiereEingebetteteDateien(pdf);
expect(dateien.map((d) => d.name).sort()).toEqual([
'anhang.txt',
'xrechnung.xml',
]);
});
it('liefert eine leere Liste für ein PDF ohne Anhänge', async () => {
const doc = await PDFDocument.create();
doc.addPage();
const pdf = Buffer.from(await doc.save());
expect(await extrahiereEingebetteteDateien(pdf)).toEqual([]);
});
});