NasupiiのPerl書抜帳

特許PDFファイルの名前書き換えプログラムソースコード


Perl ソースコード

#####################################################################################################
# pat_rename.pl   2023/12/26
#
# このプログラムは S-JIS で記述すること。UTF-8で記述すると文字化けでエラーとなる。
#
# J-PlatPat(特許電子図書館IPDL)からダウンロードした特許、実用新案のpdfファイルを
# わかりやすいファイル名に書き換えるプログラム。
# Copyright (C) Nasupii 
#
# 2010/07/17 初版作成
# 2011/08/26 一部訂正
#   特許公告公報の昭和64年と平成元年の判別が正しく出来るように訂正
#   特許公報などの登録系公報のファイル名に-が入らないように訂正
# 2011/10/23 意匠公報と類似意匠公報を対象に追加           <--2023/12 対象外にした
# 2012/02/25 正規表現で ".pdf" となっている箇所を "\.pdf" に訂正
#   誤記訂正だが、訂正しなくても不具合は起きないと思われる。
# 2013/01/19 商標登録公報と商標公告公報を対象に追加           <--2023/12 対象外にした
# 2018/01/01 特許電子図書館はJ-PlatPatに変わっていますが、このプログラムはそのまま使えます。
# 2023/12/26 久しぶりに試したところ、ファイル名の書式が変わっていたので、プログラムを修正した。
#   主な変更点
#   1.ファイル名の末尾に "-000000"がつくように変わったことへの対応。
#     000000は公報のページを表す。
#   2.意匠と商標をファイル名で識別できなくなったため、意匠と商標は対象外にし、
#     特許と実用新案のみ対象とした。
#   注)修正前の旧書式に関するコードはコメントアウトして残した。
#
#####################################################################################################
# ファイル名の例
#    JPA 2003000123-000000.pdf ==> 特開2003-000123.pdf    (公開特許公報)
#
#####################################################################################################
# 動作確認環境
#
#   Strawberry Perl 5.36.1.1 がインストールされた Windows 10 にて動作確認した。
#   初版作成時に動作確認した Perl ver.5.12 以降なら、たぶん動作するでしょう。
#   初版作成時に動作確認した Windows Vista以降なら、たぶん動作するでしょう。
#
# 使用方法
#   このプログラムをpdfファイルがあるフォルダにコピーし、ダブルクリックすると、
#   フォルダー内のすべてのファイル名を検査し、該当するファイルのファイル名を書き換える。
#
#####################################################################################################

use strict;
use warnings;

my ($path, @files, $file, $filex, $y, $n);

$path = ".";                       # カレントディレクトリ(フォルダ)を書き換え対象に指定

#####################################################################################################
#    ファイル名一覧を取得
#####################################################################################################

opendir (DIR,$path);               # ディレクトリを開く

@files = ();                       # @filesを初期化

while ($file = readdir(DIR)) {     # ディレクトリからひとつ読み出す
  if(-f "$path/$file") {           # 通常ファイルか検査
    push(@files, $file);           # 通常ファイルのみ @files に追加
    print $file,"\n";              # ファイル名を画面に表示する
  }
}

closedir(DIR);                     # ディレクトリを閉じる

#####################################################################################################
#   繰り返し構文の開始
#####################################################################################################
foreach $file (@files) {           # @files のすべての要素に対して実行

#####################################################################################################
#   公開特許公報     現在発行中のもの
#####################################################################################################
#  if($file =~ m/^JPA_(\d{4})([0-4]\d{5})\.pdf$/i) {
  if($file =~ m/^JPA (\d{4})([0-4]\d{5})-000000\.pdf$/i) {

#   JPA_yyyynnnnnn.pdf         yyyy:公開年  nnnnnn:一連番号<500000    旧書式 
#   JPA yyyynnnnnn-000000.pdf  yyyy:公開年  nnnnnn:一連番号<500000    現行書式
#   2000年以降は 特開yyyy-nnnnnn.pdfに変換する
#   1990年-1999年は 特開平yy-nnnnnn.pdfに変換する ただしyyは元号に変換したもの
#   1989年は nnnnnn が 091300まで昭64 091301以降が平01
#   1988年以前は 特開昭yy-nnnnnn.pdfに変換する ただしyyは元号に変換したもの
#   IPDL蓄積範囲 昭46-000001 ~
    $y = $1;
    $n = $2;
    $filex = '特開' . annual($y,  $n, '091301', '000001') . "-$n.pdf";

#####################################################################################################
#   特許公表(特許法第17条第1項及び特許法第17条の2の規定による補正の掲載)
#   事例が見つらないので対象外とした
#####################################################################################################
#  }elsif($file =~ m/^JPA5(\d{4})([5-9]\d{5})(-\d{8})\.pdf$/i) { 

#   JPA_yyyynnnnnn-yyyymmdd.pdf         yyyy:公表年  nnnnnn:一連番号>=500000 yyyymmdd:発行日
#   但し1989年の500560以降は平01 500559以前は昭64
#   IPDL蓄積範囲 昭54-500001 以降
#    $y = $1;
#    $n = $2;
#    $n2 = $3;
#    $filex = '特表\' . annual($y,  $n, '500560', '500001') . "-$n$n2.pdf";

#####################################################################################################
#   公表特許公報     現在発行中のもの
#   PCT国際出願された後、日本に国内移行された特許出願について発行されるもの。
#####################################################################################################
#  }elsif($file =~ m/^JPA_(\d{4})([5-9]\d{5})\.pdf$/i) {
  }elsif($file =~ m/^JPA (\d{4})([5-9]\d{5})-000000\.pdf$/i) {

#   JPA_yyyynnnnnn.pdf           yyyy:公表年  nnnnnn:一連番号>=500001    旧書式
#   JPA yyyynnnnnn-000000.pdf    yyyy:公表年  nnnnnn:一連番号>=500001    現行書式
#   一連番号が 500000以降である以外は公開特許公報と同じ
#   但し1989年の500560以降は平01, 500559以前は昭64
#   IPDL蓄積範囲 昭54-500001 ~
    $y = $1;
    $n = $2;
    $filex = '特表\' . annual($y,  $n, '500560', '500001') . "-$n.pdf";

#####################################################################################################
#   再公表特許公報
#   日本の特許庁に日本語でPCT国際出願された特許出願について、日本の特許庁が発行するもの。
#   発行されるのは、WIPOから日本語で国際公開された後なので、再公表特許公報を見る機会は少ないでしょう。
#   日本の特許庁のウエブサイトによると「令和3年12月23日発行分をもって廃止となりました」とのことです。
#####################################################################################################
#  }elsif($file =~ m/^WOA1(\d{4})(\d{6})\.pdf/i) { 
  }elsif($file =~ m/^JPA10(\d{2})(\d{6})-000000\.pdf/i) {
  
#   WOA1yyyynnnnnn.pdf         yyyy:国際公開年4桁      nnnnnn:一連番号     旧書式
#   JPA10yynnnnnn-000000.pdf   yy  :国際公開年下2桁    nnnnnn:一連番号     現行書式

#   JPA1092021798-000000.pdf   国際公開番号 WO92/21798      例1
#   JPA1000030419-000000.pdf   国際公開番号 WO00/30419      例2
#   JPA1000030419-000000.pdf   国際公開番号 WO00/30419      例3
#   JPA1009050961-000000.pdf   国際公開番号 WO2009/050961   例4
#   JPA1021014667-000000.pdf   国際公開番号 WO2021/014667   例5

#   国際公開番号の年は、2001年12月のあたりで西暦下2桁から西暦4桁に変わったようだ。
#   IPDL蓄積範囲 79/000329 ~

    $y = $1;
    $n = $2;
    if($y > 25) {
      $y+=1900;
    }else{
      $y+=2000;
    }
    $filex = '再表\' . "$y-$n.pdf";

#####################################################################################################
#   特許公報     現在発行中のもの
#####################################################################################################
#  }elsif($file =~ m/^JPB_000(\d{7})\.pdf/i) {
  }elsif($file =~ m/^JPB 00(\d{7})-000000\.pdf/i) {

#   JPB_000nnnnnnn.pdf        nnnnnnn:一連番号        旧書式
#   JPB 00nnnnnnn-000000.pdf  nnnnnnn:一連番号        現行書式
#   IPDL蓄積範囲 2500001 ~
    $n = $1;
    $filex = '特登' . "$n.pdf";

#####################################################################################################
#   公告特許公報
#   実体審査が終わった後「特許公告」を出し、異議等を受け付けてから設定登録していた時代に発行された。
#   現在は発行されていない。
#   書面の表題は「特許公告第〇〇〇号」となっていた。
#   設定登録されても特許公報が別に出るわけではないので、先行技術調査等では、公告特許公報を
#   特許公報の代わりに見ていた。
#####################################################################################################
#  }elsif($file =~ m/^JPB_([1-2]\d{3})(\d{6})\.pdf/i) {
  }elsif($file =~ m/^JPB ([1-2]\d{3})(\d{6})-000000\.pdf/i) {

#   JPB_yyyynnnnnn.pdf         nnnnnn:一連番号        旧書式
#   JPB yyyynnnnnn-000000.pdf  nnnnnn:一連番号        現行書式
#   但し1989年の012441以降は平01 012440以前は昭64
#       1926年=T15年=S01年は特許公告なし、
#   IPDL蓄積範囲 大11-000001 ~ 平08-034772
    $y = $1;
    $n = $2;
    $filex = '特公' . annual($y,  $n, '012441', '000001') . "-$n.pdf";

#####################################################################################################
#   特許発明明細書
#   特許制度が始まった当初は、登録されたら特許発明明細書が発行されていた。
#   書面の表題は、単に「特許第〇〇〇号」となっていた。現在の特許公報に相当する。
#####################################################################################################
#  }elsif($file =~ m/^JPC_000(\d{7})\.pdf/i) {
  }elsif($file =~ m/^JPC 00(\d{7})-000000\.pdf/i) {

#   JPC_000nnnnnnn.pdf         nnnnnnn:一連番号       旧書式
#   JPC 00nnnnnnn-000000.pdf   nnnnnnn:一連番号       現行書式
#   IPDL蓄積範囲 1 ~ 216017
    $n = $1;
    $filex = '特明' . "$n.pdf";

#####################################################################################################
#   特許審判請求公告
#   現在は発行されていない
#####################################################################################################
#  }elsif($file =~ m/^JPH_000(\d{7})\.pdf/i) {
  }elsif($file =~ m/^JPH 00(\d{7})-000000\.pdf/i) {

#   JPH_000nnnnnnn.pdf        nnnnnnn:一連番号        旧書式
#   JPH 00nnnnnnn-000000.pdf  nnnnnnn:一連番号        現行書式
#   IPDL蓄積範囲 72 ~ 814
    $n = $1;
    $filex = '特請' . "$n.pdf";

#####################################################################################################
#   公開実用新案公報
#   過去に発行されていたが、方式審査のみで登録されるようになってから発行されなくなった。
#####################################################################################################
#  }elsif($file =~ m/^JPU_([1-2]\d{3})([0-4]\d{5})\.pdf/i) {
  }elsif($file =~ m/^JPU ([1-2]\d{3})([0-4]\d{5})-000000\.pdf/i) { 

#   JPU_yyyynnnnnn.pdf     yyyy:公開年  nnnnnn:一連番号<=500000          旧書式
#   JPU yyyynnnnnn-000000  yyyy:公開年  nnnnnn:一連番号<=500000          現行書式
#   2000年以降は 実開yyyy-nnnnnn.pdfに変換する
#   1990年-1999年は 実開平yy-nnnnnn.pdfに変換する ただしyyは元号に変換したもの
#   1989年は nnnnnn が 091300まで昭64 091301以降が平01
#   1988年以前は 特開昭yy-nnnnnn.pdfに変換する ただしyyは元号に変換したもの
#   公開実用新案公報は昭46-000001 以降のものが蓄積されている
#   但し1989年の057701以降は平01 057700以前は昭64
#   IPDL蓄積範囲 昭46-000001 ~ 2006-000001

    $y = $1;
    $n = $2;
    $filex = '実開' . annual($y,  $n, '057701', '000001') . "-$n.pdf";

####################################################################################################
#   公開実用新案全文明細書
#   書面の表題は「公開実用新案公報」となっている。現在は発行されていない。
####################################################################################################
#  }elsif($file =~ m/^JPU1([1-2]\d{3})(\d{6})\.pdf/i) {
  }elsif($file =~ m/^JPU1([1-2]\d{3})(\d{6})-000000\.pdf/i) {

#   JPU1yyyynnnnnn.pdf           yyyy:公開年  nnnnnn:一連番号          旧書式
#   JPU1yyyynnnnnn-000000.pdf    yyyy:公開年  nnnnnn:一連番号          現行書式
#   但し1989年の057701以降は平01 057700以前は昭64
#   IPDL蓄積範囲 昭46-000001 ~ 平04-138600
    $y = $1;
    $n = $2;
    $filex = '実全' . annual($y,  $n, '057701', '000001') . "-$n.pdf";

#####################################################################################################
#   登録実用新案公報   現在発行中
#####################################################################################################
#  }elsif($file =~ m/^JPU_000(\d{7})\.pdf/i) {
  }elsif($file =~ m/^JPU 00(\d{7})-000000\.pdf/i) {

#   JPU_000nnnnnnn.pdf          nnnnnnn:一連番号           旧書式
#   JPU 00nnnnnnn-000000.pdf    nnnnnnn:一連番号           現行書式
#   IPDL蓄積範囲 3000001 以降
    $n = $1;
    $filex = '登実' . "$n.pdf";

#####################################################################################################
#   実用新案登録公報
#   実体審査後に登録された時代の実用新案について発行された登録公報で、現在は発行されていない。
#####################################################################################################
#  }elsif($file =~ m/^JPY_000(\d{7})\.pdf/i) {
  }elsif($file =~ m/^JPY 00(\d{7})-000000\.pdf/i) {

#   IPDL蓄積範囲 2500001 ~ 2607899
#   JPY_000nnnnnnn.pdf          nnnnnnn:一連番号           旧書式
#   JPY 00nnnnnnn-000000.pdf    nnnnnnn:一連番号           現行書式
    $n = $1;
    $filex = '実登' . "$n.pdf";

#####################################################################################################
#   実用新案出願公告
#   実体審査が終わった後「実用新案公告」を出し、異議等を受け付けてから設定登録していた時代に発行された。
#   現在は発行されていない。
#   設定登録されても登録公報が出るわけではないので、先行技術調査等では、実用新案出願公告を
#   登録公報の代わりに見ていた。
#####################################################################################################
#  }elsif($file =~ m/^JPY_([1-2]\d{3})(\d{6})\.pdf/i) {
  }elsif($file =~ m/^JPY ([1-2]\d{3})(\d{6})-000000\.pdf/i) {

#   JPY_yyyynnnnnn.pdf            yyyy:公告年  nnnnnn:一連番号          旧書式
#   JPY yyyynnnnnn-000000.pdf     yyyy:公告年  nnnnnn:一連番号          現行書式
#   但し1989年の007601以降は平01 007600以前は昭64
#       1926年=T15年=S01年は実用公告なし、
#   IPDL蓄積範囲 大11-000001 ~ 平08-011090
    $y = $1;
    $n = $2;
    $filex = '実公' . annual($y,  $n, '007601', '000001') . "-$n.pdf";

#####################################################################################################
#   公表実用新案公報
#   PCT国際出願された後、日本に国内移行された実用新案出願について発行されるもの。
#   実表平10-500001以降発行されたものが無い(2023年時点)
#   公開実用新案公報が発行されなくなったのにともない、公表実用新案公報も発行されなくなったようだ。
#####################################################################################################
#  }elsif($file =~ m/^JPU_([1-2]\d{3})([5-9]\d{5})\.pdf/i) {
  }elsif($file =~ m/^JPU ([1-2]\d{3})([5-9]\d{5})-000000\.pdf/i) {

#   JPU_yyyynnnnn.pdf            yyyy:公表年  nnnnnn:一連番号>=500001       旧書式
#   JPU_yyyynnnnn-000000.pdf     yyyy:公表年  nnnnnn:一連番号>=500001       現行書式
#   IPDL蓄積範囲 昭54-500001 ~ 平10-500001
    $y = $1;
    $n = $2;
    $filex = '実表\' . annual($y,  $n, '500002', '500001') . "-$n.pdf";

#####################################################################################################
#   登録実用新案明細書
#   公報の表題には「登録実用新案公報」または単に「実用新案登録第〇〇〇号」と書いてある。
#   現在は発行されていない。現在の登録実用新案公報に相当する。
#####################################################################################################
#  }elsif($file =~ m/^JPZ_000(\d{7})\.pdf/i) {
  }elsif($file =~ m/^JPZ 00(\d{7})-000000\.pdf/i) {
  
#   JPZ_000nnnnnnn.pdf         nnnnnnn:一連番号       旧書式
#   JPZ 00nnnnnnn-000000.pdf   nnnnnnn:一連番号       現行書式
#   IPDL蓄積範囲 1 ~ 406203
    $n = $1;
    $filex = '実明' . "$n.pdf";

#####################################################################################################
#   実用新案審判請求公告
#####################################################################################################
#  }elsif($file =~ m/^JPI_000(\d{7})\.pdf/i) {
  }elsif($file =~ m/^JPI 00(\d{7})-000000\.pdf/i) {

#   JPI_000nnnnnnn.pdf         nnnnnnn:一連番号       旧書式
#   JPI 00nnnnnnn-000000.pdf   nnnnnnn:一連番号       現行書式
#   IPDL蓄積範囲 32 ~ 330
    $n = $1;
    $filex = '実請' . "$n.pdf";

#####################################################################################################
#   意匠公報
#   ファイル名からJPSの様な文字がなくなり、種類の判別が出来なくなったため、対象外とした
#####################################################################################################
#  }elsif($file =~ m/^JPS_00(\d{7})\.pdf/i) {

#    JPS_00nnnnnnn.pdf  nnnnnnn:一連番号       旧書式
#    IPDL蓄積範囲 0108683 ~ 
#    $n = $1;
#    $filex = '意登' . "$n.pdf";

#####################################################################################################
#   類似意匠公報
#   ファイル名からJPSの様な文字がなくなり、種類の判別が出来なくなったため、対象外とした
#####################################################################################################
#  }elsif($file =~ m/^JPS_00(\d{7})(\d{3})\.pdf/i) {

#    JPS_00nnnnnnn.pdf  nnnnnnn:一連番号       旧書式
#    IPDL蓄積範囲 0108683 ~ 但し、類似意匠に限る
#    $n = $1;
#    $n1 = $2;
#    $filex = '意登' . "$n-$n1.pdf";

#####################################################################################################
#   商標登録公報 
#   ファイル名からJPTの様な文字がなくなり、種類の判別が出来なくなったため、対象外とした
#####################################################################################################
#  }elsif($file =~ m/^JPT_00(\d{7})-\d{8}-\d{2}\.pdf/i) {

#    JPT_00nnnnnnn-yyyymmdd-mm.pdf    nnnnnnn:一連番号   yyyymmdd:登録公報発行日       旧書式
#                                     mm:区分?
#    $n = $1;
#    $filex = '商登' . "$n.pdf";

#####################################################################################################
#   商標公告公報
#   ファイル名からJPTの様な文字がなくなり、種類の判別が出来なくなったため、対象外とした
#####################################################################################################
#  }elsif($file =~ m/^JPT_(3|4)(\d{2})(\d{6})-\d{8}-\d{2}\.pdf/i) {

#    JPT_jyynnnnnn-kkkkkkkk-mm.pdf    j:年号(3:昭和, 4:平成)       旧書式
#                                    nnnnnn:一連番号6ケタ
#                                    kkkkkkkk:9ケタの数字
#                                    mm:区分?  00の場合もある
#    但し j=4 で yy=01 の年は 一連番号  ~022000  昭64
#                                       022001~  平01
#    $j = $1;
#    $y = $2;
#    $n = $3;
#    if($j eq "3") {
#      $filex = '商公昭' . "$y-$n.pdf";
#    }elsif("$j$y" eq "401" and $n le "022000") {
#      $filex = '商公昭64' . "-$n.pdf";
#    }else{
#      $filex = '商公平' . "$y-$n.pdf";
#    }

#####################################################################################################
#  ifブロックの例外処理と終端
#####################################################################################################

  }else{
    next;                                        # 対象外のファイルには何もしない
  }
  
#####################################################################################################
#  ファイル名変更と繰り返し構文の終端
#####################################################################################################

#  print "rename $file $filex\n";
  rename("$path/$file", "$path/$filex");
}

#####################################################################################################
#  メインルーチンの終端
#####################################################################################################
exit;


#####################################################################################################
#  西暦年を和暦年に換算するサブルーチン
#####################################################################################################
sub annual {
# $_[0] : 西暦年
# $_[1] : 一連番号
# $_[2] : 平成元年最初の一連番号(この年は最初昭64で始まり途中から平01に変わった)
# $_[3] : 昭和元年最初の一連番号(この年は最初大15で始まり途中から昭01に変わった)
# 戻り値 : 書き換え後の年表示

  if($_[0] ge '2000') {
    return($_[0]);
  }elsif($_[0] ge '1990') {
    return('平' . sprintf("%02d",$_[0] - 1988));
  }elsif($_[0] eq '1989') {
    if($_[1] ge $_[2]) {
      return('平01');
    }else{
      return('昭64');
    }
  }elsif($_[0] ge '1927') {
    return('昭' . sprintf("%02d",$_[0] - 1925));
  }elsif($y eq "1926"){
    if($_[1] ge $_[3]) {
      return('昭01');
    }else{
      return('大15');
    }
  }else{
    return('大' . sprintf("%02d",$_[0] - 1911));
  }
}