Use a minimal JSON Schema for vcard 2.1 to generate a QR code that can be scanned by any modern smartphone. The QR code contains all the information needed to add a contact to the address book. This simple python script uses qrcode and PIL to generate the QR code image and reportlab for pdf generation.
Included example:
Console output when the example gump.vc21.json
is used:
{'email': 'Forrest@example.com',
'formatted_name': 'Forrest Gump',
'name': {'first_name': 'Forrest',
'honorifics': '',
'last_name': 'Gump',
'middle_name': ''},
'note': 'My best good friend.\n'
' Newlines are ignored by iphone.\n'
' see https://en.wikipedia.org/wiki/VCard',
'org': 'Bubba Gump Shrimp Co.',
'rev': '20240430T085554Z',
'tels': [{'num': '(555) 555-5555', 'type': 'work'},
{'num': '(555) 555-5555', 'type': 'cell'}],
'title': 'Shrimp Boat Captain',
'tz': 'America/Central'}
BEGIN:VCARD
VERSION:2.1
FN:Forrest Gump
N:Gump;Forrest;;
ORG:Bubba Gump Shrimp Co.
TITLE:Shrimp Boat Captain
EMAIL:Forrest@example.com
TEL;WORK;VOICE:(555) 555-5555
TEL;CELL;VOICE:(555) 555-5555
REV:20240430T085554Z
TZ:America/Central
NOTE:My best good friend.
Newlines are ignored by iphone.
see https://en.wikipedia.org/wiki/VCard
END:VCARD
█▀▀▀▀▀█ ▀█▄▀▄▀ ▀█ ▄▀▄ █▀█▄ ▄▀▀█▀▀██▄▀██▄▀▀█▄▀█ ▀▀█▀▀▄▄ ██▀ ▄▄█ ▀ █▀▀▀▀▀█
█ ███ █ ▀▄▀ █▀ █▄ ▄▀██▄▄▀ ▄ █▀█ ▄▀ ▀▄█▀▄█▄▀ ▄▀█▀ ▀██▄▄▀ ▀ ▀▄▄▄ █ ███ █
█ ▀▀▀ █ ▄▀ ██ █▀█ ▀██ █▀▀▀██ ▀▀▀█▄▀██ ▀▄▄█▀▀▀█▄ ▀▄█ ▀█ ▀██▄▀▀ █ ▀▀▀ █
▀▀▀▀▀▀▀ ▀ ▀ ▀▄█▄█▄█▄▀ ▀▄█ ▀ █▄▀ █ ▀ ▀ ▀ ▀▄▀ █ ▀ █▄▀▄▀ ▀▄▀ █▄▀▄▀ █ ▀▀▀▀▀▀▀
▀ █ ▀▀ █ ▄▄ ▄▄ ██▀▄▀▀▀██▀ ▄ █▀▀▄▀▀▀▀█▀█▄█▀█▀▀ ▄ ▀▀▄▀▄ ▀▄█ ▀ ▀ █ ▀▄█
▀▄ ▀▀ ▄ ▀▄█▀█▀ ▄▀▀ ▀▄ █ ▄█▀ ▄▄▄▄ ▀ ▄▀█ ▀█▀▄█ ▀ ▀█▀▄▀▄█▄ ▀▀▀▀
▄▄▄███▀▄▄ ▀█▄▀▀▀ ▀█ ▄▄ ▀█▄▀▀▀ ▀ ▄▄█ ▄▀██▀ ▀ ▄▀ ▀ ▀█ ▀█ ▀▀▄█▄█▀▀ █▀
▄▀▄█ ▀ ▀▀ ▄▄▀ ▄▄▄ █ ██▀▀ █ ▄██▄▄▄██▄▄ █▄▄ █▀▄ ▀█▄ █▄█▄█ ▄▄█ █ █ ▀ ▄ ▄ ▀
██▄▄▄▀▀█ █▀▀▄▄▀█ █▀▀█ █▀▀█▄▄██▄▄▀█▄ ██▄▀▀▄▀▀▀ ▄▀▄▀▄█▄ █▀█▀ ██▄█ █ ▀▀▄
▄▄▀▄▄▄▀▀▀▀▄▀▄ ▀▀█▄█ █▀█▄ ▀█▄█▀▄▀▀▀▄▀██▄▀█▀ ██ █▄ ██▄▄▄█ ▄▀ ▀█▄█ ▀▄ █▀
▀ ▀▄ ▀▀▀█ █▄▄▀█ ▀ █ █▀▀█▄▄▄▄▀█▀▄ █▀▄ █▀█ █ ▄▀ ▀▀ █▀▀▄▀ ▀▄█▀▀█▀ ▀▄▀▀▀█ █
▄▀█ ▀█▀▄ ▄▀ ▄▄ ▄ ▀▀█▀▄ █▄██▄██▄██ ██▄ ██▀▀█▀ ██ █▀██▀▄▄ ▀▄▄ ▄▀▄▀ █ █
▄▀ █▀▀▀█▀▄▀▄▄ ▄▄▄▄ ▀▄▄▄█▀▀▀█▄▀▀ ▄ ▀ ▄▀███ ▀█▀▀▀█ ██▀ ██ ██▄▀ ▄█▀▀▀█▀▀▀▀
█▄▀▄█ ▀ █▀█▄▄█ ▄ ▀▀██ ▀█ ▀ █▄▄▄█▀▄▄▀▀▄▄▀█ █ ▀ █▀ ██▄▀██ ▄▀ ▀█ ▀ █▄ ▀
█▄▀▀█▀▀█▀████ █▄▀█▄ ▀▄▄ ▀█▀██▄ ██▄▀▀▄█ █ █▀█████▀▄ ▀ ▀██ ▀▀ ▄▀▀█▀▀█▀█ ▀▀
▄ ▄▀▀▀█ ▄ ▀▄▄ █ █▀▀▀▄▄▄▀ ▄█▄▄ ██▀▀▀█▀█▄█ ▄▀██▄ █▄▀ ▀█▀▀▀█ ▀▄▄▀█▀ ▀▄▀▀▀
█▄ ▄ ▀▀█ ▄▄▀██▀▄▄ ▄█ ▄█ ▀▀█ ▀▀█ ▀███ ▀▀▀█ ▀▀█ ▄▄▀ █ ▀▄▄ ██ ▀▄▄▀▀
█ ▄▄█▀▀ █▀▀█ ▀▀▀█▀█ ▄█ █▄ █▀ ▄▀▄▄ ▄█▄ ▄█▀█ ▄█▀▀ ██▄ ██ █▀ █▄ ▀ ▀ ▀
█▄███▀▄▄█ ▀▄▄▄▀▀█ ▄▄ ▄ ▀▄▀▄ ▀▀█ ▀█▀ ▀█▀ ▀█▀ ▄▀ ▀▀▀▄▀▀▀▀▄▄▀▄▄▄█ ▀█ ▄██
▀▀ ▀ ▀██▄▄▄▄▄ █▄▀▄█ ▄█▄▄▄█▄▄▀▄▄ ▄█▀▄ ▀▀ ▀█ ██▀ █▀▀ ██ ▀█▀ ▄█ █▀ ▀ █▀
▀▄▄█ █▀ █▀██ █ ▀█▀▄ █▀▀ ██ ▄█ ▀█▀ ▀▀ ▀▄▀ █ █ ▀ ██▀█▄ ▀ █ ▀█▀ ██▄▀█ █▀▀█
▄▄▄ ▀▄▀▄ ▀▀▀ ▀ ▀▀█ █ ▀██▄▀▄▀ █ ▀ ▀▄▄ ▀▄ ▄█▄▄▀█▀▀█▀▀▀▀▀▀ ▀ █▀ ▀ ▀▀█
█ ▄██▀▀▀█ ▀▀▀█ ▀▀▄ ▀ ▀██▀▀▀█ ▀ █▀█▄▀▀█▄▀ █▀▀▀█ ▀▄ ▀ ▀ ▀█▀▀▀█ █▀
█▀ ▄█ ▀ ██▄▀ ▀ ▀█▀██ ▄██ ▀ █▄ ▀▄ ▄▄ ▀ ██ ▀ █ █ ██▄▀█▀▀▄ █ █ ▀ █ ▀▀
▄▀ █▀█▀▀█▄▄▄▄█ ▄ ▄▄ ▄▄█▄█████ █▀▄▀▀▀█ ▀▀▄ ██▀▀▀ ▀█▄ █▀█ ▀▀█ █▄▀█▀█▀▄ ▄▄
▀▀▀▄█ ▀██ ▄▄▀██▀▀ ▄ ▀██ ██ ▀▀ ▀█ ▀▀ ▄ █▄ ▀▀ █ █▄█▄ ▄██ ▀▀ ▀▄▀ ▄
▄▄█▀▀▀▀█ ▀ █▀ █▄█▄ ▄▄▄█ ▀ ▄█ ▀ ▀ ▀ █ ▀ █ ▀ ▀█▀▀▄▀█▀█▀▀█ ▀▀▀▀▀ ▄ █▄ ▄ ▄▄
█ █▀▄ ▀▀ ███ ▄█▀ █▄▀▀ ▄▀ ███▄ ▀▀▀▄▀▀▀ ▀▀ ▄██ ▀█ █▄▄▀█▄▀██▄▄█ █ ▀▀▄▀ ▄█ █▀
▀ ▄▀▀▄ ▄█▄ █▄ ▄▄▀██ ▄▀▀██ ▄ ▄▀▀ ▄█ ▄▀ ▄▀▀█ ▄ █▀▀ ▀█▀ ▀▄▀▄▀▄█▄ ███▄█
█ ▄ ▀▀ ▄ ▄ ▀▄ ▀█▄▄▀▄██ ███ ▄▄▀▄▄▄▄▄▄ ▀▀█ ▀▀▄▀▀▀▄█▄ ██ ▄▄ █ ██▀ █
▀▀ █▄▀▀▄█▀▀▀▀▄██ ▄ ▄▄█▀ ▀ █▀▀▄▀██▀█ ▄▀██ ▀ ▀▀ ▄▀▀▄█ ▀▄▀▄██▀▄▀▀ ▀ ▄▄▄▀█
▀▀ █▄▀▀▀ ▄▄█ ▀ ▄█▄ ▄▀▄ ▀▀▀ ▄ ██▄▄▄█▄ ▄█▀ ██▄ █ █ ██ ▀▄▀ ▀██ ▀▄▄▀▀ ▀▀
▀ ▀ ▀ ██▀▀▀█▄▄▄ ▄█▀▀▄ █▀▀▀█▀▄█▄▀▀█▀▄▀▀▄▄▀██▀▀▀█▄▀█ ▀▄█▀▀▀█ ▀██▀▀▀█▀ ██
█▀▀▀▀▀█ ▀██▄ ▀▄█▄█▄ ▄█ ▄█ ▀ █▄ ▀█▄ █▄▀████▄▄█ ▀ █ ██▀▀█▄▀█ █ █▄█ ▀ █▄ ▄▀
█ ███ █ █▄█▄ █▄▀▀▄█▀▀▀▀▀█ ▄█▄ ▀▀ ▀ ▀▄▄ ▀██▀▀▀▀▀▄ ▀▀▄▀█ ▄▄█▀█▀▀▀▄
█ ▀▀▀ █ ▀█▀▀ ▄▄▄ ▀█▄██▄ ▀▀▀ ▄▄ ▀█ ███▄██▀▀▀▄▄█▄ ▄▀ ▀█▀ ██ █ ▀█ ▄▄ ▀▀▀
▀▀▀▀▀▀▀ ▀▀▀▀ ▀ ▀▀ ▀▀ ▀▀ ▀ ▀▀ ▀▀▀ ▀▀▀▀▀ ▀▀▀ ▀ ▀ ▀▀▀▀▀▀ ▀▀▀▀ ▀