Back to Blog

The HEIC Came Out Black

September 16, 2026
Share:
The HEIC Came Out Black

I photographed a form on the phone, then the back of an ID. The portal wanted one PDF. I dropped the HEIC files on the first converter Google gave me.

The download opened. Page two was black.

The photos were still on the phone. I didn't need an account to put them in order. I needed pages I could see, on paper a printer already knows, without sending the ID to a site that would hold it. The Images to PDF page on Softery does that in the tab. JPEG, PNG, WebP and iPhone HEIC. Drag the order. Rotate a page that came in on its side. A4 or Letter. The file is built here.

The Phone Already Took The Page

A scan used to mean a flatbed. Now it means standing over a kitchen table with a phone. The camera writes HEIC because that is what iPhone writes. The form on the other end still wants a PDF.

That gap is the whole job. Not OCR. Not a vector tracing of the ink. A stack of photos, in the order you took them, sitting on a sheet size the printer will not crop.

I kept opening converters that treated the photo as an upload. Progress bar. Then a signup. Then a page that looked like a scan until you zoomed in and saw it was a black rectangle where the HEIC decoder had given up.

The files I care about in this flow are the ones I would rather not put on a stranger's disk. A lease. A signed page. Once those bytes leave, they exist somewhere I cannot close.


Rank 19 of 1,761

I ranked this idea 19th out of 1,761, score 9.2, about ten hours of work. The 9.2 is an editorial score from that queue, not a search volume I measured tonight.

The PDF family in that list is long. Merge, split, compress, fill, OCR. Merge already shipped, and it already joins files that are PDFs. This page is the step before that: the camera roll is not a PDF yet.

HEIC is the angle. A lot of free converters silently fail on it or emit a black page. I shipped the same decoder the HEIC to JPG page already uses, then put the pixels on A4 or Letter instead of handing you a zip of JPEGs.

I am not going to pretend the rank is a demand study. It is a note that this job kept showing up next to merge, and that the failure mode I actually hit was a black page, not a missing button.


Black Pages

A black page is worse than an error. An error you can retry. A black page looks like a document until someone prints it.

HEIC is a container. The still picture inside is often HEVC. Safari 17 can decode that in createImageBitmap. Chrome and Firefox load a module, once per visit, through heic2any 0.0.4. You see a loading line the first time a HEIC file is in the drop. That module stays in the tab. It does not send the photo anywhere.

If the decode fails, the file is named and the rest stay. I will not draw a black rectangle to hide that.

HEIC is a still picture. If one file fails, that file is named and the rest stay.

That line is the product spec. It is also the test. Drop a JPEG and a PDF together. The JPEG becomes a page. The PDF is refused, because it is already a document.


HEIC Is A Container

The brands this tab accepts from the ftyp box are heic, heif, heix, hevc, mif1 and msf1. Magic beats the filename. A file named scan.jpg that starts with %PDF- is still a PDF, and it is still refused.

GIF is refused too. A GIF is not a still page. I will not take the first frame in silence and call it a document.

JPEG, PNG and WebP decode in the browser without the HEIC module. WebP is accepted because the browsers this page already runs in can draw it. I did not add a new codec for it.

EXIF orientation is applied once. A phone shot stored as orientation 6 is 90 degrees clockwise from the pixels on disk. This tab rotates those pixels before they become a page, so the preview you drag is the page you download. If a decoder already rotated the bitmap, a second pass would flip it again. The path here asks for stored pixels and does the turn itself.


Order Is The Job

The portal does not want a zip of photos. It wants page 1, then page 2, then the back.

Thumbnails appear as soon as a file is accepted. Drag a card. Use the up and down buttons if you are on a keyboard or a phone where dragging is a pain. Rotate 90 degrees if a page landed on its side.

The download follows that order. There is no hidden sort by filename and no hidden sort by capture date. Filename sort would put IMG_9 after IMG_10. Capture date sort would put a retake in the wrong place. You took the photos in an order. That order is yours to keep or to fix.

I duplicated the move helper the merge page already uses, instead of pulling in another drag library. Merge already has @dnd-kit. The arrows are there so the grid is not a mouse-only toy.

The sample is two still pages, one landscape and one portrait, so a first visit still produces a real PDF. I did not want an empty converter that looks broken until you hunt for files. Replace the sample when you have the photos. The sample never leaves the tab either. It is pixels this page already had.


A4 And Letter

A4 is 210 by 297 millimetres. That is ISO 216, converted to PDF points at 72 per inch. Letter is 8.5 by 11 inches, which is 612 by 792 points. Those numbers are in the tests. I did not round them into a marketing line.

Auto picks portrait or landscape per photo from the pixels after rotation. A wide shot of a table sits on landscape paper. A tall ID sits on portrait paper. You can lock both to portrait or both to landscape if the packet has to match.

Margins are 0, 10, 15 or 20 millimetres. The photo is scaled to fit inside that box and centred. It is not cropped. A 0 millimetre margin will print to the edge on a printer that can do that, and it will clip on a printer that cannot. I show the millimetres so that choice is yours.

The line above the download names the paper and the size of the PDF this tab just built. You see the byte count before you save. That count is the file, not a guess from the JPEGs.


150 Pixels Per Inch

A 12 megapixel phone photo is a lot of RAM if you keep five of them as raw pixels in a tab. A4 at 150 pixels per inch is 1,754 pixels on the long edge. Letter is 1,650. Photos longer than that are scaled down before they become a page.

150 is a common scan density. It is not camera negative quality. If you needed a print shop negative, you would not be stacking phone photos into a PDF in a browser tab.

I put that number on the page because a silent resize is how tools lie. The pixels that go into pdf-lib 1.17.1 are the pixels you already saw in the thumbnail, after that cap.


Document Mode

A phone photo of a form is often grey. The table is grey. The ink is grey. Document mode turns the page grey on purpose and stretches contrast around middle grey by 1.6, using the WCAG luma weights 0.2126, 0.7152 and 0.0722. Pale paper moves toward white. Dark ink moves toward black. Alpha stays.

It does not read the text. There is no OCR on this page. I will not put a "searchable PDF" badge on a raster.

If you already have PDFs, Merge PDF joins those files. If you only need a JPEG from a HEIC, HEIC to JPG does that without making a document.


One File Can Fail

A drop of four photos should not vanish because the third one is a GIF.

Ingest classifies each file from magic, then from the name if the browser left the type blank. Refused files get a line: already a PDF, GIF is not a still page, not a JPEG/PNG/WebP/HEIC, or this file did not decode. The others stay.

That is the test I wrote first. A JPEG and a PDF in the same drop. The JPEG is a page. The PDF is an alert.

Cancel stops the rest of the read. Clear drops the pages from memory. Reload does the same, because nothing was stored but the knobs.


What The Other Pages Do

I am not going to pretend upload converters never work. They work until the HEIC decoder on their side writes black, or until the signup wall, or until you notice the result URL is sitting on a public CDN.

PageHEICOrderWhere the bytes go
This tabAccepted as a still picture. Failures are named.Drag or arrows. Rotate on the card.This tab. After load, the PDF does not need a reply.
HEIC to JPG on this siteSame decoder, zip of stillsN/A, not a documentThis tab
Merge PDF on this siteRefused, already a documentPage cards from PDFsThis tab
The usual upload convertersOften a black page or a silent skipSometimes a list, after the uploadTheir disk, for a while

I did not reopen a competitor tonight to re-count a file cap. Old research notes are not facts. The black page is the failure I am shipping against, because I have opened that download.


Settings Stay, Photos Don't

Paper, orientation, margin and photo or document mode are stored in this browser under softery.images-to-pdf.settings. The photos are not. Clear the site data and the knobs go back to A4, auto, 10 millimetres, photo.

The download is named photos-1-page.pdf or photos-N-pages.pdf. A person's name never lands in the default filename. Rename it after you have it.

Mixpanel and Google Analytics load with Softery.io. They see that someone opened the tool, which setting moved, and whether a download happened. They do not get the photos, the filenames, or the PDF. Telemetry of the site is not a copy of your packet.

There are thirty-three free tools on the hub as of this sitting. This is the one that turns the camera roll into pages.


Try It Tonight

If you have photos of a form, use the page and watch the network panel. If the files stay, keep the bookmark.

  1. Open Images to PDF.
  2. Drop JPEG, PNG, WebP or HEIC. Or use the sample, which is two still pages so a first visit still produces a real file.
  3. Put the pages in order. Rotate the one that is on its side.
  4. Pick A4 or Letter. Look at the size line.
  5. Download photos-N-pages.pdf. Close the tab. The bytes are gone from the page. They were never on my disk.

Open the network panel before you drop anything. After the page has loaded, the next requests you should see are Mixpanel and Analytics, not your photos. If a HEIC file is in the drop, you may see the decoder module load once. That is a script this visit needs. It is not your form.

If the files are already PDFs, that is Merge PDF. If you wanted JPEGs, that is HEIC to JPG. Split and compress are not on this site yet. I will not link pages that do not exist.


Last updated: September 16, 2026 | Reading time: 10 minutes

Written by Softery.io, who would rather look at a named failure than print a black page and call it a scan.