Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

KotlinとCloud Vision APIで領収書の電子帳簿保存法対応をする

KotlinとCloud Vision APIで領収書の電子帳簿保存法対応をする

2024年4月26日(金) 「集まれKotlin好き!Kotlin愛好会 vol. 51@G's ACADEMY TOKYO」の談義資料です。

Takehata Naoto

April 26, 2024
Tweet

More Decks by Takehata Naoto

Other Decks in Technology

Transcript

  1. 概要 竹端 尚人 主にバックエンドエンジニア Twitter: @n_takehata • 2006.04 公務員 •

    2007.12 SES • 2014.04 株式会社アプリボット(Kotlinを始める) • 2020.06 株式会社ZOZOテクノロジーズ • 2020.12 フリーランス(現在) 現在は主に株式会社ヘンリーでの開発に従事
  2. 登壇、執筆 • CEDEC 2018、2019登壇 • Software Design 2019年2月号〜4月号で短期連載 「サーバーサイド開発の品質を向上させる Java→Kotlin

    移行のススメ」執筆 • 2021年4月 書籍「Kotlin サーバーサイドプログラミング 実践開発」出版 • 2023年4月 Techpitにて「Kotlin入門ガイドー言語思想 から特徴・歴史・使いどころまで、まるっと予備知識がわ かる教科書」執筆
  3. ChatGTPに聞いた手順(これ見てできました) Google Cloud SDKをセットアップして認証情報を取得する手順は以下の通りです。 1. Google Cloud Consoleにアクセスし、プロジェクトを作成します(既存のプロジェクトを使 用する場合はスキップできます)。 2.

    プロジェクトを選択し、[APIとサービス] > [ダッシュボード]に移動します。 3. [APIを有効にする] をクリックし、Google Cloud Vision APIを有効にします。 4. [APIとサービス] > [認証情報]に移動し、[認証情報を作成]をクリックします。 5. [サービス アカウント] を選択し、必要な情報を入力してサービス アカウントを作成します。 6. 作成されたサービス アカウントを選択し、[鍵を追加]をクリックして新しい鍵を作成します。 鍵のタイプはJSONにしてください。 7. JSON形式の認証情報ファイルがダウンロードされます。このファイルをGoogle Cloud Vision APIを使用するKotlinコードから参照できる場所に保存します。
  4. val pdfPath = "/Users/example/hogehoge.pdf" try { // PDFを画像に変換 val document

    = PDDocument.load(File(pdfPath)) val renderer = PDFRenderer(document) val requestBuilder = BatchAnnotateImagesRequest.newBuilder() for (pageIndex in 0 until document.numberOfPages) { val image: BufferedImage = renderer.renderImageWithDPI(pageIndex, 300f) val byteArrayOutputStream = ByteArrayOutputStream() ImageIO.write(image, "png", byteArrayOutputStream) val imageBytes = ByteString.copyFrom(byteArrayOutputStream.toByteArray()) // Vision APIリクエストの構築 val visionImage = Image.newBuilder().setContent(imageBytes).build() val feature = Feature.newBuilder().setType(Feature.Type.DOCUMENT_TEXT_DETECTION).build() val request = AnnotateImageRequest.newBuilder().addFeatures(feature) .setImage(visionImage).build() requestBuilder.addRequests(request) } document.close() ① ② ①Cloud Vision APIは画像ファイルしか受け付けないので、PDFを画像に変換する ②画像に変換したPDFを渡してCloud Vision APIのrequestを作成する
  5. val settings = ImageAnnotatorSettings.newBuilder().setCredentialsProvider { GoogleCredentials.getApplicationDefault() } .build() val client

    = ImageAnnotatorClient.create(settings) val response = client.batchAnnotateImages(requestBuilder.build()) val list = response.responsesList.first().fullTextAnnotation.text.split("\r\n", "\n") client.close() ①Cloud Vision APIのclientを生成 ②requestを送信して分析結果を取得し、各行ごとの値のlistにsplitする ① ②
  6. amazon.co.jp 注文番号xxx-xxxxxxx-xxxxxxxの領収書 様 注文日: 2024年4月19日 発行日: 2024年4月22日 Amazon.co.jp 注文番号: xxx-xxxxxxx-xxxxxxx

    ご請求額:¥1,190 2024年4月22日に発送済み 注文商品 税込価格 1点 USB-C & USB-A 3.1(Gen2) ケーブル(0.5m, ブラック) Popolier 【10Gbpsデータ転送/3A 60W高速充電】 USB3.1 Gen2 ケーブル USB-A to USB-C ケーブル 高耐久PVC素材 Xperia/Galaxy/Huawei/Pixel などのusb type c機器と互換 販売: Popolier-JP (適格請求書発行可) (出品者のプロフィール) \ 780 法人価格 コンディション: 新品 お届け先住所: 竹端 尚人 xxx-xxxx 東京都 日本 配送方法: 通常配送 支払い情報 支払い方法: |Visa | カード番号の一部: xxxx 商品の小計: 配送料・手数料: \ 410 \ 780 請求先住所: 竹端 尚人 150-0013 東京都 日本 クレジットカードへの請求 注文合計:¥1,190 ご請求額:¥1,190 Visa (下4けたがxxxx): 2024年4月22日: ¥ 1,190 注文の状況を確認するには、 注文内容をご覧ください。 利用規約 | プライバシー規約 1996-2020, Amazon.com, Inc. and its affiliates
  7. var date = "" var amount = "" list.forEach {

    if (it.startsWith("注文日")) { date = LocalDate.parse(it.replace("注文日: ", ""), DateTimeFormatter .ofPattern("yyyy年M月d日")) .format(DateTimeFormatter.ofPattern("yyyyMMdd")) } if (it.startsWith("ご請求額")) { it.replace(Regex(" | "), "").replace(Regex("ご請求額:¥|,"), "") } } ①注文日を抽出し、yyyyMMddのフォーマットに変換 ②請求額を抽出し、ラベルの文字列とカンマを削除 ① ②
  8. val oldFile = File("/Users/example/hogehoge.pdf") val newFile = File("/Users/example/result/${date}_Amazon_$amount.pdf") Files.copy(oldFile.toPath(), newFile.toPath(),

    StandardCopyOption.REPLACE_EXISTING) ①抽出した請求日と金額を埋め込み、変更後のファイル名を定義 ②変更前のファイルをコピーし定義した変更後のファイル名で保存 ① ②