Html to image using javascript

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

✂️ Generates an image from a DOM node using HTML5 canvas and SVG.

License

bubkoo/html-to-image

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

✂️ Generates an image from a DOM node using HTML5 canvas and SVG.

Fork from dom-to-image with more maintainable code and some new features.

npm install --save html-to-image
/* ES6 */ import * as htmlToImage from 'html-to-image'; import  toPng, toJpeg, toBlob, toPixelData, toSvg > from 'html-to-image'; /* ES5 */ var htmlToImage = require('html-to-image');

All the top level functions accept DOM node and rendering options, and return a promise fulfilled with corresponding dataURL:

Go with the following examples.

Get a PNG image base64-encoded data URL and display it right away:

var node = document.getElementById('my-node'); htmlToImage.toPng(node) .then(function (dataUrl)  var img = new Image(); img.src = dataUrl; document.body.appendChild(img); >) .catch(function (error)  console.error('oops, something went wrong!', error); >);

Get a PNG image base64-encoded data URL and download it (using download):

htmlToImage.toPng(document.getElementById('my-node')) .then(function (dataUrl)  download(dataUrl, 'my-node.png'); >);

Get an SVG data URL, but filter out all the elements:

function filter (node)  return (node.tagName !== 'i'); > htmlToImage.toSvg(document.getElementById('my-node'),  filter: filter >) .then(function (dataUrl)  /* do something */ >);

Save and download a compressed JPEG image:

htmlToImage.toJpeg(document.getElementById('my-node'),  quality: 0.95 >) .then(function (dataUrl)  var link = document.createElement('a'); link.download = 'my-image-name.jpeg'; link.href = dataUrl; link.click(); >);

Get a PNG image blob and download it (using FileSaver):

htmlToImage.toBlob(document.getElementById('my-node')) .then(function (blob)  if (window.saveAs)  window.saveAs(blob, 'my-node.png'); > else  FileSaver.saveAs(blob, 'my-node.png'); > >);

Get a HTMLCanvasElement, and display it right away:

htmlToImage.toCanvas(document.getElementById('my-node')) .then(function (canvas)  document.body.appendChild(canvas); >);

Get the raw pixel data as a Uint8Array with every 4 array elements representing the RGBA data of a pixel:

var node = document.getElementById('my-node'); htmlToImage.toPixelData(node) .then(function (pixels)  for (var y = 0; y  node.scrollHeight; ++y)  for (var x = 0; x  node.scrollWidth; ++x)  pixelAtXYOffset = (4 * y * node.scrollHeight) + (4 * x); /* pixelAtXY is a Uint8Array[4] containing RGBA values of the pixel at (x, y) in the range 0..255 */ pixelAtXY = pixels.slice(pixelAtXYOffset, pixelAtXYOffset + 4); > > >);
import React,  useCallback, useRef > from 'react'; import  toPng > from 'html-to-image'; const App: React.FC = () =>  const ref = useRefHTMLDivElement>(null) const onButtonClick = useCallback(() =>  if (ref.current === null)  return > toPng(ref.current,  cacheBust: true, >) .then((dataUrl) =>  const link = document.createElement('a') link.download = 'my-image-name.png' link.href = dataUrl link.click() >) .catch((err) =>  console.log(err) >) >, [ref]) return ( > div ref=ref>> /* DOM nodes you want to convert to PNG */> /div> button onClick=onButtonClick>>Click me/button> /> ) >
(domNode: HTMLElement) => boolean

A function taking DOM node as argument. Should return true if passed node should be included in the output. Excluding node means excluding it’s children as well.

You can add filter to every image function. For example,

const filter = (node: HTMLElement) =>  const exclusionClasses = ['remove-me', 'secret-div']; return !exclusionClasses.some((classname) => node.classList?.contains(classname)); > htmlToImage.toJpeg(node,  quality: 0.95, filter: filter>);
htmlToImage.toPng(node, filter:filter>)

Not called on the root node.

A string value for the background color, any valid CSS color value.

Width and height in pixels to be applied to node before rendering.

Allows to scale the canva’s size including the elements inside to a given width and height (in pixels).

An object whose properties to be copied to node’s style before rendering. You might want to check this reference for JavaScript names of CSS properties.

A number between 0 and 1 indicating image quality (e.g. 0.92 => 92% ) of the JPEG image.

Set to true to append the current time as a query string to URL requests to enable cache busting.

Set false to use all URL as cache key. If the value has falsy value, it will exclude query params from the provided URL.

A data URL for a placeholder image that will be used when fetching an image fails.

Defaults to an empty string and will render empty areas for failed images.

The pixel ratio of the captured image. Default use the actual pixel ratio of the device. Set 1 to use as initial-scale 1 for the image.

The format required for font embedding. This is a useful optimisation when a webfont provider specifies several different formats for fonts in the CSS, for example:

@font-face < name: 'proxima-nova'; src: url(". ") format("woff2"), url(". ") format("woff"), url(". ") format("opentype"); >

Instead of embedding each format, all formats other than the one specified will be discarded. If this option is not specified then all formats will be downloaded and embedded.

When supplied, the library will skip the process of parsing and embedding webfont URLs in CSS, instead using this value. This is useful when combined with getFontEmbedCSS() to only perform the embedding process a single time across multiple calls to library functions.

const fontEmbedCss = await htmlToImage.getFontEmbedCSS(element1); html2Image.toSVG(element1,  fontEmbedCss >); html2Image.toSVG(element2,  fontEmbedCss >);

When supplied, the library will skip the process of scaling extra large doms into the canvas object. You may experience loss of parts of the image if set to true and you are exporting a very large image.

A string indicating the image format. The default type is image/png; that type is also used if the given type isn’t supported. When supplied, the toCanvas function will return a blob matching the given image type and quality.

Only standard lib is currently used, but make sure your browser supports:

It’s tested on latest Chrome, Firefox and Safari (49, 45 and 16 respectively at the time of writing), with Chrome performing significantly better on big DOM trees, possibly due to it’s more performant SVG support, and the fact that it supports CSSStyleDeclaration.cssText property.

Internet Explorer is not (and will not be) supported, as it does not support SVG tag.

There might some day exist (or maybe already exists?) a simple and standard way of exporting parts of the HTML to image (and then this script can only serve as an evidence of all the hoops I had to jump through in order to get such obvious thing done) but I haven’t found one so far.

This library uses a feature of SVG that allows having arbitrary HTML content inside of the tag. So, in order to render that DOM node for you, following steps are taken:

  1. Clone the original DOM node recursively
  2. Compute the style for the node and each sub-node and copy it to corresponding clone
    • and don’t forget to recreate pseudo-elements, as they are not cloned in any way, of course
  3. Embed web fonts
    • find all the @font-face declarations that might represent web fonts
    • parse file URLs, download corresponding files
    • base64-encode and inline content as dataURLs
    • concatenate all the processed CSS rules and put them into one element, then attach it to the clone
  4. Embed images
    • embed image URLs in elements
    • inline images used in background CSS property, in a fashion similar to fonts
  5. Serialize the cloned node to XML
  6. Wrap XML into the tag, then into the SVG, then make it a data URL
  7. Optionally, to get PNG content or raw pixel data as a Uint8Array, create an Image element with the SVG as a source, and render it on an off-screen canvas, that you have also created, then read the content from the canvas
  8. Done!
  • If the DOM node you want to render includes a element with something drawn on it, it should be handled fine, unless the canvas is tainted — in this case rendering will rather not succeed.
  • Rendering will failed on huge DOM due to the dataURI limit varies.

Please let us know how can we help. Do check out issues for bug reports or suggestions first.

To become a contributor, please follow our contributing guide.

The scripts and documentation in this project are released under the MIT License

Источник

JavaScript: HTML/CSS to Image

For more details on how this works, see Creating an image.

Example API response:

Image generated with JavaScript. Convert HTML to an image using JavaScript.

Authentication with JavaScript

Your username is your User ID and your password is your API Key. Both of these are available from the dashboard. The JavaScript code sample demonstrates how to authenticate your request.

You can signup for a free API key to get started.

JavaScript example code

This JavaScript code example sends an HTTP POST to the https://hcti.io/v1/image API. Converting your HTML/CSS to an image with JavaScript.

This example uses the Request client. Install with npm install request .

const request = require('request') // Define your HTML/CSS const data = < html: "
JavaScript ✅
", css: ".box < border: 4px solid #03B875; padding: 20px; font-family: 'Roboto'; >", google_fonts: "Roboto" > // Create an image by sending a POST to the API. // Retrieve your api_id and api_key from the Dashboard. https://htmlcsstoimage.com/dashboard request.post(< url: 'https://hcti.io/v1/image', form: data>) .auth(API_ID, API_KEY) .on('data', function(data) < console.log(JSON.parse(data)) >) //

To see all of the available parameters, see: Creating an image.

Can I use this in a browser?

We recommend only using the API server-side. This is important because it keeps your API key secret. If you expose them in the browser, they can be used by anyone.

JavaScript example — async/await

If your code supports async/await, we recommend using the following.

This example uses the axios package. Install with npm install axios .

const axios = require('axios'); async function createImage() < const payload = < html: "
Test
", css: "div < background-color: blue; >" >; let headers = < auth: < username: 'user-id', password: 'api-key' >, headers: < 'Content-Type': 'application/json' >> try < const response = await axios.post('https://hcti.io/v1/image', JSON.stringify(payload), headers); console.log(response.data.url); >catch (error) < console.error(error); >> createImage();

Plain JavaScript (Node.js) example

If you prefer not to install an HTTP library for making the request. This example shows you how to use the API without any dependencies.

const https = require('https') const data = JSON.stringify(< html: "
JavaScript ✅
", css: ".box < border: 4px solid #03B875; padding: 20px; font-family: 'Roboto'; >", google_fonts: "Roboto" >) // Retrieve your api_id and api_key from the Dashboard. https://htmlcsstoimage.com/dashboard const apiId = "your-api-id" const apiKey = "your-api-key" const options = < hostname: 'hcti.io', port: 443, path: '/v1/image', method: 'POST', headers: < 'Content-Type': 'application/json', 'Authorization': 'Basic ' + new Buffer(apiId + ':' + apiKey).toString('base64') >> const req = https.request(options, (res) => < console.log(`statusCode: $`) res.on('data', (d) => < const image = JSON.parse(d) console.log(image["url"]) >) >) req.on('error', (error) => < console.error(error) >) req.write(data) req.end()

Client side JavaScript example with Fetch API

  • Use the Fetch API to make an HTTP POST request to the API
  • Supported by modern browsers
  • Recommended for internal applications only to keep your API key safe
const json = < html: "
Hello, world!
", css: ".test < background-color: green; >" >; const username = "user-id"; const password = "api-key"; const options = < method: 'POST', body: JSON.stringify(json), headers: < 'Content-Type': 'application/json', 'Authorization': 'Basic ' + btoa(username + ":" + password) >> fetch('https://hcti.io/v1/image', options) .then(res => < if (res.ok) < return res.json(); >else < return Promise.reject(res.status); >>) .then(data => < // Image URL is available here console.log(data.url) >) .catch(err => console.error(err));

Need help?

Talk to a human. Please email us support@htmlcsstoimage.com with any questions and we’ll gladly help you get started.

Built with extensive integration tests and serious care for developer happiness.
© 2018-2023 Code Happy, LLC.

Page last modified: Jul 4 2023 at 03:43 PM .

Источник

Читайте также:  Увеличение числа в питоне
Оцените статью