Convert PKPASS to PDF

Turn Apple Wallet .pkpass boarding passes, tickets and coupons into one printable PDF with real scannable barcodes. Everything runs in your browser.

🌐 Español

Drop your files here (.pkpass)

🔒 Private by design: your files are processed locally in your browser and never uploaded to any server.

When a phone is not an option

Apple Wallet is excellent right up until the moment it is not. A phone at four percent battery in an airport queue, a venue whose scanner only likes paper, a border officer who wants something to hold, a rental counter with a printer and no idea what a wallet pass is. The file sits on your device and there is no obvious print button anywhere.

A .pkpass file is a zip archive. Inside it is a JSON document describing the pass, a handful of PNG images at various resolutions, and a manifest and signature pair. Everything needed to draw the pass on paper is in that JSON, which is why this conversion is a local file operation rather than a service.

The pass never leaves your browser. Given what boarding passes and event tickets contain, that is not a marketing line: a booking reference plus a surname is enough to manage somebody else’s flight on many airline websites.

Printing a set of boarding passes

  1. Drop your .pkpass files onto the box or use Choose files. Only the .pkpass extension is accepted, and several at once is fine.
  2. Click Convert PKPASS to PDF. The progress bar moves through the passes first and then builds the document.
  3. Download the result. One input keeps its own name, so flight.pkpass gives you flight.pdf. Two or more produce wallet-passes.pdf, with every pass in the one file.
  4. Print it. Print at full size rather than fit to page, because scaling down a barcode is the fastest way to make it unreadable.
  5. Process another clears the queue.

Before you leave for the airport, scan the printed barcode with your own phone camera. It takes five seconds and it is the only test that matters.

What gets pulled out of the archive

The header band carries the issuing organisation and the pass type, which is one of boarding pass, event ticket, coupon, store card or a generic pass. The pass declares exactly one of those five, and a file declaring none of them is rejected as not a real pass rather than rendered half empty.

Colours come from the pass itself. Background, foreground and label colours are read from the pass definition in the CSS notation it uses, so a printed pass keeps the issuer’s own palette instead of arriving as generic black on white.

The logo is picked at the best resolution present in the archive, preferring the triple-density variant, then double, then the base image, and falling back to the icon if no logo exists at all.

Fields are drawn in the order the pass format defines them: header, primary, secondary, auxiliary, then the barcode section, then the back of the pass. Values that are numbers or booleans are rendered as readable text, and a field with no label falls back to its internal key rather than printing a blank.

Barcodes that a scanner will accept

This is where most converters give up and print the number. Four symbologies appear on Wallet passes, and all four are drawn as real graphics here.

QR codes go through a dedicated QR encoder. PDF417, which is what most airline boarding passes use, along with Aztec and Code 128, go through a full symbology renderer covering those formats properly. Code 128 gets an explicit height so it comes out as a normal wide linear barcode rather than an oddly tall block, while PDF417 and Aztec compute their own natural proportions.

Under every barcode the encoded string is also printed as plain text. That is deliberate redundancy for the case where the reader will not cooperate and someone has to key it in.

Passes can also carry an older single-barcode field from earlier iOS versions rather than the modern list. Both shapes are read, so an old pass still gets its barcode drawn.

What this deliberately does not do

It does not verify anything. The signature inside the archive is ignored entirely, and no attempt is made to confirm the pass came from the organisation named on it. This is a reader and a renderer, not a wallet.

It also does not update. A wallet pass on a phone can change when a gate is reassigned; a PDF cannot. Print it late, and check the app before you travel.

For the wider file toolkit: Unzip Files opens the archive itself if you want to see what is inside one, QR Code Reader decodes the barcode from a screenshot to check what it actually encodes, and Merge PDF combines the output with your itinerary or hotel confirmation into a single document to print. The rest is on the PDF tools hub.

Frequently asked questions

Do the barcodes actually scan, or is it just the number printed?

They are real graphics. QR codes are drawn with a proper QR encoder, and PDF417, Aztec and Code 128 are drawn with a full symbology renderer, so a gate scanner reads the printed page the same way it reads your phone. The encoded string is also printed as text underneath, which is what you need when a reader fails and a member of staff types it in.

What happens with a barcode format the pass does not name properly?

It falls back to text only. A pass whose barcode entry has no format field is labelled as unknown, and rather than guessing a symbology and printing something that will not scan, the tool prints the encoded message as text and stops there. A wrong barcode is worse than no barcode at the gate.

Does it check that the pass is genuine?

No, and this is the one thing to be clear about. Every real pass carries a manifest and a cryptographic signature, and neither is verified here. This reads a pass and renders it. It cannot tell you whether a pass was issued by the airline or assembled by somebody with a text editor, so never treat a PDF produced here as proof of authenticity.

I selected several passes. Why did I only get one file?

Because a batch becomes one combined PDF, with each pass laid out in its own section, which is what you want when you are printing boarding passes for a family. A single input keeps its own name, so flight.pkpass becomes flight.pdf. Two or more inputs produce a file named wallet-passes.pdf.

One file in my batch failed and the whole run stopped. Is that expected?

Yes, and the error you see is less helpful than the one the tool produced. Internally each failure is reported with the offending file name and a specific reason, such as a missing pass definition or invalid JSON inside it. The surrounding shell replaces any error with one fixed generic sentence, so that detail never reaches the screen. Convert files one at a time to find which one is at fault.

Why is a password-protected pass treated as probably not genuine?

Because a real Apple Wallet pass is never encrypted. The archive is signed but not password-protected, so encrypted entries mean the file has been repackaged by something other than a pass issuer. The tool detects that and refuses the file for that reason, though the surrounding shell shows its one fixed generic sentence rather than the reason itself.

Which parts of the pass end up on the page?

The issuing organisation and pass type in a coloured header band, the logo or icon at the best resolution available in the archive, then the header, primary, secondary and auxiliary field groups in that order, the barcode section, and finally the back of the pass fields. The pass's own background, foreground and label colours are read and used, so an airline's pass still looks like that airline's pass.

Is a .pkpass file really just a zip archive?

Yes. Rename one to .zip and you can open it in any archive tool. Inside sits a JSON file describing the pass, some PNG images, and the manifest and signature pair. That is why converting one needs no server, since reading a zip and drawing a PDF are both things a browser can do on its own.

Related tools