Converter · No upload

SVG to PDF, privately

Drop in SVG drawings and download a PDF of each one, rendered by your browser at the scale you choose and placed on a page of the size the file declares. The conversion runs entirely inside your browser — nothing is uploaded, the network meter below proves it live, and it keeps working with your wifi switched off.

Statusidle Files OutputPDF Network since file read

One PDF per file, rasterised at the scale you choose (3×, 288 dpi, by default) — a picture of the drawing, not its vector shapes. The page keeps the SVG's declared size at 96 pixels per inch, up to 200 inches a side — a larger page is placed smaller to fit that limit, every pixel kept, and the row says so; a file with only a viewBox is sized from the viewBox, and one with neither is refused. Text is drawn with this device's fonts. A file that references anything outside itself — an image, stylesheet or font at a web address or on a file path, or a script — is refused by name, because this page fetches nothing while it renders; a link around a shape is left alone. A file with a <foreignObject> — HTML inside the SVG, which draw.io and diagrams.net exports carry for their text labels — is refused by name, because the browser will not release the pixels of one. An animated SVG keeps only its first frame, and the row says so. A drawing too large for the browser's pixel limit is rendered at the largest scale that fits, and the row says so. Takes .svg.

How this converter works

An SVG is a description of a drawing, and a PDF can hold either a description or a picture. This page writes the picture, and says so in every row. It reads your file as text, takes the size the root element declares — width and height in any of the units the format allows, or the viewBox when those are absent — and writes that size back onto a copy as explicit pixel dimensions, because a browser asked to guess the size of an unsized SVG answers 300 × 150 and this page never lets that guess reach the output. The copy is handed to your browser's own SVG renderer as an in-memory image and drawn onto a canvas at the scale you chose; drawing the image at its destination size re-renders the shapes at that size rather than stretching a small bitmap, which is why edges at 4× are crisp rather than blurred. The pixels come off the canvas, the colour goes into one compressed stream and the transparency, where the drawing has any, into a soft mask, and both are wrapped in a single page sized to the declared dimensions — 96 pixels per inch on the file's side, 72 points per inch on the PDF's. Nothing in that path touches the network: the file is already on your machine and this site has no server to send it to.

The best evidence for that is not our instrument but your browser's. Press F12, open the Network tab, leave it visible, and run a conversion. Nothing gets added to the list. That panel is written by the people who make your browser, it records what a page actually does rather than what a page claims, and no code of ours can quiet it. This converter has one refusal that exists to keep that panel honest: an SVG loaded as an image is not allowed to fetch, so a file that references an image, a font or a stylesheet outside itself — at a web address or on a file path — renders with a grey placeholder, a blank, or a substituted font and makes no request at all — the meter would read zero on a drawing that came out incomplete. Files like that are refused before anything is drawn, with the reference named on the row, and a file containing a script is refused the same way because nothing from your file is ever run. A file that embeds HTML in a foreignObject is refused for a different reason: the browser will not let a page read the pixels back from one, so there is nothing to write. Compare notes with the methodology page, which sets out two further ways to catch us.

The honest limits: the PDF is a picture of your drawing, not the drawing. Shapes and text are pixels at the scale you chose, so they do not stay editable and do not scale without limit inside the PDF — a reader who needs true vectors should print the SVG to PDF from the browser instead, which is the job this page deliberately leaves to it. Text is drawn with the fonts on this device, so a font the file names but does not carry is substituted, and the substitute is what ends up on the page. The page takes the declared size and nothing else, up to the format's 200-inch limit, past which it is placed smaller with every pixel kept and the row says so: a file with only a viewBox is sized from it, one with no size is refused, and no paper size or margin is invented. A browser canvas has a pixel limit — 268 million pixels and 32,767 to a side is what this page allows, measured in Chrome, which hands back a blank image past its own limit rather than an error — so a large drawing at a high scale is rendered at the largest scale that fits, with the row saying which, and one that does not fit at 1× is refused rather than written blank. Where a drawing is semi-transparent, the canvas loses some colour precision in its faintest pixels on the way through, and this page does not call that path exact. Each file becomes its own one-page PDF; combining several into one document is a different job with its own decisions about order and sizing.

Frequently asked questions

Is my SVG uploaded anywhere?
No. The file is read as text by this page, drawn by your browser's own SVG renderer inside this tab, and written into a PDF here. The network meter above counts requests made after your file is read and it stays at zero — disconnect entirely and convert again if you want to see that for yourself.
Is the PDF still a vector drawing?
No, and the row says so on every conversion: rasterised, not vector. The browser draws the SVG into pixels at the scale you choose and the PDF carries that picture, so the shapes and text are no longer editable or endlessly scalable inside it. If you need a true vector PDF, open the SVG in your browser and use its print dialogue with the save-as-PDF option — the browser's print engine keeps the drawing as vectors and carries the fonts it used, which is a job this page deliberately leaves to it.
What page size do I get?
The size the SVG declares, at 96 pixels per inch. A file with width and height in mm, cm, in, pt or pc keeps that physical size — a 210 × 297 mm drawing becomes an A4 page — and one sized in pixels or plain numbers is read as CSS pixels, so a 200 × 100 file gives a 150 × 75 point page. A file with only a viewBox is sized from the viewBox, one user unit per pixel, and the row says that is what happened. A file with neither is refused, because there is no honest size to give it.
What does the scale control change?
How many pixels the drawing is rendered with, not how big the page is. The page keeps the declared size at every setting, up to PDF's limit of 14,400 points — 200 inches — a side; a larger page is placed smaller to fit, every pixel kept, and the row says so. The picture placed on it has 1×, 2×, 3× or 4× the pixels, so 3×, the default, gives 288 dpi — sharp on a print — and 1× gives a 96 dpi screen-resolution image and the smallest file. A browser canvas has a pixel limit — 268 million pixels in the Chrome this was measured in, lower in some others — so a very large drawing at a high scale is rendered at the largest scale that fits, and the row says which; one that does not fit even at 1× is refused rather than written blank.
Why was my file refused?
Because it needed something this page will not do. An SVG that references anything outside itself — an image, font or stylesheet at a web address, on a relative or absolute path, or in another file, an @import in its stylesheet — is refused by name, because a browser rendering it as an image fetches none of those and paints a grey box, or nothing at all, where the picture should be, so the meter would read zero on a page that quietly came out incomplete. A link wrapped around a shape is not a reference of that kind and is left alone. A file containing a script element is refused for the same reason: nothing from your file is run. A file with a foreignObject element — HTML embedded in the SVG, which is how draw.io and diagrams.net exports carry their text labels — is refused because the browser will not let this page read the pixels back from one; export the labels as paths or plain SVG text first. A compressed SVG, gzip bytes under an .svg name, is refused rather than decompressed. A file with no width, height or viewBox is refused because it has no size, and one that is not well-formed XML because the browser cannot draw it. Text inside an SVG is drawn with the fonts installed on this device, so a font the file names but does not carry is substituted — that is not a refusal, just something to check in the result.

Related tools