pdfkit/tests/unit/pattern.spec.js
Jernej Logar 4c5e73a06c
Tiling pattern support (#526) (#1311)
* tiling pattern support (foliojs#526)

based on strokovnjaka/pdfkit@b85dd55622

Co-authored-by: Jernej Logar <jernej.logar@plandela.si>
2021-10-24 07:50:52 -03:00

121 lines
2.5 KiB
JavaScript

import PDFDocument from '../../lib/document';
import { logData } from './helpers';
describe('Pattern', function() {
let document;
beforeEach(() => {
document = new PDFDocument({
info: { CreationDate: new Date(Date.UTC(2018, 1, 1)) },
compress: false
});
});
test('Uncolored tiling pattern', () => {
const docData = logData(document);
const patternStream = '1 w 0 1 m 4 5 l s 2 0 m 5 3 l s';
const binaryStream = Buffer.from(`${patternStream}\n`, 'binary');
const pattern = document.pattern([1, 1, 4, 4], 3, 3, patternStream);
document
.rect(0, 0, 100, 100)
.fill([pattern, 'blue'])
.end();
// empty resources
expect(docData).toContainChunk(['10 0 obj', `<<\n>>`]);
// pattern dictionary
expect(docData).toContainChunk([
'11 0 obj',
`<<
/Type /Pattern
/PatternType 1
/PaintType 2
/TilingType 2
/BBox [1 1 4 4]
/XStep 3
/YStep 3
/Matrix [1 0 0 -1 0 792]
/Resources 10 0 R
/Length 32
>>`,
'stream',
binaryStream,
'\nendstream'
]);
// page resource dictionary with color space and pattern
expect(docData).toContainChunk([
'6 0 obj',
`<<
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/ColorSpace <<
/CsPDeviceCMYK 8 0 R
/CsPDeviceRGB 9 0 R
>>
/Pattern <<
/P1 11 0 R
>>
>>`
]);
// map to the underlying color space
expect(docData).toContainChunk(['8 0 obj', `[/Pattern /DeviceCMYK]`]);
expect(docData).toContainChunk(['9 0 obj', `[/Pattern /DeviceRGB]`]);
// graphics
const graphicsStream = Buffer.from(
`1 0 0 -1 0 792 cm
0 0 100 100 re
/CsPDeviceRGB cs
0 0 1 /P1 scn
f\n`,
'binary'
);
expect(docData).toContainChunk([
'5 0 obj',
`<<
/Length 66
>>`,
'stream',
graphicsStream,
'\nendstream'
]);
});
test('Pattern naming', () => {
const docData = logData(document);
const pattern1 = document.pattern(
[1, 1, 4, 4],
3,
3,
'1 w 0 1 m 4 5 l s 2 0 m 5 3 l s'
);
const pattern2 = document.pattern(
[1, 1, 7, 7],
6,
6,
'1 w 0 1 m 7 8 l s 5 0 m 8 3 l s'
);
document.rect(0, 0, 100, 100).fill([pattern1, 'blue']);
document
.rect(0, 0, 100, 100)
.fill([pattern2, 'red'])
.end();
// patterns P1 and P2
expect(docData).toContainChunk([
'6 0 obj',
`<<
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/ColorSpace <<
/CsPDeviceCMYK 8 0 R
/CsPDeviceRGB 9 0 R
>>
/Pattern <<
/P1 11 0 R
/P2 13 0 R
>>
>>`
]);
});
});