【プログラム】自炊したPDFファイルをEvernoteでDB管理②<ファイル分割とEvernoteの活用>


PDFの分割.bat

echo off echo. powershell -ExecutionPolicy RemoteSigned -command ./PDFの分割_v1.0.ps1 pause
pause

PDFの分割_v1.0.ps1


<# ツール概要
■概要
・EverNoteでOCR処理をさせるには、1つのPDFファイルが100ページ未満、25MB未満である必要があるため、本ツールを使って分割する。
・「10_moto_pdf」フォルダ配下に分割対象のPDFファイルを格納する。サブフォルダがあってもOK
・「PDFの分割.bat」を実行すると、1つのファイルが99ページ以内、24MB以内になるように分割
 <分割処理の流れ>
  (1)すべてのPDFファイルの「タイトル」、「フルパス」、「サイズ」、「ページ数」、「ページ数を99で割った数」を調べてリスト化
 (2)リストファイルをもとに順番に処理を実施
  ①99ページ毎に分割
    1つ目(0ページから99ページ)      「元ファイル名 + 【OCR_0】.pdf」 22MB
    2つ目(100ページから198ページ)   「元ファイル名 + 【OCR_1】.pdf」 18MB
    3つ目(199ページから297ページ)   「元ファイル名 + 【OCR_2】.pdf」 25MB → サイズが大きいため分割処理実施
  ②ファイルサイズが24MBより大きい場合は、さらに分割
    3つ目の1(199ページから249ページ) 「元ファイル名 + 【OCR_2-1】.pdf」 12.5MB
    3つ目の2(250ページから297ページ) 「元ファイル名 + 【OCR_2-2】.pdf」 12.5MB

■フォルダについて
00_List → バッチ起動のタイミングで、対象一覧のリスト(list.txt)を新規作成。完成時に、list_yyyymmdd_hhmmss.txtとして自動でバックアップされる
10_moto_pdf → 変換対象のPDFファイルを格納するフォルダ。サブフォルダも対象となる
20_new_pdf → 分割したファイルが保存される。ファイル名は、サブフォルダも同じ構成で作成される。
30_hennkannzumi_pdf → 変換処理が終わった元PDFファイルをこのフォルダ配下に移動
40_Log_folder → 処理のログが格納される

■サブフォルダの例
私は、次の9つのサブフォルダに分類してから、変換処理を行っています。変換後は、EVERNOTEに9つのサブフォルダと紐づくノートブックを作って、
インポートフォルダの機能で9つのルールもつくり、EVERNOTEに一括インポートするようにしています。

<分類の例>
1_漫画 →  コミック・アニメ
2_小説・評論・人文 → 文学・評論、人文・思想
3_エンタメ・雑誌 →  エンターテインメント、芸能、ゲーム、雑誌、音楽
4_教養・歴史・資格 → 語学・辞事典・年間、教育・学参・受験、歴史・地理、資格・検定
5_ビジネス・政治 → ビジネス・経済・キャリア、投資・金融・経営、社会・政治
6_趣味・スポーツ・IT → 実用・スポーツ・ホビー、科学・テクノロジー、コンピュータ・インターネット、旅行
7_グルメ・医療・こども → 医学・薬学、アート・建築・デザイン、暮らし・健康・子育て
8_ハウツー・ノウハウ
9_その他 → ISBNコードがないもの

■注意点
改変は自由にして頂いて構いませんが、ご利用は自己責任でお願いします。

■変更履歴(GiiQ)
2018/01/19 Ver1.0 新規公開
#>

#本プログラムのカレントパス
$scriptPath = $MyInvocation.MyCommand.Path
$ParentPath = (Split-Path -Parent $scriptPath) + "\"

#変換データのフォルダ設定
$00_List = $ParentPath + "00_List\"
$10_moto_pdf = $ParentPath + "10_moto_pdf\"
$20_new_pdf  = $ParentPath + "20_new_pdf\"
$30_hennkannzumi_pdf   = $ParentPath + "30_hennkannzumi_pdf\"
$40_Log_folder = $ParentPath + "40_Log_folder\"

#リスト
$csv_file  = $00_List + "list.txt"
$csv_file_date  = $00_List + "list_" + (get-date -Format('yyyyMMdd_HHmmss')) + ".txt"

#初期値
$i = 1

#---------------------------------------------------------------
# 関数名 : PrintMsg
# 処理   : 日時を付与してメッセージを標準出力する。
#          第1引数が E の場合は、赤文字で標準出力する。
# 引数   : 第1引数 - I (情報), E (エラー),M(メッセージ)
#          第2引数 - メッセージ
# 戻り値 : なし
#---------------------------------------------------------------
Function PrintMsg ([string] $type, [string] $msg) {

    $now = Get-Date -Format "yyyy/MM/dd HH:mm:ss"
    $message = "$now $type $msg"
    $message_error = "$msg"

    if ($type -eq "I") {
        Write-Host $message
    } elseif($type -eq "N") {
        Write-Host $message -ForegroundColor Green
    } elseif($type -eq "W") {
        Write-Host $message -ForegroundColor yellow
    }else {
        Write-Host $message -ForegroundColor Red
        Write-Output $message_error | Out-File ${g_log_path_error} -Append -Encoding Default
    }

    # ログフォルダが存在していない場合は新規作成
    if (-not (Test-Path $g_log_folder -PathType Container)) {
        $temp = mkdir $g_log_folder
    }

    # ログファイルに出力
    Write-Output $message | Out-File ${g_log_path} -Append -Encoding Default
}
 
# ログのファイル名
$g_log_folder = $40_Log_folder
$g_script_base = [System.IO.Path]::GetFileNameWithoutExtension($MyInvocation.MyCommand.Name)
$g_yyyymmdd = Get-Date -Format "yyyyMMdd"
$g_log_path = "${g_log_folder}\${g_script_base}_${g_yyyymmdd}.log"
$g_log_path_error = "${g_log_folder}\${g_script_base}_${g_yyyymmdd}_error.log"
#---------------------------------------------------------------

#---------------------------------------------------------------
# 関数名 : error_divide
# 処理   : エラー時にファイルを分割
# 戻り値 : なし
#---------------------------------------------------------------
Function error_divide($e_new_name,$e_num) {
        
        $e_pdf = pdftk.exe $e_new_name dump_data
        $e_NumberOfPages = [regex]::match($e_pdf,'NumberOfPages: (\d+)').Groups[1].Value
        $e_Pages_num = [math]::ceiling( $e_NumberOfPages / [int]$e_num)
        
        ### ページ数計算
        $e_start = 1
        $e_end = $e_Pages_num

            for ($e=1 ; $e -lt $e_num ; $e++)
            {
                write-host "<分割処理>"
                $e_new_name2 = ($e_new_name).Replace("】.pdf","-$e】.pdf")
                PrintMsg "N" "No. $e  <$e_start - $e_end> $e_new_name2"

                #PDF分割処理実行
                pdftk $e_new_name cat $e_start-$e_end output $e_new_name2
         $e_File_Size = [math]::Round((Get-ChildItem $e_new_name2 | Measure-Object -Sum Length).Sum / 1MB , 1) 
                PrintMsg "N" "$e_File_Size MBです。"

                $e_start += $e_Pages_num
                $e_end += $e_Pages_num
            }
            if(!(($e_end -$e_NumberOfPages) -eq $e_Pages_num))  #99ページで割り切れない場合の処理
            {
                $e_new_name2 = ($e_new_name).Replace("】.pdf","-$e】.pdf")
                $e_end =$e_NumberOfPages
                PrintMsg "N" "No. $e  <$e_start - $e_end> $e_new_name2"
                #PDF分割処理実行            
                pdftk $e_new_name cat $e_start-$e_end output $e_new_name2
         $e_File_Size = [math]::Round((Get-ChildItem $e_new_name2 | Measure-Object -Sum Length).Sum / 1MB , 1) 
                PrintMsg "N" "$e_File_Size MBです。"
            }
}

#---------------------------------------------------------------
# 関数名 : FilesizeCheck
# 処理   : ファイルサイズチェック
# 戻り値 : なし
#---------------------------------------------------------------
Function FilesizeCheck {

        #ファイルサイズチェック
        $File_Size = [math]::Round((Get-ChildItem $new_name | Measure-Object -Sum Length).Sum / 1MB , 1) 
        $count = [math]::ceiling($File_Size / 24 )

        if($count -le 1){
            PrintMsg "N" "$File_Size MBです。(24MB未満)"
        }
        else
        {
            PrintMsg "W" "$File_Size MBです。(24MB以上、分割処理実施)"
            error_divide $new_name $count
            Remove-Item $new_name -Force
        }

}
#---------------------------------------------------------------

# リスト作成
###################
Function makelist {
   Get-ChildItem -path $10_moto_pdf -Recurse -include *.pdf -exclude *OCR* | foreach-object {
    #サイズ
 $Length_MB = [math]::round(($_.Length / 1MB),0)        

    #全体ページ数
    $pdf = pdftk.exe $_.FullName dump_data
    $NumberOfPages = [regex]::match($pdf,'NumberOfPages: (\d+)').Groups[1].Value
        
 #全体ページを99で割った場合
    $num = [math]::floor( $NumberOfPages / 99)

    New-Object PSObject -Property @{
            Name = $_.Name
            FullName = $_.FullName
            Length_MB = $Length_MB
            NumberOfPages = $NumberOfPages
            num = $num
        }
   } | select name,fullname,Length_MB,numberofpages,num | export-csv -notypeinformation $csv_file -encoding Default
    copy-item $csv_file $csv_file_date
}
###################

function Main{
    PrintMsg "I" "=========== 【START】=========================="

    Import-Csv $csv_file -encoding Default  | Select-Object "Name","FullName","Length_MB","NumberOfPages","num" | %{
            PrintMsg "I" "------------- $i -------------"
            $global:flg = 0
            $fullname = $_.fullname
            $Length_MB = $_.Length_MB
            $NumberOfPages = $_.NumberOfPages
            PrintMsg "I" "対象: $fullname"
            PrintMsg "I" "サイズ(MB): $Length_MB  ページ数: $NumberOfPages"
            $name = $_.name
            $NumberOfPages = [int]($_.NumberOfPages)
            $parent_folder =(split-path $_.fullname -parent)
            $folder_name = (Split-Path $parent_folder -Leaf)

            ### 新しいファイルの準備
            $new_name_tmp = ($_.fullname).replace($10_moto_pdf,$20_new_pdf)
            $new_name_folder = (Split-Path $new_name_tmp -parent)

            #新しいファイルの保存場所チェック
            if(!(test-path $new_name_folder))
            {
                PrintMsg "I" "フォルダがありません $new_name_folder"
                New-Item $new_name_folder -ItemType Directory
            }

            ### ページ数計算
            $num = [int]($_.num)
            $kugiri_page = 99

            $start = 1
            $end = $kugiri_page

            #PDF分割処理
            for ($j=0 ; $j -lt $num ; $j++)
            {

                $global:new_name = ($new_name_tmp).Replace(".pdf","【OCR_$j】.pdf")
                PrintMsg "N" "No. $j  <$start - $end> $new_name"
            
                #PDF分割処理実行            
                pdftk $fullname cat $start-$end output $new_name
                FilesizeCheck

                $start += $kugiri_page
                $end += $kugiri_page
            }
            if(!(($end -$NumberOfPages) -eq $kugiri_page))
            {
                $global:new_name = ($new_name_tmp).Replace(".pdf","【OCR_$j】.pdf")
                $end =$NumberOfPages
                PrintMsg "N" "No. $j   <$start - $end> $new_name"
            
                #PDF分割処理実行
                pdftk $fullname cat $start-$end output $new_name
                FilesizeCheck
            }
            ##ファイル移動
            ### 新しいファイルの準備
            $move_name_tmp = ($_.fullname).replace($10_moto_pdf,$30_hennkannzumi_pdf)
            $move_name_folder = (Split-Path $move_name_tmp -parent)
            if(!(test-path $move_name_folder))
            {
                PrintMsg "I" "フォルダがありません $move_name_folder"
                New-Item $move_name_folder -ItemType Directory

            }
            
                #PrintMsg "N" "ファイル移動 $move_name_tmp"
                Move-Item $fullname $move_name_tmp        
                
            write-host ""
            $i++
    }
    PrintMsg "I" "=========== 【END】=========================="
}

makelist
Main