Photos to PDF — one A4 document, no upload

Drop a pile of JPGs, get one PDF in the order you added them. Everything is assembled in this tab, so a customer receipt never leaves your phone.

🔒 100% client-side · zero server upload

Pages

This list is the page order: drag a row, or use the arrows, to change it.

No photos yet. Add a photo and its page appears here — with the printed size, before anything is built.

    The PDF is assembled in this tab. No photo, no page and no filename is sent anywhere — you can pull the network cable out and it still works.

    Malaysian rules & edge cases

    What a Malaysian printer will actually do with it

    A4 is 210 × 297 mm — that is the paper in every office and every RM199 inkjet here, and it is what this tool makes by default. Letter (8.5 × 11 in) is a US size that most Malaysian trays do not hold; it is offered only because some bank forms are printed for it.

    • 0 mm margin does not print. Most inkjets cannot put ink on the last 3–5 mm, so a full-bleed page comes out with a white rim or a smeared edge. 10 mm is the safe default.
    • Pixels decide the sharpness. 300 dpi on A4 needs 2480 × 3508 px; 150 dpi needs 1240 × 1754 px. A phone photo is usually 3000–4000 px on the long edge, so it prints A4 comfortably. Capping the long edge at 2000 px still gives about 170 dpi — sharp for text, and a third of the file size.
    • Why the file is smaller than the photos: each photo is re-encoded on the way in. That is also what removes the GPS tag, the camera model and the timestamp — a photo taken at your shop does not carry your home address into a document you email.
    • HEIC is not an image the browser can read. iPhones save HEIC. Convert with the HEIC to JPG tool first; this page tells you so instead of failing silently.
    • Portals cap uploads. Bank, SSM and LHDN forms usually take a PDF of a few megabytes and reject a 20 MB phone scan. Capping the long edge is the cheapest fix, and the page tells you the resulting size before you upload.
    • One photo, one page — in your order. This is not a layout tool: no collage, no two-up, no rotation of the photo itself. Rotation belongs to the crop tool, and the page orientation here only decides which way the paper is turned.

    Before and after

    Before

    resit-kedai.png (1200×1600) + baju-kurung.jpg (2400×3200) + banner-raya.png (2400×1350)

    After

    resit-kedai-3.pdf — 3 pages, A4 with a 10 mm margin, 4.1 MB

    How it works

    1. Add the photos — the order you add them is the order of the pages.
    2. Pick the page size, margin and photo pixels. The page list shows the printed size of every page before you download.
    3. Press Run, check the page count, then download the PDF. Nothing was uploaded.

    FAQ

    Is my photo uploaded to a server?

    No. The PDF is written by JavaScript inside this tab and the file is handed to your browser as a download. There is no upload endpoint on this site at all — pull the network cable out mid-run and it still finishes.

    Can I put five receipts into one PDF?

    Yes, that is the main use. Each photo becomes one page in the order you added them, and the output is a single PDF named after the first photo with the page count appended, so two batches do not overwrite each other.

    Why does my iPhone photo say HEIC?

    iPhones save HEIC by default and no browser can decode it without a 700 KB decoder. Use the HEIC to JPG tool on this site first, then add the JPGs here. The page names the file that failed rather than dropping it silently.

    Does the PDF keep the photo’s location?

    No. Every photo is re-encoded before it is embedded, which discards the EXIF block, so GPS coordinates, camera model and timestamps from the phone do not travel with the document. The page rows say what was found and dropped.

    Will it be sharp enough to print?

    A 3000 px phone photo printed on A4 is about 250 dpi — sharp. Keep the pixel cap at “Keep the phone size” when the document will be printed and drop it to 2000 px when you only need it on screen or under a portal’s size limit.