Turn a photo, screenshot, or logo into a PDF without handing the file to a server. The page is built at the image's own size, so nothing is letterboxed onto A4 and nothing is resampled on the way out.
The page is sized to the image
Most converters drop your image onto a fixed A4 or Letter page and centre it, which leaves white bars on two sides and shrinks the content. This one creates the page at the image's own pixel dimensions instead. A 1920×1080 screenshot becomes a 1920×1080 page with the image filling it edge to edge.
If you do want a standard paper size, convert first and then change the page size in the editor before downloading.
Nothing is uploaded
The file is read locally with FileReader and embedded as a data: URL. People convert signed documents, IDs, and receipts, so the file never being transmitted is the point. You can confirm it with the network tab open.
Raster stays raster, vector stays vector
A JPG, PNG, or WebP is a grid of pixels and remains one inside the PDF. An SVG is vector artwork and is kept as paths, so it stays sharp at any zoom. That distinction matters if you are producing a logo sheet rather than a photo.
The same conversion in code
import { createStore } from "polotno/model/store";
import { jsonToPDFBlob } from "@polotno/pdf-export/browser";
const store = createStore({ key: "YOUR_KEY" });
store.setSize(width, height);
store.activePage.addElement({
type: "image",
src: dataUrl,
x: 0,
y: 0,
width,
height,
});
await store.waitLoading();
const blob = await jsonToPDFBlob(store.toJSON());jsonToPDFBlob is the vector export path and keeps SVG artwork as paths. The built-in store.saveAsPDF() is the raster path, which flattens the page to an image. Full reference in PDF export, and the API version in PDF generation.
