Skip to content

Commit c8dd8a2

Browse files
authored
Update png lib (#361)
* WIP * Replace png-ts with upng-js * Fix bitsPerComponent value * Swap out "png-js" for "@pdf-lib/upng" * Add integration test 13 * Update tests
1 parent bd65cd1 commit c8dd8a2

File tree

180 files changed

+470
-147
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

180 files changed

+470
-147
lines changed

apps/node/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import test1 from './tests/test1';
77
import test10 from './tests/test10';
88
import test11 from './tests/test11';
99
import test12 from './tests/test12';
10+
import test13 from './tests/test13';
1011
import test2 from './tests/test2';
1112
import test3 from './tests/test3';
1213
import test4 from './tests/test4';
@@ -89,6 +90,8 @@ const assets = {
8990
minions_banana_alpha: readImage('minions_banana_alpha.png'),
9091
minions_banana_no_alpha: readImage('minions_banana_no_alpha.png'),
9192
small_mario: readImage('small_mario.png'),
93+
etwe: readImage('etwe.png'),
94+
self_drive: readImage('self_drive.png'),
9295
},
9396
},
9497
pdfs: {
@@ -121,7 +124,7 @@ const main = async () => {
121124
// prettier-ignore
122125
const allTests = [
123126
test1, test2, test3, test4, test5, test6, test7, test8, test9, test10,
124-
test11, test12
127+
test11, test12, test13
125128
];
126129

127130
const tests = testIdx ? [allTests[testIdx - 1]] : allTests;

apps/node/tests/test13.ts

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import fs from 'fs';
2+
3+
import { Assets } from '..';
4+
import { PDFDocument, rgb } from '../../..';
5+
6+
// prettier-ignore
7+
const pngSuite = [
8+
'PngSuite.png', 'basi0g01.png', 'basi0g02.png', 'basi0g04.png',
9+
'basi0g08.png', 'basi0g16.png', 'basi2c08.png', 'basi2c16.png',
10+
'basi3p01.png', 'basi3p02.png', 'basi3p04.png', 'basi3p08.png',
11+
'basi4a08.png', 'basi4a16.png', 'basi6a08.png', 'basi6a16.png',
12+
'basn0g01.png', 'basn0g02.png', 'basn0g04.png', 'basn0g08.png',
13+
'basn0g16.png', 'basn2c08.png', 'basn2c16.png', 'basn3p01.png',
14+
'basn3p02.png', 'basn3p04.png', 'basn3p08.png', 'basn4a08.png',
15+
'basn4a16.png', 'basn6a08.png', 'basn6a16.png', 'bgai4a08.png',
16+
'bgai4a16.png', 'bgan6a08.png', 'bgan6a16.png', 'bgbn4a08.png',
17+
'bggn4a16.png', 'bgwn6a08.png', 'bgyn6a16.png', 'ccwn2c08.png',
18+
'ccwn3p08.png', 'cdfn2c08.png', 'cdhn2c08.png', 'cdsn2c08.png',
19+
'cdun2c08.png', 'ch1n3p04.png', 'ch2n3p08.png', 'cm0n0g04.png',
20+
'cm7n0g04.png', 'cm9n0g04.png', 'cs3n2c16.png', 'cs3n3p08.png',
21+
'cs5n2c08.png', 'cs5n3p08.png', 'cs8n2c08.png', 'cs8n3p08.png',
22+
'ct0n0g04.png', 'ct1n0g04.png', 'cten0g04.png', 'ctfn0g04.png',
23+
'ctgn0g04.png', 'cthn0g04.png', 'ctjn0g04.png', 'ctzn0g04.png',
24+
'exif2c08.png', 'f00n0g08.png', 'f00n2c08.png', 'f01n0g08.png',
25+
'f01n2c08.png', 'f02n0g08.png', 'f02n2c08.png', 'f03n0g08.png',
26+
'f03n2c08.png', 'f04n0g08.png', 'f04n2c08.png', 'f99n0g04.png',
27+
'g03n0g16.png', 'g03n2c08.png', 'g03n3p04.png', 'g04n0g16.png',
28+
'g04n2c08.png', 'g04n3p04.png', 'g05n0g16.png', 'g05n2c08.png',
29+
'g05n3p04.png', 'g07n0g16.png', 'g07n2c08.png', 'g07n3p04.png',
30+
'g10n0g16.png', 'g10n2c08.png', 'g10n3p04.png', 'g25n0g16.png',
31+
'g25n2c08.png', 'g25n3p04.png', 'oi1n0g16.png', 'oi1n2c16.png',
32+
'oi2n0g16.png', 'oi2n2c16.png', 'oi4n0g16.png', 'oi4n2c16.png',
33+
'oi9n0g16.png', 'oi9n2c16.png', 'pp0n2c16.png', 'pp0n6a08.png',
34+
'ps1n0g08.png', 'ps1n2c16.png', 'ps2n0g08.png', 'ps2n2c16.png',
35+
's01i3p01.png', 's01n3p01.png', 's02i3p01.png', 's02n3p01.png',
36+
's03i3p01.png', 's03n3p01.png', 's04i3p01.png', 's04n3p01.png',
37+
's05i3p02.png', 's05n3p02.png', 's06i3p02.png', 's06n3p02.png',
38+
's07i3p02.png', 's07n3p02.png', 's08i3p02.png', 's08n3p02.png',
39+
's09i3p02.png', 's09n3p02.png', 's32i3p04.png', 's32n3p04.png',
40+
's33i3p04.png', 's33n3p04.png', 's34i3p04.png', 's34n3p04.png',
41+
's35i3p04.png', 's35n3p04.png', 's36i3p04.png', 's36n3p04.png',
42+
's37i3p04.png', 's37n3p04.png', 's38i3p04.png', 's38n3p04.png',
43+
's39i3p04.png', 's39n3p04.png', 's40i3p04.png', 's40n3p04.png',
44+
'tbbn0g04.png', 'tbbn2c16.png', 'tbbn3p08.png', 'tbgn2c16.png',
45+
'tbgn3p08.png', 'tbrn2c08.png', 'tbwn0g16.png', 'tbwn3p08.png',
46+
'tbyn3p08.png', 'tm3n3p02.png', 'tp0n0g08.png', 'tp0n2c08.png',
47+
'tp0n3p08.png', 'tp1n3p08.png', 'z00n2c08.png', 'z03n2c08.png',
48+
'z06n2c08.png', 'z09n2c08.png',
49+
];
50+
51+
export default async (assets: Assets) => {
52+
const pdfDoc = await PDFDocument.create();
53+
54+
const page = pdfDoc.addPage();
55+
56+
const solarizedWhite = rgb(253 / 255, 246 / 255, 227 / 255);
57+
page.drawRectangle({ ...page.getSize(), color: solarizedWhite });
58+
59+
const etweImg = await pdfDoc.embedPng(assets.images.png.etwe);
60+
page.drawImage(etweImg, {
61+
x: 25,
62+
y: page.getHeight() - 80,
63+
...etweImg.scale(0.2),
64+
});
65+
66+
const selfDriveImg = await pdfDoc.embedPng(assets.images.png.self_drive);
67+
page.drawImage(selfDriveImg, {
68+
x: page.getWidth() / 2,
69+
y: page.getHeight() - 80,
70+
...selfDriveImg.scale(0.7),
71+
});
72+
73+
const size = 45;
74+
let x = 25;
75+
let y = 5;
76+
for (const path of pngSuite) {
77+
const png = fs.readFileSync(`assets/images/pngsuite/${path}`);
78+
const img = await pdfDoc.embedPng(png);
79+
page.drawImage(img, { x, y, width: size, height: size });
80+
y += size + 5;
81+
if (y + size >= page.getHeight() - 80) {
82+
y = 5;
83+
x += size + 5;
84+
}
85+
}
86+
87+
const pdfBytes = await pdfDoc.save();
88+
return pdfBytes;
89+
};

apps/rn/src/components/TestLauncher.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import test9 from '../tests/test9';
2020
import test10 from '../tests/test10';
2121
import test11 from '../tests/test11';
2222
import test12 from '../tests/test12';
23+
import test13 from '../tests/test13';
2324

2425
const red = '#FF0000';
2526

@@ -69,6 +70,7 @@ export default class TestLauncher extends Component {
6970
<TestButton test={[10, test10]} />
7071
<TestButton test={[11, test11]} longRunning />
7172
<TestButton test={[12, test12]} />
73+
<TestButton test={[13, test13]} longRunning />
7274
</SafeAreaView>
7375
);
7476
}

apps/rn/src/tests/test11.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import fontkit from '@pdf-lib/fontkit';
22
import { PDFDocument, StandardFonts, last } from 'pdf-lib';
33

44
import { fetchAsset, writePdf } from './assets';
5+
56
// JavaScript's String.charAt() method doesn work on strings containing UTF-16
67
// characters (with high and low surrogate pairs), such as 💩 (poo emoji). This
78
// `glyphAtIndex()` function does.

apps/rn/src/tests/test13.js

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import { PageSizes, PDFDocument, rgb } from 'pdf-lib';
2+
3+
import { fetchAsset, writePdf } from './assets';
4+
5+
// prettier-ignore
6+
const pngSuite = [
7+
'PngSuite.png', 'basi0g01.png', 'basi0g02.png', 'basi0g04.png',
8+
'basi0g08.png', 'basi0g16.png', 'basi2c08.png', 'basi2c16.png',
9+
'basi3p01.png', 'basi3p02.png', 'basi3p04.png', 'basi3p08.png',
10+
'basi4a08.png', 'basi4a16.png', 'basi6a08.png', 'basi6a16.png',
11+
'basn0g01.png', 'basn0g02.png', 'basn0g04.png', 'basn0g08.png',
12+
'basn0g16.png', 'basn2c08.png', 'basn2c16.png', 'basn3p01.png',
13+
'basn3p02.png', 'basn3p04.png', 'basn3p08.png', 'basn4a08.png',
14+
'basn4a16.png', 'basn6a08.png', 'basn6a16.png', 'bgai4a08.png',
15+
'bgai4a16.png', 'bgan6a08.png', 'bgan6a16.png', 'bgbn4a08.png',
16+
'bggn4a16.png', 'bgwn6a08.png', 'bgyn6a16.png', 'ccwn2c08.png',
17+
'ccwn3p08.png', 'cdfn2c08.png', 'cdhn2c08.png', 'cdsn2c08.png',
18+
'cdun2c08.png', 'ch1n3p04.png', 'ch2n3p08.png', 'cm0n0g04.png',
19+
'cm7n0g04.png', 'cm9n0g04.png', 'cs3n2c16.png', 'cs3n3p08.png',
20+
'cs5n2c08.png', 'cs5n3p08.png', 'cs8n2c08.png', 'cs8n3p08.png',
21+
'ct0n0g04.png', 'ct1n0g04.png', 'cten0g04.png', 'ctfn0g04.png',
22+
'ctgn0g04.png', 'cthn0g04.png', 'ctjn0g04.png', 'ctzn0g04.png',
23+
'exif2c08.png', 'f00n0g08.png', 'f00n2c08.png', 'f01n0g08.png',
24+
'f01n2c08.png', 'f02n0g08.png', 'f02n2c08.png', 'f03n0g08.png',
25+
'f03n2c08.png', 'f04n0g08.png', 'f04n2c08.png', 'f99n0g04.png',
26+
'g03n0g16.png', 'g03n2c08.png', 'g03n3p04.png', 'g04n0g16.png',
27+
'g04n2c08.png', 'g04n3p04.png', 'g05n0g16.png', 'g05n2c08.png',
28+
'g05n3p04.png', 'g07n0g16.png', 'g07n2c08.png', 'g07n3p04.png',
29+
'g10n0g16.png', 'g10n2c08.png', 'g10n3p04.png', 'g25n0g16.png',
30+
'g25n2c08.png', 'g25n3p04.png', 'oi1n0g16.png', 'oi1n2c16.png',
31+
'oi2n0g16.png', 'oi2n2c16.png', 'oi4n0g16.png', 'oi4n2c16.png',
32+
'oi9n0g16.png', 'oi9n2c16.png', 'pp0n2c16.png', 'pp0n6a08.png',
33+
'ps1n0g08.png', 'ps1n2c16.png', 'ps2n0g08.png', 'ps2n2c16.png',
34+
's01i3p01.png', 's01n3p01.png', 's02i3p01.png', 's02n3p01.png',
35+
's03i3p01.png', 's03n3p01.png', 's04i3p01.png', 's04n3p01.png',
36+
's05i3p02.png', 's05n3p02.png', 's06i3p02.png', 's06n3p02.png',
37+
's07i3p02.png', 's07n3p02.png', 's08i3p02.png', 's08n3p02.png',
38+
's09i3p02.png', 's09n3p02.png', 's32i3p04.png', 's32n3p04.png',
39+
's33i3p04.png', 's33n3p04.png', 's34i3p04.png', 's34n3p04.png',
40+
's35i3p04.png', 's35n3p04.png', 's36i3p04.png', 's36n3p04.png',
41+
's37i3p04.png', 's37n3p04.png', 's38i3p04.png', 's38n3p04.png',
42+
's39i3p04.png', 's39n3p04.png', 's40i3p04.png', 's40n3p04.png',
43+
'tbbn0g04.png', 'tbbn2c16.png', 'tbbn3p08.png', 'tbgn2c16.png',
44+
'tbgn3p08.png', 'tbrn2c08.png', 'tbwn0g16.png', 'tbwn3p08.png',
45+
'tbyn3p08.png', 'tm3n3p02.png', 'tp0n0g08.png', 'tp0n2c08.png',
46+
'tp0n3p08.png', 'tp1n3p08.png', 'z00n2c08.png', 'z03n2c08.png',
47+
'z06n2c08.png', 'z09n2c08.png',
48+
];
49+
50+
export default async () => {
51+
const pdfDoc = await PDFDocument.create();
52+
53+
const page = pdfDoc.addPage();
54+
55+
const solarizedWhite = rgb(253 / 255, 246 / 255, 227 / 255);
56+
page.drawRectangle({ ...page.getSize(), color: solarizedWhite });
57+
58+
const etwePng = await fetchAsset(`images/etwe.png`);
59+
const etweImg = await pdfDoc.embedPng(etwePng);
60+
page.drawImage(etweImg, {
61+
x: 25,
62+
y: page.getHeight() - 80,
63+
...etweImg.scale(0.2),
64+
});
65+
66+
const selfDrivePng = await fetchAsset(`images/self_drive.png`);
67+
const selfDriveImg = await pdfDoc.embedPng(selfDrivePng);
68+
page.drawImage(selfDriveImg, {
69+
x: page.getWidth() / 2,
70+
y: page.getHeight() - 80,
71+
...selfDriveImg.scale(0.7),
72+
});
73+
74+
const size = 45;
75+
let x = 25;
76+
let y = 5;
77+
for (const path of pngSuite) {
78+
const png = await fetchAsset(`images/pngsuite/${path}`);
79+
const img = await pdfDoc.embedPng(png);
80+
page.drawImage(img, { x, y, width: size, height: size });
81+
y += size + 5;
82+
if (y + size >= page.getHeight() - 80) {
83+
y = 5;
84+
x += size + 5;
85+
}
86+
}
87+
88+
const base64Pdf = await pdfDoc.saveAsBase64({ dataUri: true });
89+
90+
return { base64Pdf };
91+
};

apps/rn/yarn.lock

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,13 @@
818818
base64-arraybuffer "^0.1.5"
819819
pako "^1.0.6"
820820

821+
"@pdf-lib/upng@^1.0.1":
822+
version "1.0.1"
823+
resolved "https://registry.yarnpkg.com/@pdf-lib/upng/-/upng-1.0.1.tgz#7dc9c636271aca007a9df4deaf2dd7e7960280cb"
824+
integrity sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==
825+
dependencies:
826+
pako "^1.0.10"
827+
821828
"@react-native-community/cli@^1.2.1":
822829
version "1.10.0"
823830
resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-1.10.0.tgz#66e3c9f407763281f7060c034145650bf0d6786c"
@@ -4714,8 +4721,8 @@ pdf-lib@./../..:
47144721
version "1.3.1"
47154722
dependencies:
47164723
"@pdf-lib/standard-fonts" "^0.0.4"
4724+
"@pdf-lib/upng" "^1.0.1"
47174725
pako "^1.0.10"
4718-
png-ts "^0.0.3"
47194726
tslib "^1.10.0"
47204727

47214728
performance-now@^2.1.0:
@@ -4777,13 +4784,6 @@ pn@^1.1.0:
47774784
resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
47784785
integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==
47794786

4780-
png-ts@^0.0.3:
4781-
version "0.0.3"
4782-
resolved "https://registry.yarnpkg.com/png-ts/-/png-ts-0.0.3.tgz#497fa90f13b9a2cdcd5a457cb1c28ab3c68ec145"
4783-
integrity sha512-Qwn3yMfbrbaN86QjrDAqD1UVJc4AV4hvBCx5Dv9libLd6D20xKtgOFs/UcvD0nnjxWlgS12kEVWCDFd9ZtwB+g==
4784-
dependencies:
4785-
pako "^1.0.6"
4786-
47874787
posix-character-classes@^0.1.0:
47884788
version "0.1.1"
47894789
resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"

apps/web/test12.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
1414
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
1515
<link rel="stylesheet" type="text/css" href="/apps/web/index.css" />
16-
<title>Test 1</title>
16+
<title>Test 12</title>
1717
<script type="text/javascript" src="/dist/pdf-lib.js"></script>
1818
<script type="text/javascript" src="/apps/web/utils.js"></script>
1919
</head>
@@ -24,7 +24,7 @@
2424
Prev
2525
</button>
2626
<button onclick="test()">Run Test</button>
27-
<button disabled onclick="window.location.href = '/apps/web/test13.html'">
27+
<button onclick="window.location.href = '/apps/web/test13.html'">
2828
Next
2929
</button>
3030
</div>

0 commit comments

Comments
 (0)