From 9662e8f233970249e47c1854445f395a47838e51 Mon Sep 17 00:00:00 2001 From: Yuval Adam <_@yuv.al> Date: Wed, 17 Mar 2021 11:17:15 +0200 Subject: Initial pdf image extract --- Pipfile | 1 + Pipfile.lock | 92 ++++++++++++++++++++++++++++++++++++++---------------------- verify.py | 16 +++++++++++ 3 files changed, 75 insertions(+), 34 deletions(-) diff --git a/Pipfile b/Pipfile index 8f5191a..375f555 100644 --- a/Pipfile +++ b/Pipfile @@ -7,6 +7,7 @@ name = "pypi" cryptography = "*" pillow = "*" pyzbar = "*" +pymupdf = "*" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index ea45a3b..b61de87 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "88288ba4a29083a5f9a6ec0d894e55dc651b0227f35984fdfde3c7fa0e66f228" + "sha256": "cdf5770078ddbccea03971d385dd543c729159f2da40215c86311cf4293fa047" }, "pipfile-spec": 6, "requires": {}, @@ -76,41 +76,42 @@ }, "pillow": { "hashes": [ - "sha256:165c88bc9d8dba670110c689e3cc5c71dbe4bfb984ffa7cbebf1fac9554071d6", - "sha256:1d208e670abfeb41b6143537a681299ef86e92d2a3dac299d3cd6830d5c7bded", - "sha256:22d070ca2e60c99929ef274cfced04294d2368193e935c5d6febfd8b601bf865", - "sha256:2353834b2c49b95e1313fb34edf18fca4d57446675d05298bb694bca4b194174", - "sha256:39725acf2d2e9c17356e6835dccebe7a697db55f25a09207e38b835d5e1bc032", - "sha256:3de6b2ee4f78c6b3d89d184ade5d8fa68af0848f9b6b6da2b9ab7943ec46971a", - "sha256:47c0d93ee9c8b181f353dbead6530b26980fe4f5485aa18be8f1fd3c3cbc685e", - "sha256:5e2fe3bb2363b862671eba632537cd3a823847db4d98be95690b7e382f3d6378", - "sha256:604815c55fd92e735f9738f65dabf4edc3e79f88541c221d292faec1904a4b17", - "sha256:6c5275bd82711cd3dcd0af8ce0bb99113ae8911fc2952805f1d012de7d600a4c", - "sha256:731ca5aabe9085160cf68b2dbef95fc1991015bc0a3a6ea46a371ab88f3d0913", - "sha256:7612520e5e1a371d77e1d1ca3a3ee6227eef00d0a9cddb4ef7ecb0b7396eddf7", - "sha256:7916cbc94f1c6b1301ac04510d0881b9e9feb20ae34094d3615a8a7c3db0dcc0", - "sha256:81c3fa9a75d9f1afafdb916d5995633f319db09bd773cb56b8e39f1e98d90820", - "sha256:887668e792b7edbfb1d3c9d8b5d8c859269a0f0eba4dda562adb95500f60dbba", - "sha256:93a473b53cc6e0b3ce6bf51b1b95b7b1e7e6084be3a07e40f79b42e83503fbf2", - "sha256:96d4dc103d1a0fa6d47c6c55a47de5f5dafd5ef0114fa10c85a1fd8e0216284b", - "sha256:a3d3e086474ef12ef13d42e5f9b7bbf09d39cf6bd4940f982263d6954b13f6a9", - "sha256:b02a0b9f332086657852b1f7cb380f6a42403a6d9c42a4c34a561aa4530d5234", - "sha256:b09e10ec453de97f9a23a5aa5e30b334195e8d2ddd1ce76cc32e52ba63c8b31d", - "sha256:b6f00ad5ebe846cc91763b1d0c6d30a8042e02b2316e27b05de04fa6ec831ec5", - "sha256:bba80df38cfc17f490ec651c73bb37cd896bc2400cfba27d078c2135223c1206", - "sha256:c3d911614b008e8a576b8e5303e3db29224b455d3d66d1b2848ba6ca83f9ece9", - "sha256:ca20739e303254287138234485579b28cb0d524401f83d5129b5ff9d606cb0a8", - "sha256:cb192176b477d49b0a327b2a5a4979552b7a58cd42037034316b8018ac3ebb59", - "sha256:cdbbe7dff4a677fb555a54f9bc0450f2a21a93c5ba2b44e09e54fcb72d2bd13d", - "sha256:cf6e33d92b1526190a1de904df21663c46a456758c0424e4f947ae9aa6088bf7", - "sha256:d355502dce85ade85a2511b40b4c61a128902f246504f7de29bbeec1ae27933a", - "sha256:d673c4990acd016229a5c1c4ee8a9e6d8f481b27ade5fc3d95938697fa443ce0", - "sha256:dc577f4cfdda354db3ae37a572428a90ffdbe4e51eda7849bf442fb803f09c9b", - "sha256:dd9eef866c70d2cbbea1ae58134eaffda0d4bfea403025f4db6859724b18ab3d", - "sha256:f50e7a98b0453f39000619d845be8b06e611e56ee6e8186f7f60c3b1e2f0feae" + "sha256:15306d71a1e96d7e271fd2a0737038b5a92ca2978d2e38b6ced7966583e3d5af", + "sha256:1940fc4d361f9cc7e558d6f56ff38d7351b53052fd7911f4b60cd7bc091ea3b1", + "sha256:1f93f2fe211f1ef75e6f589327f4d4f8545d5c8e826231b042b483d8383e8a7c", + "sha256:30d33a1a6400132e6f521640dd3f64578ac9bfb79a619416d7e8802b4ce1dd55", + "sha256:328240f7dddf77783e72d5ed79899a6b48bc6681f8d1f6001f55933cb4905060", + "sha256:46c2bcf8e1e75d154e78417b3e3c64e96def738c2a25435e74909e127a8cba5e", + "sha256:5762ebb4436f46b566fc6351d67a9b5386b5e5de4e58fdaa18a1c83e0e20f1a8", + "sha256:5a2d957eb4aba9d48170b8fe6538ec1fbc2119ffe6373782c03d8acad3323f2e", + "sha256:5cf03b9534aca63b192856aa601c68d0764810857786ea5da652581f3a44c2b0", + "sha256:5daba2b40782c1c5157a788ec4454067c6616f5a0c1b70e26ac326a880c2d328", + "sha256:63cd413ac52ee3f67057223d363f4f82ce966e64906aea046daf46695e3c8238", + "sha256:6efac40344d8f668b6c4533ae02a48d52fd852ef0654cc6f19f6ac146399c733", + "sha256:71b01ee69e7df527439d7752a2ce8fb89e19a32df484a308eca3e81f673d3a03", + "sha256:71f31ee4df3d5e0b366dd362007740106d3210fb6a56ec4b581a5324ba254f06", + "sha256:72027ebf682abc9bafd93b43edc44279f641e8996fb2945104471419113cfc71", + "sha256:74cd9aa648ed6dd25e572453eb09b08817a1e3d9f8d1bd4d8403d99e42ea790b", + "sha256:81b3716cc9744ffdf76b39afb6247eae754186838cedad0b0ac63b2571253fe6", + "sha256:8565355a29655b28fdc2c666fd9a3890fe5edc6639d128814fafecfae2d70910", + "sha256:87f42c976f91ca2fc21a3293e25bd3cd895918597db1b95b93cbd949f7d019ce", + "sha256:89e4c757a91b8c55d97c91fa09c69b3677c227b942fa749e9a66eef602f59c28", + "sha256:8c4e32218c764bc27fe49b7328195579581aa419920edcc321c4cb877c65258d", + "sha256:903293320efe2466c1ab3509a33d6b866dc850cfd0c5d9cc92632014cec185fb", + "sha256:90882c6f084ef68b71bba190209a734bf90abb82ab5e8f64444c71d5974008c6", + "sha256:98afcac3205d31ab6a10c5006b0cf040d0026a68ec051edd3517b776c1d78b09", + "sha256:a01da2c266d9868c4f91a9c6faf47a251f23b9a862dce81d2ff583135206f5be", + "sha256:aeab4cd016e11e7aa5cfc49dcff8e51561fa64818a0be86efa82c7038e9369d0", + "sha256:b07c660e014852d98a00a91adfbe25033898a9d90a8f39beb2437d22a203fc44", + "sha256:bead24c0ae3f1f6afcb915a057943ccf65fc755d11a1410a909c1fefb6c06ad1", + "sha256:d1d6bca39bb6dd94fba23cdb3eeaea5e30c7717c5343004d900e2a63b132c341", + "sha256:e2cd8ac157c1e5ae88b6dd790648ee5d2777e76f1e5c7d184eaddb2938594f34", + "sha256:e5739ae63636a52b706a0facec77b2b58e485637e1638202556156e424a02dc2", + "sha256:f36c3ff63d6fc509ce599a2f5b0d0732189eed653420e7294c039d342c6e204a", + "sha256:f91b50ad88048d795c0ad004abbe1390aa1882073b1dca10bfd55d0b8cf18ec5" ], "index": "pypi", - "version": "==8.1.0" + "version": "==8.1.2" }, "pycparser": { "hashes": [ @@ -120,6 +121,29 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.20" }, + "pymupdf": { + "hashes": [ + "sha256:2267737702a0bdb85e328108429ea79bb1c392e01f3589f5e12e10c02e977b17", + "sha256:37dac2a3ea35da0375b3f19d488070b8f8e4eba4b243e66f3bbf4056e887c411", + "sha256:4b5352569339cde5f0379cda550f35c340e57d38f2a2d73e3545c17f7702bbfc", + "sha256:5afe6a5f6905334e06f21c3a1284427289fa333b19ae87fd932ebde01b7d820e", + "sha256:5b94b885d9d5b7483871e08bbd189b37e2bc30a4760d4eb809de5f18d4e4beb0", + "sha256:5c07e65208cabdf6aa2a14c4dce571252260f0e121420b8a631ad9df05e4e2d6", + "sha256:642cd1122ead198518cf4f9675274d1fee563857350051802ba5ce76b60abca7", + "sha256:65a1daaf77434f6da95fa63437713fabe8d818f00e4e3af9f4a64fe16804ad32", + "sha256:7cdae7822754526a5401b10ba175f8979c62711a6b10610d88c8e698e5be9ffa", + "sha256:9b526f0e7cebb56abb2ad569552bd313c37cabc5ce59614791079816ba6459d4", + "sha256:9eb91dd17b948e12b87406e8a33503d36ed6d054a856d63c6b731ec73a80aecd", + "sha256:a28d5bdc89ff4c0ecaec51e83d0cdc084156727e8f0505bcbb9f25c7b455c1f3", + "sha256:cb6ba6c5038ce590a088b9bf320c6e9ce714c1fa304181ece8b551d8589a8b21", + "sha256:d554e5711dc6a3be67af9b8bcdd4093ad6bcc4081af319a0fb0433815df73f5e", + "sha256:dff30cca066033f8a48e5e75f9a833b3d4de481a66cbe2bfe1ed9a824691385a", + "sha256:fa12cd8075a0223cc4a89859e46b1b8127fbde2c6d44a75720fca91d83f9433b", + "sha256:fe450ff5b0012b7ef795abafcb156ff3b0108a12c184bd8105c5df7794788d3c" + ], + "index": "pypi", + "version": "==1.18.9" + }, "pyzbar": { "hashes": [ "sha256:0e204b904e093e5e75aa85e0203bb0e02888105732a509b51f31cff400f34265", diff --git a/verify.py b/verify.py index db3c589..a42106d 100644 --- a/verify.py +++ b/verify.py @@ -1,5 +1,6 @@ import argparse import base64 +import fitz import json from pathlib import Path @@ -54,6 +55,12 @@ def read_qr_code(image_path): return pyzbar.decode(Image.open(image_path))[0].data +def read_pdf(pdf_path): + doc = fitz.open(pdf_path) + for (xref, *_) in doc.get_page_images(0, full=True): + img = fitz.Pixmap(doc, xref) + img.writePNG(f"{xref}.png") + def create_arg_parser(): parser = argparse.ArgumentParser("Green Pass QR code verifier") group = parser.add_mutually_exclusive_group(required=True) @@ -64,6 +71,13 @@ def create_arg_parser(): help="Path to an image with the QR code", default=None, ) + group.add_argument( + "-p", + "--pdf-path", + type=Path, + help="Path to PDF file", + default=None, + ) group.add_argument( "-t", "--txt-path", @@ -80,6 +94,8 @@ if __name__ == "__main__": if args.image_path: verify(read_qr_code(args.image_path)) + elif args.pdf_path: + read_pdf(args.pdf_path) elif args.txt_path: with open(args.txt_path, "rb") as f: verify(f.read().strip()) -- cgit v1.3.1