Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/plotdb/pageshot
api + server for taking (multi-)website screenshot in png / pdf formats
https://github.com/plotdb/pageshot
pdf screenshot
Last synced: about 2 months ago
JSON representation
api + server for taking (multi-)website screenshot in png / pdf formats
- Host: GitHub
- URL: https://github.com/plotdb/pageshot
- Owner: plotdb
- Created: 2020-02-15T15:44:09.000Z (almost 5 years ago)
- Default Branch: master
- Last Pushed: 2023-03-04T06:03:26.000Z (almost 2 years ago)
- Last Synced: 2023-09-20T08:59:15.209Z (over 1 year ago)
- Topics: pdf, screenshot
- Language: CSS
- Homepage:
- Size: 1.34 MB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
Awesome Lists containing this project
README
# pageshot
simple express server and APIs powered by puppeteer for following purpose:
- web page screenshot
- web page to pdf
- pdf merge## Security Note
Puppeteer runs headless browser which can access content within intranet, and thus might be vulnerable to [SSRF](https://en.wikipedia.org/wiki/Server-side_request_forgery) exploit. To accept arbitrary user input, try running pageshot server in a container with proper network configuration.
## Usage
install:
npm install --save @plotdb/pageshot
run api server:
npx pageshot -p
this will start a screenshot server listening to specific port.
To take a screenshot, send a POST request to `/api/screenshot` with a payload in below format:
{ url: "url-to-screenshot"}
or
{ html: "code-to-render" }
For example:
payload = {url: "https://google.com"}
ld$.fetch "http://localhost:9010/api/", {method: \POST}, {json: payload}
.then -> it.arrayBuffer!
.then -> URL.createObjectURL(new Blob([new Uint8Array(it, 0, it.length)], {type: "image/png"}))
.then (url) ->
img = new Image!
img.src = urlThere are 3 api curently available:
- POST `/api/screenshot` - taking screenshot in png format.
- POST `/api/print` - taking screenshot in pdf format. input similar to `/api/screenshot`.
- POST `/api/merge` - merge multiple document into one pdf. payload format:
- `list`: a list of documents to merge. Each is an object with following format:
- `html`: html code to print and merge.
- `url`: url for web page to print and merge. omitted when `html` is available
- `pdffile`: file path for pdf file to merge.
- `pdflink`: url for pdf file to merge.
- note: `pdffile` and `pdflink` only work in nodeJS API when calling with `trust-input` set to true. see `API`.## API
`@plotdb/pageshot` also provides JS api for those http api counterpart. To use JS api, first init a `pageshot` page mananger:
require! <[pageshot]>
ss = new pageshot( opt )options:
* count - size of page pool. default 4, max 20.
screenshot object API:
* init - initialize page manager. must be called before used.
* shot(payload) - take a screenshot, return Buffer of the image in PNG format.
* get - get a page handler. must free it after using. return an object as:
- busy - is this page occupied
- page - the page object. check puppeteer for more information. sample usage:
- page.setContent "some html code", {waitUntil, "domcontentloaded"}
- page.goto "some-url"
* free(obj) - free this page.
* print({url, html}): print specific document.
* screenshot({url, html}): screenshot specific document.
* merge(payload, trustInput): merge multiple document.
- `payload`: as described in previous section.
- `trustInput`: default false. when set to true, `pdffile` and `pdflink` options are enabled.Sample usage:
lc = {}
ps = new pageshot!
ps.init!
# take a screenshot of google.com through ps.screenshot API
.then -> ps.screenshot url: "https://google.com"
.then -> fs.write-file-sync "out.png", it# ... or, manually operate the page instance
.then -> ps.get!
.then (obj) ->
lc.obj = obj
# either one of following
# obj.page.setContent html, {waitUntil: "domcontentloaded"}
# obj.page.goto url
.then -> lc.obj.page.screenshot!
.then -> ps.free lc.obj## PDF Merge
PDF merging is provided by `easy-pdf-merge`, which in turn depends on related `java` package. Java is needed for using this functionality, and can be installed via following commands:
wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | sudo apt-key add -
sudo apt-get install software-properties-common
sudo add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
sudo apt-get update && sudo apt-get install adoptopenjdk-8-hotspot## Font
When generating documents with CJK characters, you may want to install related fonts in your system:
sudo apt-get fonts-noto-cjk
## License
MIT