「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Skyward 用に PDF を簡単に分割して名前変更

Skyward 用に PDF を簡単に分割して名前変更

2024 年 7 月 31 日に公開
ブラウズ:581

Easily Split and Rename PDFs for Skyward

なぜそれを構築するのか、そしてそれは何をするのか

数週間前、上司が私に、私たちが抱えている特定の問題に対するワークフローを思いつくことができるかどうかという課題を与えました。 Pre/ACT レターを SMS (学生管理システム) に取り込みたいと考えていました。この場合、SMS は Skyward でした。私たちが遭遇した問題は、Pre/ACT レターが一括 PDF または個別 PDF のいずれかに含まれており、Skyward にアクセスするには、各学生の名前を ID 番号として PDF にする必要があるということです。これを達成するために、UI に Streamlit を使用して、Python でプログラムを作成することにしました。

PDF から解決すべき問題を見ていきましょう。レターの一括単一 PDF エクスポートを取得する方が合理的です。これは、一括エクスポートを個別の PDF に分割する必要があることを意味します。各レターは通常 2 ページですが、常にそうとは限りません。そのため、単純に 1 ページおきに区切るとエラーが発生しやすくなります。

2 番目の問題は、各生徒の PDF を読み取り、その名前を対応する ID 番号に変更することでした。これは主に、必要なものを引き出す正規表現パターンに依存していました。

これは時間的な課題でもあったため、AI と連携してコードの生成を支援しました。注: これは、使用しているロジックと言語を知ることに代わるものではありません。 AI/LLM を使用してこれを書いたとき、私は思考連鎖アプローチを使用し、必要なものを一口サイズのチャンクとして与え、さらに追加する前に各チャンクをデバッグおよびテストしました。以下のコードは使用された最終コードです。セクションごとに詳しく説明します。これを地区で解決策として実装したい場合は、この投稿の最後にある TLDR を参照してください。

要件とインポート

この部分は非常に簡単で、プログラムが実行される基礎となります。

  • UI 用の Streamlit
  • PDF 操作用の pypdf2、pymupdf、および Fitz

requirements.txtの内容

streamlit
pypdf2
fitz
pymupdf

app.py のインポート

import PyPDF2
import fitz  # PyMuPDF
import re
from pathlib import Path
import concurrent.futures
import streamlit as st
import shutil
import zipfile
import os

IDの検索

この次のスニペットは、一括 PDF 内の ID の検索と、それらの分割に使用されるページのリストの作成を処理しています。これは正規表現に依存する部分であり、状況に応じて変更する必要がある場合があります。

def find_id_pages(input_pdf):
 doc = fitz.open(input_pdf)
 id_pages = []
 id_pattern = re.compile(r'\(ID#:\s*(\d )\)')

    for i, page in enumerate(doc):
 text = page.get_text()
        if id_pattern.search(text):
 id_pages.append(i)

    return id_pages

PDF を分割する

タイトルの通り、PDFを分割するために使用します。これは、個々の PDF の名前を抽出する関数を使用します。また、パフォーマンスを向上させるために、一度に最大 10 個まで並列に分割していることにも気づくでしょう。

def split_pdf(input_pdf, output_folder, progress_callback):
 input_path = Path(input_pdf)
 output_folder = Path(output_folder)
 output_folder.mkdir(parents=True, exist_ok=True)

    # Find pages with IDs
 id_pages = find_id_pages(input_pdf)

    if not id_pages:
 st.error("No ID pages found in the PDF.")
        return

 pdf_reader = PyPDF2.PdfReader(str(input_path))
 total_pages = len(pdf_reader.pages)
 temp_pdfs = []

    for i in range(len(id_pages)):
 start_page = id_pages[i]
 end_page = id_pages[i   1] if i   1 





def extract_and_rename_pdf(pdf_path, output_folder):
 doc = fitz.open(pdf_path)
 text_first_page = doc[0].get_text()

    # Extract ID using a regex pattern for the format (ID#: 01234)
 match_first_page = re.search(r'\(ID#:\s*(\d )\)', text_first_page)

    if match_first_page:
 id_value = match_first_page.group(1)
 new_pdf_path = output_folder / f'{id_value}.pdf'
 pdf_path.rename(new_pdf_path)
    else:
 new_pdf_path = output_folder / f'unknown_{pdf_path.stem}.pdf'
 pdf_path.rename(new_pdf_path)

もうすぐそこ

次はいくつかの短い関数です。1 つはすべての分割 PDF を圧縮する関数 (これを内部サーバーで実行する場合)、もう 1 つは一時ファイルをクリーンアップして、PII 学生情報がどこにでも残らないようにします。生きている必要はない。

def zip_output_folder(output_folder, zip_name):
 shutil.make_archive(zip_name, 'zip', output_folder)
def clean_up(output_folder, zip_name):
 shutil.rmtree(output_folder)
 os.remove(f"{zip_name}.zip")

UIの構築

コードの最後のビットは UI 用です。 Streamlit は多用途性を備えた WebUI です (はい、単独で実行できます)。何度か試して使いやすさを考慮した結果。シンプルにするために、アップロード ボタン、アクション ボタン (分割)、および圧縮された PDF を取得するダウンロード ボタンに絞り込みました。

# Streamlit App Portion
st.title("PDF Splitter and Renamer")

uploaded_file = st.file_uploader("Choose a PDF file", type="pdf")
output_folder = "output_folder"

if st.button("Split and Rename PDF"):
    if uploaded_file and output_folder:
        try:
            # Save uploaded file temporarily
            with open("temp_input.pdf", "wb") as f:
 f.write(uploaded_file.getbuffer())

 progress_bar = st.progress(0)
            def update_progress(progress):
 progress_bar.progress(progress)

 split_pdf("temp_input.pdf", output_folder, update_progress)

 zip_name = "output_pdfs"
 zip_output_folder(output_folder, zip_name)
 st.success("PDF split and renamed successfully!")

            with open(f"{zip_name}.zip", "rb") as f:
 st.download_button(
                    label="Download ZIP",
                    data=f,
                    file_name=f"{zip_name}.zip",
                    mime="application/zip"
 )

            # Remove temporary file
 Path("temp_input.pdf").unlink()
 clean_up(output_folder, zip_name)
        except Exception as e:
 st.error(f"An error occurred: {e}")
    else:
 st.error("Please upload a PDF file and specify an output folder.")

TLDR を起動して実行する

起動して実行するには、次のコマンドを使用するだけです (これは Linux、WSL、および MacOS を想定しています)。 http://localhost:8501 にアクセスすると、アプリにアクセスできるようになります。

git clone https://github.com/Blacknight318/act-to-sms.git
cd act-to-sms
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
streamlit run app.py

最後に

幼稚園から高等学校までの学校に通っている場合、これが役立つことを願っています。もしそうなら、拍手するか、コーヒーをおごってください。次回まで、順風と海を追ってください。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/blacknight318/easy-split-and-rename-pdfs-for-skyward-17ha?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3