stellair-pdf-compressor
v1.1.11
Published
StellairPdfCompressor exported as ES modules.
Downloads
93
Readme
Context
This project proposes a local PDF compression that can be used as a remote API.
This project is a fork of another projet: https://github.com/laurentmmeyer/ghostscript-pdf-compress.wasm (itself based on the gs.wasm that @ochachacha compiled).
Run the project
Just add the following code in one of your file to use the PDF compression as a remote API (even if it will run locally)
const libBaseUrl = 'https://unpkg.com/[email protected]';
function loadPDFDataFromWorker(response) {
return new Promise((resolve, reject) => {
if (response === null) {
reject('Compression failure');
} else {
const xhr = new XMLHttpRequest();
xhr.open('GET', response);
xhr.responseType = 'arraybuffer';
xhr.onload = () => {
window.URL.revokeObjectURL(response);
const blob = new Blob([xhr.response], { type: 'application/pdf' });
const pdfURL = window.URL.createObjectURL(blob);
const size = xhr.response.byteLength;
resolve({ pdfURL, size });
};
xhr.send();
}
});
}
export async function compress(pdf, params = []) {
const script = await fetch(`${libBaseUrl}/background-worker.js`);
const scriptContent = await script.text();
if (!script.ok) {
return Promise.reject(`Unable to load script (${scriptContent})`);
}
const blob = new Blob([scriptContent], { type: 'application/javascript' });
const blobURL = URL.createObjectURL(blob);
const worker = new Worker(blobURL, { type: 'module', name: 'pdfWorker' });
worker.postMessage({ data: { psDataURL: pdf, params, baseUrl: libBaseUrl }, target: 'wasm' });
const promise = new Promise((resolve) => {
const listener = (e) => {
resolve(e.data);
worker.removeEventListener('message', listener);
setTimeout(() => worker.terminate(), 0);
};
worker.addEventListener('message', listener);
});
const data = await promise;
return loadPDFDataFromWorker(data);
}The exported function compress take 2 arguments:
- The first one is the url of an object created by
window.URL.createObjectURL() - The second one is a list of parameters allowing to set up the pdf. The list of suppported arguments can be found at https://ghostscript.readthedocs.io/en/latest/VectorDevices.html#distiller-parameters
The script calls the function
gs -sDEVICE=pdfwrite and appends the arguments you give.
The function returns an object containing 2 attributes:
- pdfURL
- size
pdfURL is the url of the new compressed pdf (created by window.URL.createObjectURL())
size is the size of the new pdf (in bytes)
