{"id":39582784,"url":"https://github.com/ssnangua/sharp-pdf","last_synced_at":"2026-01-18T07:31:44.608Z","repository":{"id":61330012,"uuid":"550571769","full_name":"ssnangua/sharp-pdf","owner":"ssnangua","description":"Export images from a PDF file, or generate a PDF file from images. Base on sharp, PDF.js(for parsing PDFs) and jsPDF(for generate PDFs).","archived":false,"fork":false,"pushed_at":"2022-11-10T20:18:33.000Z","size":209,"stargazers_count":6,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-09T15:56:04.835Z","etag":null,"topics":["export-image","image","pdf","sharp"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ssnangua.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-10-13T01:39:31.000Z","updated_at":"2024-11-20T11:31:38.000Z","dependencies_parsed_at":"2022-10-15T05:32:09.941Z","dependency_job_id":null,"html_url":"https://github.com/ssnangua/sharp-pdf","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ssnangua/sharp-pdf","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssnangua%2Fsharp-pdf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssnangua%2Fsharp-pdf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssnangua%2Fsharp-pdf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssnangua%2Fsharp-pdf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ssnangua","download_url":"https://codeload.github.com/ssnangua/sharp-pdf/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssnangua%2Fsharp-pdf/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28533167,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["export-image","image","pdf","sharp"],"created_at":"2026-01-18T07:31:44.446Z","updated_at":"2026-01-18T07:31:44.567Z","avatar_url":"https://github.com/ssnangua.png","language":"JavaScript","readme":"# sharp-pdf\n\nExport images from a PDF file, or generate a PDF file from images.\n\nBase on [sharp](https://www.npmjs.com/package/sharp), [PDF.js](https://www.npmjs.com/package/pdfjs-dist)(for parsing PDFs) and [jsPDF](https://www.npmjs.com/package/jspdf)(for generate PDFs).\n\n## Install\n\n```bash\nnpm install sharp-pdf\n```\n\n## Export images from a PDF file\n\n### `PDF.sharpsFromPdf(src, options?): Promise\u003cImageData[]\u003e`\n\n- `src` [GetDocumentParameters](https://github.com/mozilla/pdfjs-dist/blob/master/types/src/display/api.d.ts#L190) - String containing the filesystem path to a PDF file, or a [DocumentInitParameters](https://github.com/mozilla/pdfjs-dist/blob/master/types/src/display/api.d.ts#L10) object.\n- `options` Object _(optional)_\n  - `sharpOptions` Object _(optional)_ - Sharp constructor [options](https://sharp.pixelplumbing.com/api-constructor#parameters).\n  - `delay` Number _(optional)_ - Number of milliseconds to delay (setTimeout) after an image is parsed. If you need to show progress on the UI (electron/nwjs), you can use this option to avoid blocking. Default by `-1` (no delay).\n  - `workerSrc` Boolean _(optional)_ - Set `GlobalWorkerOptions.workerSrc` to `pdf.worker.entry`. Default by `false`.\n  - `handler` (event, data) =\u003e void _(optional)_\n    - \"loading\" - PDF file loading progress, data is an object containing `total` number of bytes and `loaded` number of bytes.\n    - \"loaded\" - PDF file loaded, data is an object containing `pages` info.\n    - \"image\" - Image parsing complete, data is the [ImageData](#imagedata).\n    - \"skip\" - Skip an invalid image.\n    - \"error\" - An image parsing error occurs, data is an object containing the `error` info.\n    - \"done\" - All images are parsed, data is an array containing all [ImageData](#imagedata).\n\nReturns `Promise\u003cImageData[]\u003e` - Resolve with an array of object containing the following info:\n\n#### `ImageData`\n\n- `image` Sharp - Instance of sharp.\n- `name` String - Image name.\n- `width` Number - Image width in pixels.\n- `height` Number - Image height in pixels.\n- `channels` Number - Number of channels.\n- `size` Number - Total size of image in bytes.\n- `pages` Number - Number of pages.\n- `pageIndex` Number - Page index.\n- `pageImages` Number - Number of images in page.\n- `pageImageIndex` Number - Image index in page.\n\n```js\nconst PDF = require(\"sharp-pdf\");\n\nPDF.sharpsFromPdf(\"./input.pdf\").then((images) =\u003e {\n  images.forEach(({ image, name, channels }) =\u003e {\n    const ext = channels \u003e 3 ? \".png\" : \".jpg\";\n    image.toFile(`./${name}${ext}`);\n  });\n});\n\n// progress\nPDF.sharpsFromPdf(\"./input.pdf\", {\n  handler(event, data) {\n    if (event === \"loading\") {\n      console.log(\"loading PDF:\", (data.loaded / data.total) * 100);\n    } else if (event === \"loaded\") {\n      console.log(\"PDF loaded\");\n    } else if (event === \"image\" || event === \"skip\" || event === \"error\") {\n      console.log(\"parsing images:\", (data.pageIndex / data.pages) * 100);\n    } else if (event === \"done\") {\n      console.log(\"done\");\n    }\n  },\n});\n\n// load a password protected PDF\nPDF.sharpsFromPdf({\n  url: \"./input.pdf\",\n  password: \"ssnangua\",\n});\n```\n\n## Generate a PDF file from images\n\n### `PDF.sharpsToPdf(images, output, options?): Promise\u003cObject\u003e`\n\n- `images` Array\u003cSharp | Object\u003e\n  - `image` Sharp - Sharp instance.\n  - `options` [ImageOptions](#imageoptions) _(optional)_ - Image options.\n- `output` String | { type, options } - The path to write the PDF file to, or an object contains [jsPDF.output(type, options)](http://raw.githack.com/MrRio/jsPDF/master/docs/jsPDF.html#output) arguments.\n- `options` Object _(optional)_\n  - `pdfOptions` Object _(optional)_ - jsPDF constructor [options](http://raw.githack.com/MrRio/jsPDF/master/docs/jsPDF.html)\n  - `imageOptions` [ImageOptions](#imageoptions) _(optional)_ - Global image options.\n  - `autoSize` Boolean _(optional)_ - Set page size to image size. `pdfOptions.format` and `fit` option will not work. Default by `false`.\n  - `init` (params) =\u003e void _(optional)_\n    - `params` Object\n      - `doc` [jsPDF](http://raw.githack.com/MrRio/jsPDF/master/docs/jsPDF.html) - jsPDF instance.\n      - `pages` Number - Number of images.\n      - `pageWidth` Number - Page width in pixels.\n      - `pageHeight` Number - Page height in pixels.\n\nReturns `Promise\u003cObject\u003e` - Resolve with an object containing the PDF file `size` info or PDF document data.\n\n#### `ImageOptions`\n\n- `format` String _(optional)_ - Format of image, e.g. 'JPEG', 'PNG', 'WEBP'.\n- `x` Number _(optional)_ - Image x Coordinate in pixels. If omitted, the image will be horizontally centered.\n- `y` Number _(optional)_ - Image y Coordinate in pixels. If omitted, the image will be vertically centered.\n- `width` Number _(optional)_ - Image width in pixels. If omitted, fill the page if `fit`, otherwise use the image width.\n- `height` Number _(optional)_ - Image height in pixels. If omitted, fill the page if `fit`, otherwise use the image height.\n- `compression` \"NONE\" | \"FAST\" | \"MEDIUM\" | \"SLOW\" _(optional)_ - Compression of the generated JPEG. Default by `\"NONE\"`.\n- `rotation` Number _(optional)_ - Rotation of the image in degrees (0-359). Default by `0`.\n- `fit` Boolean _(optional)_ - Image fit to page size. Default by `false`.\n- `margin` Number _(optional)_ - Image margin (pixels). Default by `0`.\n- `handler` (params) =\u003e void _(optional)_ -\n  - `params` Object\n    - `doc` [jsPDF](http://raw.githack.com/MrRio/jsPDF/master/docs/jsPDF.html) - jsPDF instance.\n    - `pages` Number - Number of images.\n    - `pageWidth` Number - Page width in pixels.\n    - `pageHeight` Number - Page height in pixels.\n    - `index` Number - Page index.\n    - `image` Sharp - Sharp instance.\n    - `options` ImageOptions - Image options.\n    - `imageData` Buffer - A buffer containing image data.\n    - `format` String - Format of image, e.g. 'JPEG', 'PNG', 'WEBP'.\n    - `x` Number - Image x Coordinate in pixels.\n    - `y` Number - Image y Coordinate in pixels.\n    - `width` Number - Image width in pixels.\n    - `height` Number - Image height in pixels.\n\n```js\nconst fs = require(\"fs\");\nconst sharp = require(\"sharp\");\nconst PDF = require(\"sharp-pdf\");\n\nPDF.sharpsToPdf(\n  [\n    sharp(\"./image1.jpg\"),\n    sharp(\"./image2.jpg\"),\n    { image: sharp(\"./image3.jpg\"), options: {} },\n  ],\n  \"./output.pdf\"\n).then(({ size }) =\u003e {\n  console.log(size);\n});\n\n// options\nPDF.sharpsToPdf(\n  fs\n    .readdirSync(\"./Comic\")\n    .map((file) =\u003e sharp(`./Comic/${file}`).jpeg({ quality: 20 })),\n  \"./Comic.pdf\",\n  {\n    pdfOptions: {\n      format: \"b5\",\n      encryption: {\n        userPassword: \"ssnangua\",\n      },\n    },\n    imageOptions: {\n      format: \"JPEG\",\n      compression: \"FAST\",\n      fit: true,\n      handler({ index, pages }) {\n        console.log(index + 1, \"/\", pages);\n      },\n    },\n  }\n);\n\n// handler\nPDF.sharpsToPdf(\n  [\n    sharp(\"./image1.jpg\"),\n    sharp(\"./image2.jpg\"),\n    {\n      image: sharp(\"./image3.jpg\"),\n      options: {\n        // override the global handler\n        handler() {},\n      },\n    },\n  ],\n  \"./output.pdf\",\n  {\n    imageOptions: {\n      handler({ doc, ...params }) {\n        // add page number\n        const { index, pageWidth, pageHeight } = params;\n        doc.text(`- ${index + 1} -`, pageWidth / 2, pageHeight - 10, {\n          align: \"center\",\n          baseline: \"bottom\",\n        });\n\n        // return or resolve with `false`,\n        // will skip the default add image operation,\n        // and you can add image by yourself.\n        const { imageData, format, x, y, width, height } = params;\n        doc.addImage(imageData, format, x, y, width, height);\n        return false;\n        // or\n        // return new Promise(resolve =\u003e setTimeout(() =\u003e resolve(false), 100));\n      },\n    },\n  }\n);\n\n// output types\nPDF.sharpsToPdf(\n  [ sharp(\"./image1.jpg\") ],\n  { type: \"arraybuffer\" }\n).then((arraybuffer) =\u003e {\n  const buffer = Buffer.from(arraybuffer);\n  fs.writeFileSync(\"output.pdf\", buffer);\n});\n```\n\n## Reference\n\n[PDF Export Images](https://www.npmjs.com/package/pdf-export-images)\n\n\n## Change Log\n\n### 0.1.3\n\n- `sharpsFromPdf()`\n    - Added `delay` and `workerSrc` options\n    - Added `skip` event\n- `sharpsToPdf()`\n    - Added `autoSize` option\n    - Supported promise handler\n    - supported output types","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fssnangua%2Fsharp-pdf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fssnangua%2Fsharp-pdf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fssnangua%2Fsharp-pdf/lists"}