將檔案編碼為 QR code 的工具
本程式可以將字串分割編碼為 qr code,供連續掃描後合併回檔案。 因為之前開了個腦洞,在想要如何寄紙本加密信件, 加密我的想法就只有 pgp,然後再加一個把數位資料轉紙本的方式 印出來後用 ocr 好像不太準確,且 ocr 對一般人不夠普及。 後來就想到編碼成 qr code,配合一些 app 有連續掃描功能, 掃完後再匯出,於是就這樣成了。
qr code 可以很大,但問題是手機的鏡頭沒有那麼大和清晰。 雖然理論上也可以用掃描器掃描後再用電腦去判讀, 但一樣有技術不夠普及,對一般使用者不友善的問題。 所以要把資料拆成多個 qr code, 再借助另一項某些 qr code 掃描器的功能,連續掃描。
以我用的 qr code 掃描器 binary eye 來說, 就是開啟連續掃描功能,然後掃完後進到歷史記錄, 選擇匯出掃描記錄即可。 掃描記錄可以是 csv 或 json,總之都是用 linux 可以簡單處理的格式。
資料格式的話,我不確定 qr code 能不能塞二進位資料, 但我不想給自己找麻煩,還得找一款能讀取二進位的 qr code scaner, 所以最簡單的方式就是先用 base64 編碼資料。 因為 linux base64 工具默認會自己切割資料了, 但如果用我原本的想法 64 個字元切成一個 qr code, 加上換行符字數變奇數,qr code 就會斷在奇怪的地方, 所以後來加了一個用換行切割的功能。
我掃描時碰到幾個問題,第一個是如果照常規排版每行由左到右, 掃完一行時換行可能會亂掉,而且也沒效率,應該要用 s 型的排列。 所以我加了個簡單的 s 型排版功能,但也把版型固定成四欄。
再來是有時可能會漏掃或重復掃,應該要加個 checksum 機制。 我後來幫每個 qr code 標了編號, 應該就不會亂掉了,最後總數也可以用來驗證。 之後我又幫每個 qr code 下面標上內容字串, 可以用來找出哪個漏掃。
但最後還有個問題是瀏覽器印出來時,
某些 qr code 可能被分頁切斷。
我試了 css 的 page-break: avoid
,但 chromium 還是會切斷,
無論我的 qr code 是用 img 或 canvas。
目前只確定 firefox 是可以用的,chromium 就再等等吧。
2022-10 大張尺寸改版
原本本工具是印出大量的小張 qrcode,但大張 qrcode 在儲存上比較有效率, 所以改版讓本工具可以方便印出較大張的 qrcode。
建議使用每張 512 個字元的 qrcode,並每列 3 張 qrcode,直式列印可以印四列。 這樣單面可以容納 12 張 qrcode,6144 個字元,base64 編碼前為 4608 byte。 操作上把 每列字元數 設為 512,再按下重新切割字串, 後勾選 依換行分割字串 再按 encode 即可。
另一種印法是每張 1024 字元,每列 3 張,用橫式列印一頁二列。 但這種作法要調一下頁緣間距,很容易超過。
而且 qrcode 太大張不太好掃,也最好不要摺到。 除了不能摺到 qrcode 內部,外部也最好不要。 紙張有摺痕的話,山線谷線多少會讓紙面有弧度, 然後 qrcode 扭曲就掃不出來。 如果非摺不可,要掃時可以考慮撕開, 紙面沒有摺線的話就不會有扭曲的問題了。
其他改版說明:
- S 型排列無法在每列 4 張 qrcode 以外場合正常運作
- 預設行為變為依換行分割字串
- 重新切割字串 按鈕會刪除換行符後,依每列字元數目斷行。
- 每列字元數 清除內容後,雙擊文字框會出現建議的字元數, 對應各尺寸 qrcode 的容量上限。
- qrcode 尺寸是在 qrcode 邊界過大或超出顯示範圍時,用來調整大小的。 原則上是依 每列的 qrcode 數目 自動調整大小。
- 這個 qrcode library qrious 不能輸入 unicode 字串,輸出會壞掉。 之前就是這樣,但沒有特別寫出來,只有建議用 base64。