@pdfme/pdf-lib
Version:
Create and modify PDF files with JavaScript
146 lines (125 loc) • 4.26 kB
text/typescript
import pako from 'pako';
import {
mergeIntoTypedArray,
PDFContext,
PDFCrossRefStream,
PDFRef,
toCharCode,
} from '../../../src/index';
describe(`PDFCrossRefStream`, () => {
const context = PDFContext.create();
const dict = context.obj({});
it(`can be constructed from PDFCrossRefStream.create(...)`, () => {
expect(PDFCrossRefStream.create(dict, false)).toBeInstanceOf(
PDFCrossRefStream,
);
});
const stream1 = PDFCrossRefStream.create(dict, false);
stream1.addDeletedEntry(PDFRef.of(1, 2), 11);
stream1.addUncompressedEntry(PDFRef.of(2, 40), 30);
stream1.addCompressedEntry(PDFRef.of(21), PDFRef.of(5), 691);
const stream2 = PDFCrossRefStream.create(dict, false);
stream2.addUncompressedEntry(PDFRef.of(2), 300);
stream2.addCompressedEntry(PDFRef.of(3), PDFRef.of(10), 0);
stream2.addUncompressedEntry(PDFRef.of(9000), 600);
stream2.addCompressedEntry(PDFRef.of(9001), PDFRef.of(10), 1);
it(`can be cloned`, () => {
const original = stream1;
const clone = original.clone();
expect(clone).not.toBe(original);
expect(String(clone)).toBe(String(original));
});
it(`can be converted to a string`, () => {
expect(String(stream1)).toEqual(
'<<\n/Type /XRef\n/Length 16\n/W [ 1 1 2 ]\n/Index [ 0 3 21 1 ]\n>>\n' +
'stream\n' +
'001111111111111111010110101111100101000101011010110011' +
'\nendstream',
);
});
it(`can be converted to a string without object number 1`, () => {
expect(String(stream2)).toEqual(
'<<\n/Type /XRef\n/Length 25\n/W [ 1 2 2 ]\n/Index [ 0 1 2 2 9000 2 ]\n>>\n' +
'stream\n' +
'00011111111111111111110110000100101000110101100000100101001' +
'\nendstream',
);
});
it(`can provide its size in bytes`, () => {
expect(stream1.sizeInBytes()).toBe(95);
});
it(`can provide its size in bytes without object number 1`, () => {
expect(stream2.sizeInBytes()).toBe(110);
});
it(`can be serialized`, () => {
const buffer = new Uint8Array(stream1.sizeInBytes() + 3).fill(
toCharCode(' '),
);
// prettier-ignore
const expectedEntries = new Uint8Array([
0, 0, 255, 255,
0, 11, 0, 2,
1, 30, 0, 40,
2, 5, 2, 179,
]);
expect(stream1.copyBytesInto(buffer, 2)).toBe(95);
expect(buffer).toEqual(
mergeIntoTypedArray(
' <<\n/Type /XRef\n/Length 16\n/W [ 1 1 2 ]\n/Index [ 0 3 21 1 ]\n>>\n',
'stream\n',
expectedEntries,
'\nendstream ',
),
);
});
it(`can be serialized without object number 1`, () => {
const buffer = new Uint8Array(stream2.sizeInBytes() + 3).fill(
toCharCode(' '),
);
// prettier-ignore
const expectedEntries = new Uint8Array([
0, 0, 0, 255, 255,
1, 1, 44, 0, 0,
2, 0, 10, 0, 0,
1, 2, 88, 0, 0,
2, 0, 10, 0, 1,
]);
expect(stream2.copyBytesInto(buffer, 2)).toBe(110);
expect(buffer).toEqual(
mergeIntoTypedArray(
' <<\n/Type /XRef\n/Length 25\n/W [ 1 2 2 ]\n/Index [ 0 1 2 2 9000 2 ]\n>>\n',
'stream\n',
expectedEntries,
'\nendstream ',
),
);
});
it(`can be serialized when encoded`, () => {
const stream = PDFCrossRefStream.create(dict, true);
stream.addUncompressedEntry(PDFRef.of(2), 300);
stream.addCompressedEntry(PDFRef.of(3), PDFRef.of(10), 0);
stream.addUncompressedEntry(PDFRef.of(9000), 600);
stream.addCompressedEntry(PDFRef.of(9001), PDFRef.of(10), 1);
const buffer = new Uint8Array(stream.sizeInBytes() + 3).fill(
toCharCode(' '),
);
// prettier-ignore
const expectedEntries = new Uint8Array([
0, 0, 0, 255, 255,
1, 1, 44, 0, 0,
2, 0, 10, 0, 0,
1, 2, 88, 0, 0,
2, 0, 10, 0, 1,
]);
const encodedEntries = pako.deflate(expectedEntries);
expect(stream.copyBytesInto(buffer, 2)).toBe(135);
expect(buffer).toEqual(
mergeIntoTypedArray(
' <<\n/Type /XRef\n/Length 29\n/W [ 1 2 2 ]\n/Index [ 0 1 2 2 9000 2 ]\n/Filter /FlateDecode\n>>\n',
'stream\n',
encodedEntries,
'\nendstream ',
),
);
});
});