Acrobat python

[python]PDFのオブジェクト情報を取得して注釈をつける(テキスト、画像、オブジェクト) 画像にだけ位置情報RECTを入れるようにした

20241025031455_1610x4502

ダウンロード - getpdfinfov20241019.zip




サンプルコード

サンプルソース(参考)
行番号ソース
001#!/usr/bin/env python3
002# coding: utf-8
003# 20240828 出力結果のテキスト少し読みやすくした
004# 20240912 出力結果を注釈にして付与する形式にした
005# 20240927 フォント情報とオブジェクトの塗り情報を入れるようにした
006# 20240929 MSゴシック等SJISのフォント名に対応した
007# 20241019 画像の位置情報RECTを入れた
008#
009import sys
010import os
011import pymupdf
012
013# 入力ファイル受け取り
014argFilePath = sys.argv
015pdf_file_path = str(argFilePath[1])
016#テスト用
017# pdf_file_path = "/Users/SOMEUID/Desktop/SOME.pdf"
018
019
020#パスからベースファイル名とコンテナを取得
021container_directory = os.path.dirname(pdf_file_path)
022file_name = os.path.basename(pdf_file_path)
023base_file_name = os.path.splitext(file_name)[0]
024#保存先ディレクトリ
025save_dir_name = base_file_name + "情報"
026save_dir_path = os.path.join(container_directory, save_dir_name)
027os.makedirs(save_dir_path, exist_ok=True)
028# テキスト保存先パス
029save_file_path = save_dir_path + "/" + base_file_name + ".PDF情報.txt"
030# フォント一覧用テキスト
031save_font_list_file_path = save_dir_path + "/" + base_file_name + ".FontList.txt"
032list_fontname = set()
033# カラー一覧用テキスト
034save_color_list_file_path = save_dir_path + "/" + base_file_name + ".ColorList.txt"
035list_color = set()
036#注釈入れたPDFの保存先
037pdf_save_file_path = save_dir_path + "/" + base_file_name + ".PDF情報.pdf"
038# PDFドキュメントを開く
039pdf_document = pymupdf.open(pdf_file_path)
040###################
041def float_to_hex(float_color_no):
042  if float_color_no is None:
043    return "None"
044  red = int(float_color_no[0] * 255)
045  green = int(float_color_no[1] * 255)
046  blue = int(float_color_no[2] * 255)
047  hex_color = "#{:02X}{:02X}{:02X}".format(red, green, blue)
048  return hex_color
049
050def int_to_rgb(color_int):
051  red = (color_int >> 16) & 0xFF
052  green = (color_int >> 8) & 0xFF
053  blue = color_int & 0xFF
054  return red, green, blue
055
056###################
057#テキストファイルを用意して
058with open(save_file_path, "w", encoding="utf-8") as file:
059#PDFページを順に処理
060  for page_number in range(len(pdf_document)):
061  #PDFページを開いて
062    pdf_page = pdf_document.load_page(page_number)
063    #PDFページの回転を調べる
064    rotation_angle = pdf_page.rotation
065    #テキスト用の変えページ
066    print(f"PAGE No:{page_number + 1} ----------------------")
067    file.write(f"PAGE No:{page_number + 1} ----------------------\n")
068    if rotation_angle == 0:
069      file.write(f"PAGE 回転:{rotation_angle}\n")
070    else:
071      file.write(f"PAGE 回転:{rotation_angle}※※※\n")
072###################
073    list_draw_object = pdf_page.get_drawings()
074    for item_draw in list_draw_object:
075      seqno_no = item_draw['seqno']
076      fill_color = item_draw['fill']
077      fill_color_hex = float_to_hex(fill_color)
078      list_color.add(fill_color_hex)
079      print(f"塗色: {fill_color_hex}")
080      line_color = item_draw['color']
081      line_color_hex = float_to_hex(line_color)
082      list_color.add(line_color_hex)
083      print(f"線色: {line_color_hex}")
084      draw_rect = item_draw['rect']
085      print(f"RECT: {draw_rect}")
086      left_top_x = draw_rect.x0
087      left_top_y = draw_rect.y0
088      rect_add_annot = pymupdf.Rect(left_top_x, left_top_y, left_top_x +
089                                 20, left_top_y + 20)
090
091      # コンソールに表示
092      print(f"DRAW {seqno_no}:")
093      print(f"  - 線色: {line_color_hex}")
094      print(f"  - 塗色: {fill_color_hex}")
095
096      # テキストファイル用にも書き出す
097      file.write(f"DRAW {seqno_no}:")
098      file.write(f"  - 線色: {line_color_hex}")
099      file.write(f"  - 塗色: {fill_color_hex}")
100      file.write(f"\n")
101
102      # 同じ内容を注釈用のテキストにする
103      list_annot_text = []
104      list_annot_text.append(f"DRAW {seqno_no}:")
105      list_annot_text.append(f"  - 線色: {line_color_hex}")
106      list_annot_text.append(f"  - 塗色: {fill_color_hex}")
107      str_annot_text = "\n".join(list_annot_text)
108
109      # 注釈追加
110      obj_add_annot = pdf_page.add_text_annot(
111                            rect_add_annot.tl, str_annot_text, "Comment")
112      strSetTitle = (f"DRAW:NO: {seqno_no}")
113      obj_add_annot.set_info({
114                            'title': 'DRAW情報',
115                            'author': 'DRAW情報',
116                            'subject': strSetTitle
117                        })
118
119###################
120    
121    # ページ内のテキスト情報を取得
122    list_text_block = pdf_page.get_text("dict")
123    # テキストブロックの数だけ繰り返し
124    for item_block in list_text_block['blocks']:
125      if 'lines' in item_block:
126        for line in item_block['lines']:
127          for span in line['spans']:
128            text_no = item_block['number']
129            font_name = span['font']
130            byte_sequence = font_name.encode('latin-1')
131            font_name = byte_sequence.decode('shift_jis')
132            list_fontname.add(font_name)
133            font_size = span['size']
134            text_bbox = span['bbox']
135            color_int = span['color']
136            color_hex = "#{:06X}".format(color_int)
137            list_fontname.add(color_hex)
138            list_color.add(color_hex)
139            left_top_x = text_bbox[0]
140            left_top_y = text_bbox[1]
141            box_w = text_bbox[2] - text_bbox[0]
142            box_h = 20
143            rect_add_annot = pymupdf.Rect(
144                left_top_x, left_top_y, left_top_x + box_w, left_top_y + box_h)
145
146            # コンソールに表示
147            print(f"TEXT {text_no}:")
148            print(f"  - Font: {font_name}")
149            print(f"  - Size: {font_size}")
150            print(f"  - Color: {color_hex}")
151
152            # テキストファイル用にも書き出す
153            file.write(f"TEXT {text_no}:\n")
154            file.write(f"  - Font: {font_name}\n")
155            file.write(f"  - Size: {font_size}\n")
156            file.write(f"  - Color: {color_hex}\n")
157            file.write(f"\n")
158
159            # 同じ内容を注釈用のテキストにする
160            list_annot_text = []
161            list_annot_text.append(f"TEXT {text_no}:")
162            list_annot_text.append(f"  - Font: {font_name}")
163            list_annot_text.append(f"  - Size: {font_size}")
164            list_annot_text.append(f"  - Color: {color_hex}")
165            str_annot_text = "\n".join(list_annot_text)
166
167            # 注釈追加
168            obj_add_annot = pdf_page.add_text_annot(
169              rect_add_annot.tl, str_annot_text)
170            strSetTitle = (f"TEXT:NO: {text_no}")
171            obj_add_annot.set_info({
172                                  'title': 'テキスト情報',
173                                        'author': 'テキスト情報',
174                                        'subject': strSetTitle
175                              })
176
177###################
178    # ページ内の画像情報を取得
179    image_list = pdf_page.get_images(full=True)
180    #画像の数
181    num_cnt_images = len(image_list)
182    if num_cnt_images == 0:
183      print(f"ページ:{page_number + 1} には画像がありません")
184      file.write(f"ページ:{page_number + 1} には画像がありません\n\n")
185    else:
186      print(f"ページ:{page_number + 1} には画像が {num_cnt_images}点ありました")
187      file.write(f"ページ:{page_number + 1} には画像が {num_cnt_images}点ありました\n")
188
189  # 画像情報の表示
190    for img_index, item_image in enumerate(image_list, start=1):
191      xref = item_image[0]
192      pixmap_ref = pymupdf.Pixmap(pdf_document, xref)
193      base_image = pdf_document.extract_image(xref)
194      image_ext = base_image["ext"]
195      # 画像のサイズ
196      image_bytes = base_image["image"]
197      image_size = len(image_bytes) / (1024 * 1024)
198      # ピクセルサイズと解像度
199      image_width = pixmap_ref.width
200      image_height = pixmap_ref.height
201      # img_rect = pdf_page.get_image_rects(xref)[0]
202      #画像の位置RECTを取得(同一画像が同一ページに複数配置されている場合はリストになる)
203      list_image_rects = pdf_page.get_image_rects(xref)
204      #RECT画像の位置情報の数だけ繰り返す
205      for rect_index, img_rect in enumerate(list_image_rects, start=1):
206        # RECT左上
207        left_top_x = img_rect.x0
208        left_top_y = img_rect.y0
209        # 幅 縦
210        rect_width = img_rect.width
211        rect_height = img_rect.height
212        #解像度
213        resolution_width = image_width / (rect_width / 72)
214        resolution_height = image_height / (rect_height / 72)
215        resolution_width = round(resolution_width)
216        resolution_height = round(resolution_height)
217        #カラースペース判定
218        colorspace = ""
219        num_colorspace = base_image.get('colorspace', 1)
220        if pixmap_ref.is_monochrome == 0:
221          if pixmap_ref.is_unicolor == True:
222            colorspace = "ユニ/SPOT"
223          else:
224            colorspace = "マルチ/ICC"
225        else:
226          colorspace = "モノ/単色"
227        #カラースペース判定 ここの判定に自信がない
228        if num_colorspace == 1:
229          colorspace = (f"{colorspace} :Gray/BW")
230        elif num_colorspace == 2:
231          colorspace = (f"{colorspace}: Gray/BWA")
232        elif num_colorspace == 3:
233          colorspace = (f"{colorspace}: RGB")
234        elif num_colorspace == 4:
235          colorspace = (f"{colorspace}: CMYK")
236        else:
237          colorspace = (f"{colorspace}: Unknown: ")
238        #コンソールに表示
239        print(f"Image {img_index}:")
240        print(f"  - Xref: {xref}")
241        print(f"  - Size: {base_image['width']}x{base_image['height']}")
242        print(f"  - Resolution: {resolution_width}x{resolution_height} ppi")
243        # print(f"  - Format: {image_ext}")書き出し後だから意味ない
244        print(f"  - ColorSpace: {colorspace} : {num_colorspace}")
245        print(f"  - Image Size: {image_size:.3f} MB")
246        print(f"  - Rect: {img_rect}")
247        # 同じ内容を注釈用のテキストにする
248        list_annot_text = []
249        list_annot_text.append(f"Image {img_index}:")
250        list_annot_text.append(f"  - Xref: {xref}")
251        list_annot_text.append(f"  - Size: {base_image['width']}x{base_image['height']}")
252        list_annot_text.append(f"  - Resolution: {resolution_width}x{resolution_height} ppi")
253        # list_annot_text.append(f"  - Format: {image_ext}")書き出し後だから意味ない
254        list_annot_text.append(f"  - ColorSpace: {colorspace} : {num_colorspace}")
255        list_annot_text.append(f"  - Image Size: {image_size:.3f} MB")
256        list_annot_text.append(f"  - Rect: {img_rect}")
257        str_annot_text = "\n".join(list_annot_text)
258        rect_add_annot = pymupdf.Rect(left_top_x, 50, left_top_y, 50)
259        #注釈追加
260        obj_add_annot = pdf_page.add_text_annot(img_rect.tl, str_annot_text,"Tag")
261        strSetTitle = (f"画像:XREF: {xref}")
262        obj_add_annot.set_info({
263            'title': '画像情報',
264            'author': '埋め込み画像情報',
265            'subject': strSetTitle
266        })
267        #テキストファイル用にも書き出す
268        file.write(f"Image {img_index}:\n")
269        file.write(f"  - Xref: {xref}\n")
270        file.write(f"  - Size: {base_image['width']}x{base_image['height']}\n")
271        file.write(f"  - Resolution: {resolution_width}x{resolution_height} ppi\n")
272        #file.write(f"  - Format: {image_ext}\n") 書き出し後だから意味ない
273        file.write(f"  - ColorSpace: {colorspace}: {num_colorspace}\n")
274        file.write(f"  - Image Size: {image_size:.3f} MB\n")
275        file.write(f"\n")
276
277file.close()
278
279with open(save_font_list_file_path, "w", encoding="utf-8") as font_Info_file:
280  sorted_list_fontname = sorted(list_fontname)
281  str_add_fontList = "\n".join(map(str, sorted_list_fontname))
282  font_Info_file.write(f"{str_add_fontList}\n")
283  font_Info_file.write(f"\n")
284font_Info_file.close()
285
286with open(save_color_list_file_path, "w", encoding="utf-8") as color_Info_file:
287  sorted_list_colorname = sorted(list_color)
288  str_add_colorList = "\n".join(map(str, sorted_list_colorname))
289  color_Info_file.write(f"{str_add_colorList}\n")
290  color_Info_file.write(f"\n")
291color_Info_file.close()
292
293#全ページ終わったら注釈の入ったPDFを別名保存する
294pdf_document.save(pdf_save_file_path)
295#開いていたPDFを閉じて
296pdf_document.close()
297#処理終了
298sys.exit(0)
AppleScriptで生成しました

|

[pymupdf]PDFの現在の表示を天地にする



ダウンロード - remove_rotationsel.zip




AppleScript サンプルコード

【スクリプトエディタで開く】 |

AppleScript サンプルソース(参考)
行番号ソース
001#!/usr/bin/env osascript
002----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
003#com.cocolog-nifty.quicktimer.icefloe
004#
005# PDFの現在の表示を天地にする
006#
007----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
008use AppleScript version "2.8"
009use framework "Foundation"
010use framework "AppKit"
011use scripting additions
012property refMe : a reference to current application
013#pythonインストールチェック
014set strCommandText to ("/bin/zsh -c '/usr/bin/which python3'") as text
015log strCommandText
016try
017  set strPythonPath to (do shell script strCommandText) as text
018on error
019  return "エラー pythonが利用出来ません Xcodeをインストールしてください"
020end try
021#pymupdfインストール
022set strCommandText to ("/bin/zsh -c '\"" & strPythonPath & "\"  -m pip install --user pymupdf'") as text
023log strCommandText
024try
025  set strPipLog to (do shell script strCommandText) as text
026on error
027  return "エラー pymupdfが利用出来ません pymupdfをインストールしてください"
028end try
029
030set appFileManager to refMe's NSFileManager's defaultManager()
031#テンポラリー起動時に自動で削除
032set ocidTempDirURL to appFileManager's temporaryDirectory()
033set ocidUUID to refMe's NSUUID's alloc()'s init()
034set ocidUUIDString to ocidUUID's UUIDString
035set ocidSaveDirPathURL to ocidTempDirURL's URLByAppendingPathComponent:(ocidUUIDString) isDirectory:(true)
036#フォルダ生成 777-->511
037set ocidAttrDict to refMe's NSMutableDictionary's alloc()'s initWithCapacity:0
038ocidAttrDict's setValue:(511) forKey:(refMe's NSFilePosixPermissions)
039set listBoolMakeDir to appFileManager's createDirectoryAtURL:(ocidSaveDirPathURL) withIntermediateDirectories:true attributes:(ocidAttrDict) |error| :(reference)
040#保存先URLまで指定しおく
041set ocidPyFilePathURL to ocidSaveDirPathURL's URLByAppendingPathComponent:("temporary_pymupdf.py") isDirectory:(false)
042set ocidPyFilePath to ocidPyFilePathURL's |path|()
043set strPyFilePath to (ocidPyFilePathURL's |path|()) as text
044#生成するスクリプトの中身 インデントはスペース4つ
045set strPyScript to ("#!" & strPythonPath & "\n# coding: utf-8\nimport sys\nimport os\nimport pymupdf\nargFilePath = sys.argv\npdf_file_path = str(argFilePath[1])\ncontainer_directory = os.path.dirname(pdf_file_path)\nfile_name = os.path.basename(pdf_file_path)\nbase_file_name = os.path.splitext(file_name)[0]\npdf_save_file_path = os.path.join(container_directory + \"/\" + base_file_name + \".天地0.pdf\")\npdf_document = pymupdf.open(pdf_file_path)\nfor page_number in range(len(pdf_document)):\n    pdf_page = pdf_document.load_page(page_number)\n    num_page_rotation = pdf_page.rotation\n    if num_page_rotation == 90:\n        pdf_page.remove_rotation()\n    elif num_page_rotation == 180:\n        pdf_page.remove_rotation()\n    elif num_page_rotation == 270:\n        pdf_page.remove_rotation()\n    else:\n        pdf_page.remove_rotation()\npdf_document.save(pdf_save_file_path)\npdf_document.close()\nsys.exit(0)\n") as text
046#テキストファイルを保存して
047set ocidPyScript to refMe's NSString's stringWithString:(strPyScript)
048set listDone to ocidPyScript's writeToURL:(ocidPyFilePathURL) atomically:(true) encoding:(refMe's NSUTF8StringEncoding) |error| :(reference)
049#アクセス権を付与する フォルダと同じで755
050ocidAttrDict's setValue:(493) forKey:(refMe's NSFilePosixPermissions)
051set listDone to appFileManager's setAttributes:(ocidAttrDict) ofItemAtPath:(ocidPyFilePath) |error| :(reference)
052if (item 1 of listDone) is false then
053  set ocidNSErrorData to (item 2 of listDone)
054  log "エラーコード:" & ocidNSErrorData's code() as text
055  log "エラードメイン:" & ocidNSErrorData's domain() as text
056  log "Description:" & ocidNSErrorData's localizedDescription() as text
057  log "FailureReason:" & ocidNSErrorData's localizedFailureReason() as text
058  return "アクセス権設定でエラーしました"
059end if
060###ダイアログ
061set strName to name of current application as text
062if strName is "osascript" then
063  tell application "Finder" to activate
064else
065  tell current application to activate
066end if
067set listUTI to {"com.adobe.pdf"}
068set aliasDefaultLocation to (path to desktop folder from user domain) as alias
069#
070set aliasFilePath to (choose file with prompt "PDFファイルを選んでください" default location (aliasDefaultLocation) of type listUTI with invisibles and showing package contents without multiple selections allowed) as alias
071#PDFのパス
072set strFilePath to (POSIX path of aliasFilePath) as text
073set ocidFilePathStr to refMe's NSString's stringWithString:(strFilePath)
074set ocidFilePath to ocidFilePathStr's stringByStandardizingPath
075set ocidFilePathURL to refMe's NSURL's alloc()'s initFileURLWithPath:(ocidFilePath) isDirectory:(false)
076set strFilePath to (ocidFilePathURL's |path|()) as text
077#
078set strCommandText to ("/bin/zsh -c '\"" & strPyFilePath & "\" \"" & strFilePath & "\"'") as text
079
080log strCommandText
081try
082  do shell script strCommandText
083  return "正常終了"
084on error
085  return "実行でエラーになりました"
086end try
AppleScriptで生成しました

|

[pymupdf]PDFの現在の表示でPDFページの回転を0をセットして天地向きとする



ダウンロード - set_rotation_py.zip




サンプルコード

サンプルソース(参考)
行番号ソース
001#!/usr/bin/env python3
002# coding: utf-8
003# 20240929 初回作成
004#
005#
006import sys
007import os
008import pymupdf
009
010# 入力ファイル受け取り
011argFilePath = sys.argv
012pdf_file_path = str(argFilePath[1])
013#テスト用
014# pdf_file_path = "/Users/SOMEUID/Desktop/SOME.pdf"
015
016#パスからベースファイル名とコンテナを取得
017container_directory = os.path.dirname(pdf_file_path)
018file_name = os.path.basename(pdf_file_path)
019base_file_name = os.path.splitext(file_name)[0]
020#注釈入れたPDFの保存先
021pdf_save_file_path = container_directory + "/" + base_file_name + ".天地0.pdf"
022###################
023# PDFドキュメントを開く
024pdf_document = pymupdf.open(pdf_file_path)
025#PDFページを順に処理
026for page_number in range(len(pdf_document)):
027#PDFページを開いて
028  pdf_page = pdf_document.load_page(page_number)
029  #開いたページの回転
030  num_page_rotation = pdf_page.rotation
031  print(f"ページ: {page_number} 回転: {num_page_rotation}")
032  if num_page_rotation == 90:
033    pdf_page.set_rotation(0)
034  elif num_page_rotation == 180:
035    pdf_page.set_rotation(0)
036  elif num_page_rotation == 270:
037    pdf_page.set_rotation(0)
038  else:
039    pdf_page.set_rotation(0)
040
041#全ページ終わったら注釈の入ったPDFを別名保存する
042pdf_document.save(pdf_save_file_path)
043#開いていたPDFを閉じて
044pdf_document.close()
045#処理終了
046sys.exit(0)
AppleScriptで生成しました

|

[python]PDFのオブジェクト情報を取得して注釈をつける(テキスト、画像、オブジェクト) SJISフォント名に対応



ダウンロード - getpdfinfov3.1.zip



20240929120157_400x406

|

[python]PDFのオブジェクト情報を取得して注釈をつける(テキスト、画像、オブジェクト)



SJIS対応版 getpdfinfov3.1.zip



20240927090859_1140x5182




ダウンロード - getpdfinfov3.zip




サンプルコード

サンプルソース(参考)
行番号ソース
001#!/usr/bin/env python3
002# coding: utf-8
003# 20240828 出力結果のテキスト少し読みやすくした
004# 20240912 出力結果を注釈にして付与する形式にした
005# 20240927 フォント情報とオブジェクトの塗り情報を入れるようにした
006#
007import sys
008import os
009import pymupdf
010
011# 入力ファイル受け取り
012argFilePath = sys.argv
013pdf_file_path = str(argFilePath[1])
014#テスト用
015# pdf_file_path = "/Users/SOMEUID/Desktop/SOME.pdf"
016
017
018#パスからベースファイル名とコンテナを取得
019container_directory = os.path.dirname(pdf_file_path)
020file_name = os.path.basename(pdf_file_path)
021base_file_name = os.path.splitext(file_name)[0]
022# テキスト保存先パス
023save_file_path = container_directory + "/" + base_file_name + ".PDF情報.txt"
024# フォント一覧用テキスト
025save_font_list_file_path = container_directory + "/" + base_file_name + ".FontList.txt"
026list_fontname = set()
027# カラー一覧用テキスト
028save_color_list_file_path = container_directory + "/" + base_file_name + ".ColorList.txt"
029list_color = set()
030#注釈入れたPDFの保存先
031pdf_save_file_path = container_directory + "/" + base_file_name + ".PDF情報.pdf"
032# PDFドキュメントを開く
033pdf_document = pymupdf.open(pdf_file_path)
034###################
035def float_to_hex(float_color_no):
036  if float_color_no is None:
037    return "None"
038  red = int(float_color_no[0] * 255)
039  green = int(float_color_no[1] * 255)
040  blue = int(float_color_no[2] * 255)
041  hex_color = "#{:02X}{:02X}{:02X}".format(red, green, blue)
042  return hex_color
043
044def int_to_rgb(color_int):
045  red = (color_int >> 16) & 0xFF
046  green = (color_int >> 8) & 0xFF
047  blue = color_int & 0xFF
048  return red, green, blue
049
050###################
051#テキストファイルを用意して
052with open(save_file_path, "w", encoding="utf-8") as file:
053#PDFページを順に処理
054  for page_number in range(len(pdf_document)):
055  #PDFページを開いて
056    pdf_page = pdf_document.load_page(page_number)
057    #テキスト用の変えページ
058    print(f"PAGE No:{page_number + 1} ----------------------")
059    file.write(f"PAGE No:{page_number + 1} ----------------------\n")
060###################
061    list_draw_object = pdf_page.get_drawings()
062    for item_draw in list_draw_object:
063      seqno_no = item_draw['seqno']
064      fill_color = item_draw['fill']
065      fill_color_hex = float_to_hex(fill_color)
066      list_color.add(fill_color_hex)
067      print(f"塗色: {fill_color_hex}")
068      line_color = item_draw['color']
069      line_color_hex = float_to_hex(line_color)
070      list_color.add(line_color_hex)
071      print(f"線色: {line_color_hex}")
072      draw_rect = item_draw['rect']
073      print(f"RECT: {draw_rect}")
074      left_top_x = draw_rect.x0
075      left_top_y = draw_rect.y0
076      rect_add_annot = pymupdf.Rect(left_top_x, left_top_y, left_top_x +
077                                 20, left_top_y + 20)
078
079      # コンソールに表示
080      print(f"DRAW {seqno_no}:")
081      print(f"  - 線色: {line_color_hex}")
082      print(f"  - 塗色: {fill_color_hex}")
083
084      # テキストファイル用にも書き出す
085      file.write(f"DRAW {seqno_no}:")
086      file.write(f"  - 線色: {line_color_hex}")
087      file.write(f"  - 塗色: {fill_color_hex}")
088      file.write(f"\n")
089
090      # 同じ内容を注釈用のテキストにする
091      list_annot_text = []
092      list_annot_text.append(f"DRAW {seqno_no}:")
093      list_annot_text.append(f"  - 線色: {line_color_hex}")
094      list_annot_text.append(f"  - 塗色: {fill_color_hex}")
095      str_annot_text = "\n".join(list_annot_text)
096
097      # 注釈追加
098      obj_add_annot = pdf_page.add_text_annot(
099                            rect_add_annot.tl, str_annot_text, "Comment")
100      strSetTitle = (f"DRAW:NO: {seqno_no}")
101      obj_add_annot.set_info({
102                            'title': 'DRAW情報',
103                            'author': 'DRAW情報',
104                            'subject': strSetTitle
105                        })
106
107###################
108    
109    # ページ内のテキスト情報を取得
110    list_text_block = pdf_page.get_text("dict")
111    # テキストブロックの数だけ繰り返し
112    for item_block in list_text_block['blocks']:
113      if 'lines' in item_block:
114        for line in item_block['lines']:
115          for span in line['spans']:
116            text_no = item_block['number']
117            font_name = span['font']
118            list_fontname.add(font_name)
119            font_size = span['size']
120            text_bbox = span['bbox']
121            color_int = span['color']
122            color_hex = "#{:06X}".format(color_int)
123            list_fontname.add(color_hex)
124            list_color.add(color_hex)
125            left_top_x = text_bbox[0]
126            left_top_y = text_bbox[1]
127            box_w = text_bbox[2] - text_bbox[0]
128            box_h = 20
129            rect_add_annot = pymupdf.Rect(
130                left_top_x, left_top_y, left_top_x + box_w, left_top_y + box_h)
131
132            # コンソールに表示
133            print(f"TEXT {text_no}:")
134            print(f"  - Font: {font_name}")
135            print(f"  - Size: {font_size}")
136            print(f"  - Color: {color_hex}")
137
138            # テキストファイル用にも書き出す
139            file.write(f"TEXT {text_no}:\n")
140            file.write(f"  - Font: {font_name}\n")
141            file.write(f"  - Size: {font_size}\n")
142            file.write(f"  - Color: {color_hex}\n")
143            file.write(f"\n")
144
145            # 同じ内容を注釈用のテキストにする
146            list_annot_text = []
147            list_annot_text.append(f"TEXT {text_no}:")
148            list_annot_text.append(f"  - Font: {font_name}")
149            list_annot_text.append(f"  - Size: {font_size}")
150            list_annot_text.append(f"  - Color: {color_hex}")
151            str_annot_text = "\n".join(list_annot_text)
152
153            # 注釈追加
154            obj_add_annot = pdf_page.add_text_annot(
155              rect_add_annot.tl, str_annot_text)
156            strSetTitle = (f"TEXT:NO: {text_no}")
157            obj_add_annot.set_info({
158                                  'title': 'テキスト情報',
159                                        'author': 'テキスト情報',
160                                        'subject': strSetTitle
161                              })
162
163###################
164    # ページ内の画像情報を取得
165    image_list = pdf_page.get_images(full=True)
166    #画像の数
167    num_cnt_images = len(image_list)
168    if num_cnt_images == 0:
169      print(f"ページ:{page_number + 1} には画像がありません")
170      file.write(f"ページ:{page_number + 1} には画像がありません\n\n")
171    else:
172      print(f"ページ:{page_number + 1} には画像が {num_cnt_images}点ありました")
173      file.write(f"ページ:{page_number + 1} には画像が {num_cnt_images}点ありました\n")
174
175  # 画像情報の表示
176    for img_index, item_image in enumerate(image_list, start=1):
177      xref = item_image[0]
178      pixmap_ref = pymupdf.Pixmap(pdf_document, xref)
179      base_image = pdf_document.extract_image(xref)
180      image_ext = base_image["ext"]
181      # 画像のサイズ
182      image_bytes = base_image["image"]
183      image_size = len(image_bytes) / (1024 * 1024)
184      # ピクセルサイズと解像度
185      image_width = pixmap_ref.width
186      image_height = pixmap_ref.height
187      # img_rect = pdf_page.get_image_rects(xref)[0]
188      #画像の位置RECTを取得(同一画像が同一ページに複数配置されている場合はリストになる)
189      list_image_rects = pdf_page.get_image_rects(xref)
190      #RECT画像の位置情報の数だけ繰り返す
191      for rect_index, img_rect in enumerate(list_image_rects, start=1):
192        # RECT左上
193        left_top_x = img_rect.x0
194        left_top_y = img_rect.y0
195        # 幅 縦
196        rect_width = img_rect.width
197        rect_height = img_rect.height
198        #解像度
199        resolution_width = image_width / (rect_width / 72)
200        resolution_height = image_height / (rect_height / 72)
201        resolution_width = round(resolution_width)
202        resolution_height = round(resolution_height)
203        #カラースペース判定
204        colorspace = ""
205        num_colorspace = base_image.get('colorspace', 1)
206        if pixmap_ref.is_monochrome == 0:
207          if pixmap_ref.is_unicolor == True:
208            colorspace = "ユニ/SPOT"
209          else:
210            colorspace = "マルチ/ICC"
211        else:
212          colorspace = "モノ/単色"
213        #カラースペース判定 ここの判定に自信がない
214        if num_colorspace == 1:
215          colorspace = (f"{colorspace} :Gray/BW")
216        elif num_colorspace == 2:
217          colorspace = (f"{colorspace}: Gray/BWA")
218        elif num_colorspace == 3:
219          colorspace = (f"{colorspace}: RGB")
220        elif num_colorspace == 4:
221          colorspace = (f"{colorspace}: CMYK")
222        else:
223          colorspace = (f"{colorspace}: Unknown: ")
224        #コンソールに表示
225        print(f"Image {img_index}:")
226        print(f"  - Xref: {xref}")
227        print(f"  - Size: {base_image['width']}x{base_image['height']}")
228        print(f"  - Resolution: {resolution_width}x{resolution_height} ppi")
229        # print(f"  - Format: {image_ext}")書き出し後だから意味ない
230        print(f"  - ColorSpace: {colorspace} : {num_colorspace}")
231        print(f"  - Image Size: {image_size:.3f} MB")
232        # 同じ内容を注釈用のテキストにする
233        list_annot_text = []
234        list_annot_text.append(f"Image {img_index}:")
235        list_annot_text.append(f"  - Xref: {xref}")
236        list_annot_text.append(f"  - Size: {base_image['width']}x{base_image['height']}")
237        list_annot_text.append(f"  - Resolution: {resolution_width}x{resolution_height} ppi")
238        # list_annot_text.append(f"  - Format: {image_ext}")書き出し後だから意味ない
239        list_annot_text.append(f"  - ColorSpace: {colorspace} : {num_colorspace}")
240        list_annot_text.append(f"  - Image Size: {image_size:.3f} MB")
241        str_annot_text = "\n".join(list_annot_text)
242        rect_add_annot = pymupdf.Rect(left_top_x, 50, left_top_y, 50)
243        #注釈追加
244        obj_add_annot = pdf_page.add_text_annot(img_rect.tl, str_annot_text,"Tag")
245        strSetTitle = (f"画像:XREF: {xref}")
246        obj_add_annot.set_info({
247            'title': '画像情報',
248            'author': '埋め込み画像情報',
249            'subject': strSetTitle
250        })
251        #テキストファイル用にも書き出す
252        file.write(f"Image {img_index}:\n")
253        file.write(f"  - Xref: {xref}\n")
254        file.write(f"  - Size: {base_image['width']}x{base_image['height']}\n")
255        file.write(f"  - Resolution: {resolution_width}x{resolution_height} ppi\n")
256        #file.write(f"  - Format: {image_ext}\n") 書き出し後だから意味ない
257        file.write(f"  - ColorSpace: {colorspace}: {num_colorspace}\n")
258        file.write(f"  - Image Size: {image_size:.3f} MB\n")
259        file.write(f"\n")
260
261file.close()
262
263with open(save_font_list_file_path, "w", encoding="utf-8") as font_Info_file:
264  sorted_list_fontname = sorted(list_fontname)
265  str_add_fontList = "\n".join(map(str, sorted_list_fontname))
266  font_Info_file.write(f"{str_add_fontList}\n")
267  font_Info_file.write(f"\n")
268font_Info_file.close()
269
270with open(save_color_list_file_path, "w", encoding="utf-8") as color_Info_file:
271  sorted_list_colorname = sorted(list_color)
272  str_add_colorList = "\n".join(map(str, sorted_list_colorname))
273  color_Info_file.write(f"{str_add_colorList}\n")
274  color_Info_file.write(f"\n")
275color_Info_file.close()
276
277#全ページ終わったら注釈の入ったPDFを別名保存する
278pdf_document.save(pdf_save_file_path)
279#開いていたPDFを閉じて
280pdf_document.close()
281#処理終了
282sys.exit(0)
AppleScriptで生成しました

|

[fitz]PDFに埋め込まれた画像の解像度等の情報を取得テキスト表示する (注釈入れてわかりやすくした)

20240912033958_606x454
こんな感じで
埋め込み画像の位置に対象の画像情報を
注釈で入れるように変更した
画像のファイルサイズは書き出しイメージ換算なので
あくまでも参考値
セットアップについて
https://quicktimer.cocolog-nifty.com/icefloe/2024/09/post-84bace.html




ダウンロード - getpdfimageinfov2.zip




サンプルコード

サンプルソース(参考)
行番号ソース
001#!/usr/bin/env python3
002# coding: utf-8
003# 20240828 出力結果のテキスト少し読みやすくした
004# 20240912 出力結果を注釈にして付与する形式にした
005import sys
006import os
007import fitz
008
009# 入力ファイル受け取り
010argFilePath = sys.argv
011pdf_file_path = str(argFilePath[1])
012# テスト用
013# pdf_file_path = "/some/dir/file.pdf"
014#パスからベースファイル名とコンテナを取得
015container_directory = os.path.dirname(pdf_file_path)
016file_name = os.path.basename(pdf_file_path)
017base_file_name = os.path.splitext(file_name)[0]
018# テキスト保存先パス
019save_file_path = container_directory + "/" + base_file_name + ".画像情報.txt"
020#注釈入れたPDFの保存先
021pdf_save_file_path = container_directory + "/" + base_file_name + ".注釈入.pdf"
022# PDFドキュメントを開く
023pdf_document = fitz.open(pdf_file_path)
024#テキストファイルを用意して
025with open(save_file_path, "w", encoding="utf-8") as file:
026#PDFページを順に処理
027  for page_number in range(len(pdf_document)):
028#PDFページを開いて
029    pdf_page = pdf_document.load_page(page_number)
030#テキスト用の変えページ
031    print(f"PAGE No:{page_number + 1} ----------------------")
032    file.write(f"PAGE No:{page_number + 1} ----------------------\n")
033
034  # ページ内の画像情報を取得
035    image_list = pdf_page.get_images(full=True)
036    #画像の数
037    num_cnt_images = len(image_list)
038    if num_cnt_images == 0:
039      print(f"ページ:{page_number + 1} には画像がありません")
040      file.write(f"ページ:{page_number + 1} には画像がありません\n\n")
041    else:
042      print(f"ページ:{page_number + 1} には画像が {num_cnt_images}点ありました")
043      file.write(f"ページ:{page_number + 1} には画像が {num_cnt_images}点ありました\n")
044
045  # 画像情報の表示
046    for img_index, item_image in enumerate(image_list, start=1):
047      xref = item_image[0]
048      pixmap_ref = fitz.Pixmap(pdf_document, xref)
049      base_image = pdf_document.extract_image(xref)
050      image_ext = base_image["ext"]
051      # 画像のサイズ
052      image_bytes = base_image["image"]
053      image_size = len(image_bytes) / (1024 * 1024)
054      # ピクセルサイズと解像度
055      image_width = pixmap_ref.width
056      image_height = pixmap_ref.height
057      # img_rect = pdf_page.get_image_rects(xref)[0]
058      #画像の位置RECTを取得(同一画像が同一ページに複数配置されている場合はリストになる)
059      list_image_rects = pdf_page.get_image_rects(xref)
060      #RECT画像の位置情報の数だけ繰り返す
061      for rect_index, img_rect in enumerate(list_image_rects, start=1):
062        # RECT左上
063        left_top_x = img_rect.x0
064        left_top_y = img_rect.y0
065        # 幅 縦
066        rect_width = img_rect.width
067        rect_height = img_rect.height
068        #解像度
069        resolution_width = image_width / (rect_width / 72)
070        resolution_height = image_height / (rect_height / 72)
071        resolution_width = round(resolution_width)
072        resolution_height = round(resolution_height)
073        #カラースペース判定
074        colorspace = ""
075        num_colorspace = base_image.get('colorspace', 1)
076        if pixmap_ref.is_monochrome == 0:
077          if pixmap_ref.is_unicolor == True:
078            colorspace = "ユニ/SPOT"
079          else:
080            colorspace = "マルチ/ICC"
081        else:
082          colorspace = "モノ/単色"
083        #カラースペース判定
084        if num_colorspace == 1:
085          colorspace = (f"{colorspace} :Gray/BW")
086        elif num_colorspace == 2:
087          colorspace = (f"{colorspace}: Gray/BA")
088        elif num_colorspace == 3:
089          colorspace = (f"{colorspace}: RGB/BWA")
090        elif num_colorspace == 4:
091          colorspace = (f"{colorspace}: CMYK/RGBA")
092        else:
093          colorspace = (f"{colorspace}: Unknown: ")
094        #コンソールに表示
095        print(f"Image {img_index}:")
096        print(f"  - Xref: {xref}")
097        print(f"  - Size: {base_image['width']}x{base_image['height']}")
098        print(f"  - Resolution: {resolution_width}x{resolution_height} ppi")
099        print(f"  - Format: {image_ext}")
100        print(f"  - ColorSpace: {colorspace} : {num_colorspace}")
101        print(f"  - Image Size: {image_size:.3f} MB")
102        #同じ内容を注釈用のテキストにする
103        list_annot_text=[]
104        list_annot_text.append(f"Image {img_index}:")
105        list_annot_text.append(f"  - Xref: {xref}")
106        list_annot_text.append(
107            f"  - Size: {base_image['width']}x{base_image['height']}")
108        list_annot_text.append(
109            f"  - Resolution: {resolution_width}x{resolution_height} ppi")
110        list_annot_text.append(f"  - Format: {image_ext}")
111        list_annot_text.append(f"  - ColorSpace: {colorspace} : {num_colorspace}")
112        list_annot_text.append(f"  - Image Size: {image_size:.3f} MB")
113        str_annot_text="\n".join(list_annot_text)
114        rect_add_annot=fitz.Rect(left_top_x, 50, left_top_y, 50)
115        pdf_page.add_text_annot(img_rect.tl, str_annot_text)
116        #テキストファイル用にも書き出す
117        file.write(f"Image {img_index}:\n")
118        file.write(f"  - Xref: {xref}\n")
119        file.write(f"  - Size: {base_image['width']}x{base_image['height']}\n")
120        file.write(f"  - Resolution: {resolution_width}x{resolution_height} ppi\n")
121        file.write(f"  - Format: {image_ext}\n")
122        file.write(f"  - ColorSpace: {colorspace}: {num_colorspace}\n")
123        file.write(f"  - Image Size: {image_size:.3f} MB\n")
124        file.write(f"\n")
125#全ページ終わったら注釈の入ったPDFを別名保存する
126pdf_document.save(pdf_save_file_path)
127#開いていたPDFを閉じて
128pdf_document.close()
129#処理終了
130sys.exit(0)
AppleScriptで生成しました

|

[fitz]見開きPDFを左右分割




ダウンロード - dosplitpagebyside.zip




サンプルコード

サンプルソース(参考)
行番号ソース
001#!/usr/bin/env python3
002import sys
003import math
004import os
005import fitz
006
007# 入力ファイル受け取り
008argGetData = sys.argv
009str_file_path = str(argGetData[1])
010# テスト用
011# str_file_path = "/some/dir/some.pdf"
012
013str_base_file_path = os.path.splitext(str_file_path)[0]
014str_save_file_path = str_base_file_path + ".左右分割済.pdf"
015#
016pdf_read_doc = fitz.open(str_file_path)
017pdf_save_doc = fitz.open()
018# 保存用PDF用に2ページ毎コピー
019num_all_pages = len(pdf_read_doc)
020for num_page_no in range(num_all_pages - 1, -1, -1):
021# ページを最後のページから順に取得
022  pdf_read_page = pdf_read_doc.load_page(num_page_no)
023# 左用ページと右用ページで2回同じページをコピーする
024  pdf_save_doc.insert_pdf(pdf_read_doc, from_page=num_page_no, to_page=num_page_no, start_at=0)
025  pdf_save_doc.insert_pdf(pdf_read_doc, from_page=num_page_no, to_page=num_page_no, start_at=0)
026
027# 左右ページの処理
028num_all_save_pages = len(pdf_save_doc)
029for num_page_no in range(num_all_save_pages):
030  pdf_read_page = pdf_save_doc.load_page(num_page_no)
031  rect_crop_page = pdf_read_page.rect
032  # BOXサイズ取得
033  rect_x = rect_crop_page.x0
034  rect_y = rect_crop_page.y0
035  rect_w = rect_crop_page.width
036  rect_h = rect_crop_page.height
037  # ページの回転値
038  num_page_rotation = pdf_read_page.rotation
039  print(f"rotation: {num_page_rotation}")
040  # 奇数ページと偶数ページの処理を分ける
041  if num_page_no % 2 == 0:
042      # 右ページ
043    if num_page_rotation == 0:
044      rect_set_r = fitz.Rect((rect_w / 2), rect_y, rect_x + rect_w, rect_y + rect_h)
045    elif num_page_rotation == 90:
046      rect_set_r = fitz.Rect(rect_y, rect_x,rect_y + rect_h, rect_x + (rect_w / 2))
047    elif num_page_rotation == 180:
048      rect_set_r = fitz.Rect(rect_x, rect_y, rect_x + (rect_w / 2), rect_y + rect_h)
049    elif num_page_rotation == 270:
050      rect_set_r = fitz.Rect(rect_y, (rect_w / 2),rect_y + rect_h, rect_x + rect_w)
051    else:
052      rect_set_r = fitz.Rect(rect_x, rect_y, rect_x + rect_w, rect_y + rect_h)
053  # BOXセット
054    pdf_read_page.set_cropbox(rect_set_r)
055    pdf_read_page.set_trimbox(rect_set_r)
056  #pdf_read_page.set_mediabox(rect_set_r)
057  else:
058# 左ページ
059    if num_page_rotation == 0:
060      rect_set_l = fitz.Rect(rect_x, rect_y, rect_x + (rect_w / 2), rect_y + rect_h)
061    elif num_page_rotation == 90:
062      rect_set_l = fitz.Rect(rect_y, (rect_w / 2), rect_y + rect_h, rect_x + rect_w)
063    elif num_page_rotation == 180:
064      rect_set_l = fitz.Rect((rect_w / 2), rect_y, rect_x + rect_w, rect_y + rect_h)
065    elif num_page_rotation == 270:
066      rect_set_l = fitz.Rect(rect_y, rect_x,rect_y + rect_h, rect_x + (rect_w / 2))
067    else:
068      rect_set_l = fitz.Rect(rect_x, rect_y, rect_x + rect_w, rect_y + rect_h)
069  # BOXセット
070    pdf_read_page.set_cropbox(rect_set_l)
071    pdf_read_page.set_trimbox(rect_set_l)
072#pdf_read_page.set_mediabox(rect_set_l)
073# 保存と解放
074pdf_save_doc.save(str_save_file_path)
075pdf_save_doc.close()
076pdf_read_doc.close()
077
078sys.exit(0)
AppleScriptで生成しました

|

PDFで使用されているフォントをページ毎に調べてテキスト出力する

20240830011522_831x536
[python3]PDFに埋め込まれているフォント名を一覧取得する
https://quicktimer.cocolog-nifty.com/icefloe/2024/05/post-876d77.html

改良版



ダウンロード - pdfembeddedfontnamev2.zip




AppleScript サンプルコード

【スクリプトエディタで開く】 |

AppleScript サンプルソース(参考)
行番号ソース
001#!/usr/bin/env osascript
002----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
003#
004# ファイルをpyファイルに渡すだけの補助スクリプト
005#
006#com.cocolog-nifty.quicktimer.icefloe
007----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
008use AppleScript version "2.8"
009use framework "Foundation"
010use scripting additions
011
012property refMe : a reference to current application
013
014####スクリプトメニューから実行したら
015tell current application
016  set strName to name as text
017end tell
018if strName is "osascript" then
019  tell application "Finder"
020    activate
021  end tell
022else
023  tell current application
024    activate
025  end tell
026end if
027####UTIリスト PDFのみ
028set listUTI to {"com.adobe.pdf"}
029set aliasDefaultLocation to (path to desktop folder from user domain) as alias
030####ダイアログを出す
031set aliasFilePath to (choose file with prompt "PDFファイルを選んでください" default location (aliasDefaultLocation) of type listUTI with invisibles and showing package contents without multiple selections allowed) as alias
032####PDFのパス
033set strFilePath to POSIX path of aliasFilePath
034set ocidFilePathStr to (refMe's NSString's stringWithString:strFilePath)
035set ocidFilePath to ocidFilePathStr's stringByStandardizingPath
036set ocidFilePathURL to (refMe's NSURL's alloc()'s initFileURLWithPath:ocidFilePath isDirectory:false)
037set strFilePath to (ocidFilePathURL's |path|()) as text
038
039###ディレクトリ 起動時に削除されます
040set appFileManager to refMe's NSFileManager's defaultManager()
041set ocidTempDirURL to appFileManager's temporaryDirectory()
042set ocidUUID to refMe's NSUUID's alloc()'s init()
043set ocidUUIDString to ocidUUID's UUIDString
044set ocidSaveDirPathURL to ocidTempDirURL's URLByAppendingPathComponent:(ocidUUIDString) isDirectory:(true)
045#フォルダ生成
046set ocidAttrDict to refMe's NSMutableDictionary's alloc()'s initWithCapacity:0
047# アクセス権777
048ocidAttrDict's setValue:(511) forKey:(refMe's NSFilePosixPermissions)
049set listBoolMakeDir to appFileManager's createDirectoryAtURL:(ocidSaveDirPathURL) withIntermediateDirectories:(true) attributes:(ocidAttrDict) |error| :(reference)
050#パス
051set strFileName to ("doGetFontName.py") as text
052set ocidSaveFilePathURL to ocidSaveDirPathURL's URLByAppendingPathComponent:(strFileName) isDirectory:(false)
053set ocidPythonBinPath to (ocidSaveFilePathURL's |path|())
054set strPythonBinPath to (ocidPythonBinPath) as text
055#使用するスクリプト
056set strPyScript to ("#!/usr/bin/env python3\n# coding: utf-8\nimport sys\nimport os\nimport tempfile\nimport uuid\nimport subprocess\nimport fitz\nargGetData = sys.argv\npdf_file_path = str(argGetData[1])\nfile_name = os.path.basename(pdf_file_path)\nlist_fontname = set()\nstr_output_string = \"\"\nstr_output_string += f\"ファイルパス: {pdf_file_path}\\n\"\nstr_output_string += f\"ファイル名: {file_name}\\n\"\nopen_doc = fitz.open(pdf_file_path)\nfor num_page in range(len(open_doc)):\n    str_output_string += \"----------------------\\n\"\n    str_output_string += f\"ページ: {num_page + 1}\\n\"\n    read_page = open_doc.load_page(num_page)\n    list_fonts = read_page.get_fonts()\n    for item_font in list_fonts:\n        str_font_name = item_font[3].split(\"+\")[-1]\n        str_output_string += f\"{str_font_name}\\n\"\n        list_fontname.add(str_font_name)\nsorted_list_fontname = sorted(list_fontname)\nstr_add_fontList = \"\\n\".join(map(str, sorted_list_fontname))\nprint(str_add_fontList)\nstr_save_string = (str_add_fontList + \"\\n----------------------\\n\" + str_output_string)\ntemp_dir = tempfile.gettempdir()\nstr_dir_name = str(uuid.uuid4())\ntemp_dir_path = os.path.join(temp_dir, str_dir_name)\nos.makedirs(temp_dir_path, exist_ok=True)\nstr_save_file_name = file_name + \".txt\"\nsave_file_path = os.path.join(temp_dir_path, str_save_file_name)\nwith open(save_file_path, 'w', encoding='utf-8') as temp_file:\n    temp_file.write(str_save_string)\nsubprocess.run([\"open\", save_file_path])\nsys.exit(0)\n") as text
057set ocidPyScript to refMe's NSString's stringWithString:(strPyScript)
058#保存
059set listDone to ocidPyScript's writeToURL:(ocidSaveFilePathURL) atomically:(true) encoding:(refMe's NSUTF8StringEncoding) |error| :(reference)
060if (item 1 of listDone) is true then
061  log "保存 正常処理"
062else if (item 2 of listDone) ≠ (missing value) then
063  log (item 2 of listDone)'s code() as text
064  log (item 2 of listDone)'s localizedDescription() as text
065  return "保存 エラーしました"
066end if
067#アクセス権 755
068ocidAttrDict's setValue:(493) forKey:(refMe's NSFilePosixPermissions)
069set listDone to appFileManager's setAttributes:(ocidAttrDict) ofItemAtPath:(ocidPythonBinPath) |error| :(reference)
070if (item 1 of listDone) is true then
071  log "アクセス権 正常処理"
072else if (item 2 of listDone) ≠ (missing value) then
073  log (item 2 of listDone)'s code() as text
074  log (item 2 of listDone)'s localizedDescription() as text
075  return "アクセス権 エラーしました"
076end if
077################################
078#python3のパスチェック
079try
080  set strCmdText to ("/usr/bin/which python3") as text
081  set strBinPath to (do shell script strCmdText) as text
082on error
083  log "セットアップを実行してください"
084  try
085    do shell script "/usr/bin/xcode-select --install"
086  end try
087  return "python3が見つかりませんでした終了します"
088end try
089
090####添付する場合binディレクトリ内を参照する場合
091(*
092set strBinFileName to ("doGetFontName.py") as text
093tell application "Finder"
094  set aliasPathToMe to (path to me) as alias
095end tell
096#パス
097set strPathToMe to (POSIX path of aliasPathToMe) as text
098set strPathToMeStr to refMe's NSString's stringWithString:(strPathToMe)
099set ocidPathToMe to strPathToMeStr's stringByStandardizingPath()
100set ocidPathToMeURL to (refMe's NSURL's alloc()'s initFileURLWithPath:(ocidPathToMe) isDirectory:false)
101set ocidContainerDirURL to ocidPathToMeURL's URLByDeletingLastPathComponent()
102set ocidBinDirPathURL to ocidContainerDirURL's URLByAppendingPathComponent:("bin") isDirectory:true
103set ocidBinFilePathURL to ocidBinDirPathURL's URLByAppendingPathComponent:(strBinFileName)
104set strPythonBinPath to ocidBinFilePathURL's |path| as text
105*)
106try
107  set strCommandText to ("\"" & strPythonBinPath & "\" \"" & strFilePath & "\"") as text
108  ##  set strCommandText to ("\"" & strPythonBinPath & "\"") as text
109  set strResponse to (do shell script strCommandText) as text
110on error
111  return "コマンドでエラーしました"
112end try
113#戻り値をテキストにして
114set ocidResponse to refMe's NSString's stringWithString:(strResponse)
115#Arrayに
116set ocidFontNameArray to ocidResponse's componentsSeparatedByString:("\t")
117#ソートして
118set ocidSortedArray to ocidFontNameArray's sortedArrayUsingSelector:("localizedStandardCompare:")
119#改行テキストにする
120set ocidOutPutString to ocidSortedArray's componentsJoinedByString:("\n")
121
122##############################
123#####ダイアログ
124##############################
125tell current application
126  set strName to name as text
127end tell
128####スクリプトメニューから実行したら
129if strName is "osascript" then
130  tell application "Finder"
131    activate
132  end tell
133else
134  tell current application
135    activate
136  end tell
137end if
138set strMes to ("埋め込みフォント名です") as text
139set aliasIconPath to (POSIX file "/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/ProfileFont.icns") as alias
140try
141  set recordResult to (display dialog strMes with title "戻り値です" default answer (ocidOutPutString as text) buttons {"クリップボードにコピー", "終了", "再実行"} default button "再実行" cancel button "終了" giving up after 20 with icon aliasIconPath without hidden answer) as record
142on error
143  return "エラーしました"
144end try
145if (gave up of recordResult) is true then
146  return "時間切れです"
147end if
148##############################
149#####自分自身を再実行
150##############################
151if button returned of recordResult is "再実行" then
152  tell application "Finder"
153    set aliasPathToMe to (path to me) as alias
154  end tell
155  run script aliasPathToMe with parameters "再実行"
156end if
157##############################
158#####値のコピー
159##############################
160if button returned of recordResult is "クリップボードにコピー" then
161  try
162    set strText to text returned of recordResult as text
163    ####ペーストボード宣言
164    set appPasteboard to refMe's NSPasteboard's generalPasteboard()
165    set ocidText to (refMe's NSString's stringWithString:(strText))
166    appPasteboard's clearContents()
167    appPasteboard's setString:(ocidText) forType:(refMe's NSPasteboardTypeString)
168  on error
169    tell application "Finder"
170      set the clipboard to strText as text
171    end tell
172  end try
173end if
174
175
176return 0
AppleScriptで生成しました

サンプルコード

サンプルソース(参考)
行番号ソース
001#!/usr/bin/env python3
002# coding: utf-8
003import sys
004import os
005import tempfile
006import uuid
007import subprocess
008
009import fitz
010argGetData = sys.argv
011pdf_file_path = str(argGetData[1])
012# テスト用
013# pdf_file_path = "/Library/Documentation/License.lpdf/Contents/Resources/Japanese.lproj/License.pdf"
014# ファイル名を取得
015file_name = os.path.basename(pdf_file_path)
016#出力用のリスト
017list_fontname = set()
018#出力用のテキスト
019str_output_string = ""
020str_output_string += f"ファイルパス: {pdf_file_path}\n"
021str_output_string += f"ファイル名: {file_name}\n"
022
023# PDFを読み込み
024open_doc = fitz.open(pdf_file_path)
025#ページを順番に処理
026for num_page in range(len(open_doc)):
027    #出力テキスト
028    str_output_string += "----------------------\n"
029    str_output_string += f"ページ: {num_page + 1}\n"
030    #PDFページ要素を読み込み
031    read_page = open_doc.load_page(num_page)
032    #フォント要素を読み出し
033    list_fonts = read_page.get_fonts()
034    #読み出したフォント数だけ繰り返す
035    for item_font in list_fonts:
036        #整形して
037        str_font_name = item_font[3].split("+")[-1]
038        #出力用テキストに追加
039        str_output_string += f"{str_font_name}\n"
040        #出力用のリストに追加
041        list_fontname.add(str_font_name)
042#出力用のリストをソートしてページ順に
043sorted_list_fontname = sorted(list_fontname)
044#リスト毎に改行を入れてテキストにする
045str_add_fontList = "\n".join(map(str, sorted_list_fontname))
046#戻り値用のテキスト
047print(str_add_fontList)
048#テキスト化したリストを出力用のテキストに追加
049str_save_string = (str_add_fontList + "\n----------------------\n" + str_output_string)
050#保存先はテンポラリ再起動時に自動削除
051temp_dir = tempfile.gettempdir()
052#UUIDをフォルダ名にしてユニークにしておく
053str_dir_name = str(uuid.uuid4())
054#保存先ディレクトリをパスに
055temp_dir_path = os.path.join(temp_dir, str_dir_name)
056#フォルダ生成
057os.makedirs(temp_dir_path, exist_ok=True)
058#保存ファイル名 ファイル名+テキスト拡張子
059str_save_file_name = file_name + ".txt"
060#保存先テキストのパス
061save_file_path = os.path.join(temp_dir_path, str_save_file_name)
062#保存
063with open(save_file_path, 'w', encoding='utf-8') as temp_file:
064    temp_file.write(str_save_string)
065#デフォルトアプリで開く
066subprocess.run(["open", save_file_path])
067#終了
068sys.exit(0)
AppleScriptで生成しました

|

[fitz]PDFに埋め込まれた画像の解像度等の情報を取得テキスト表示する (少し治した)



ダウンロード - getpdfimageinfo.zip




サンプルコード

サンプルソース(参考)
行番号ソース
001#!/usr/bin/env python3
002# coding: utf-8
003# 20240828 出力結果のテキスト少し読みやすくした
004import sys
005import os
006import fitz
007
008# 入力ファイル受け取り
009argFilePath = sys.argv
010pdf_file_path = str(argFilePath[1])
011# テスト用
012# pdf_file_path = "/some/dir/file.pdf"
013
014# テキスト保存先パス
015container_directory = os.path.dirname(pdf_file_path)
016file_name = os.path.basename(pdf_file_path)
017base_file_name = os.path.splitext(file_name)[0]
018save_file_path = container_directory + "/" + base_file_name + ".image-info.txt"
019
020# PDFドキュメントを開く
021pdf_document = fitz.open(pdf_file_path)
022with open(save_file_path, "w", encoding="utf-8") as file:
023
024  for page_number in range(len(pdf_document)):
025    pdf_page = pdf_document.load_page(page_number)
026    print(f"PAGE No:{page_number + 1} ----------------------")
027    file.write(f"PAGE No:{page_number + 1} ----------------------\n")
028
029  #ページ内の画像情報を取得
030    image_list = pdf_page.get_images(full=True)
031    num_cnt_images = len(image_list)
032    if num_cnt_images == 0:
033      print(f"ページ:{page_number + 1} には画像がありません")
034      file.write(f"ページ:{page_number + 1} には画像がありません\n\n")
035    else:
036      print(f"ページ:{page_number + 1} には画像が {num_cnt_images}点ありました")
037      file.write(f"ページ:{page_number + 1} には画像が {num_cnt_images}点ありました\n")
038
039  # 画像情報の表示
040    for img_index, item_image in enumerate(image_list, start=1):
041      xref = item_image[0]
042      pixmap_ref = fitz.Pixmap(pdf_document, xref)
043      base_image = pdf_document.extract_image(xref)
044      image_ext = base_image["ext"]
045      #画像のサイズ
046      image_bytes = base_image["image"]
047      image_size = len(image_bytes) / (1024 * 1024)
048      #ピクセルサイズと解像度
049      image_width = pixmap_ref.width
050      image_height = pixmap_ref.height
051      img_rect = pdf_page.get_image_rects(xref)[0]
052      rect_width = img_rect.width
053      rect_height = img_rect.height
054      resolution_width = image_width / (rect_width / 72)
055      resolution_height = image_height / (rect_height / 72)
056      resolution_width = round(resolution_width)
057      resolution_height = round(resolution_height)
058
059      num_colorspace = base_image.get('colorspace', 1)
060      if {pixmap_ref.is_monochrome} == 0:
061          colorspace = "Monochrome"
062      elif {pixmap_ref.is_unicolor} == 0:
063          colorspace = "特色"
064      elif num_colorspace == 1:
065          colorspace = "RGB"
066      elif num_colorspace == 2:
067        colorspace = "Gray"
068      elif num_colorspace == 3:
069        colorspace = "CMYK"
070      else:
071          colorspace = "Unknown"
072
073      print(f"Image {img_index}:")
074      print(f"  - Xref: {xref}")
075      print(f"  - Size: {base_image['width']}x{base_image['height']}")
076      print(f"  - Resolution: " , resolution_width , "x"  , resolution_height , " ppi")
077      print(f"  - Format: {image_ext}")
078      print(f"  - ColorSpace: {colorspace}")
079      print(f"  - Image Size: {image_size:.3f} MB")
080      file.write(f"Image {img_index}:\n")
081      file.write(f"  - Xref: {xref}\n")
082      file.write(f"  - Size: {base_image['width']}x{base_image['height']}\n")
083      file.write(f"  - Resolution: {resolution_width}x{resolution_height} ppi\n")
084      file.write(f"  - Format: {image_ext}\n")
085      file.write(f"  - ColorSpace: {colorspace}\n")
086      file.write(f"  - Image Size: {image_size:.3f} MB\n")
087      file.write(f"\n")
088pdf_document.close()
AppleScriptで生成しました

|

[fitz]PDFに埋め込まれた画像の解像度等の情報を取得テキスト表示する



ダウンロード - getpdfimageinfo.zip




サンプルコード

サンプルソース(参考)
行番号ソース
001#!/usr/bin/env python3
002# coding: utf-8
003import sys
004import os
005import fitz
006
007# 入力ファイル受け取り
008argFilePath = sys.argv
009pdf_file_path = str(argFilePath[1])
010# テスト用
011# pdf_file_path = "/some/dir/file.pdf"
012
013# テキスト保存先パス
014container_directory = os.path.dirname(pdf_file_path)
015file_name = os.path.basename(pdf_file_path)
016base_file_name = os.path.splitext(file_name)[0]
017save_file_path = container_directory + "/" + base_file_name + ".image-info.txt"
018
019# PDFドキュメントを開く
020pdf_document = fitz.open(pdf_file_path)
021with open(save_file_path, "w", encoding="utf-8") as file:
022
023  for page_number in range(len(pdf_document)):
024    pdf_page = pdf_document.load_page(page_number)
025  #ページ内の画像情報を取得
026    image_list = pdf_page.get_images(full=True)
027
028    print(f"PAGE No:{page_number + 1} ----------------------")
029    file.write(f"PAGE No:{page_number + 1} ----------------------\n")
030
031  # 画像情報の表示
032    for img_index, item_image in enumerate(image_list, start=1):
033      xref = item_image[0]
034      pixmap_ref = fitz.Pixmap(pdf_document, xref)
035      base_image = pdf_document.extract_image(xref)
036      image_ext = base_image["ext"]
037      #画像のサイズ
038      image_bytes = base_image["image"]
039      image_size = len(image_bytes) / (1024 * 1024)
040      #ピクセルサイズと解像度
041      image_width = pixmap_ref.width
042      image_height = pixmap_ref.height
043      img_rect = pdf_page.get_image_rects(xref)[0]
044      rect_width = img_rect.width
045      rect_height = img_rect.height
046      resolution_width = image_width / (rect_width / 72)
047      resolution_height = image_height / (rect_height / 72)
048      resolution_width = round(resolution_width)
049      resolution_height = round(resolution_height)
050
051      num_colorspace = base_image.get('colorspace', 1)
052      if {pixmap_ref.is_monochrome} == 0:
053          colorspace = "Monochrome"
054      elif {pixmap_ref.is_unicolor} == 0:
055          colorspace = "特色"
056      elif num_colorspace == 1:
057          colorspace = "RGB"
058      elif num_colorspace == 2:
059        colorspace = "Gray"
060      elif num_colorspace == 3:
061        colorspace = "CMYK"
062      else:
063          colorspace = "Unknown"
064
065      print(f"Image {img_index}:")
066      print(f"  - Xref: {xref}")
067      print(f"  - Size: {base_image['width']}x{base_image['height']}")
068      print(f"  - Resolution: " , resolution_width , "x"  , resolution_height , " ppi")
069      print(f"  - Format: {image_ext}")
070      print(f"  - ColorSpace: {colorspace}")
071      print(f"  - Image Size: {image_size:.3f} MB")
072      file.write(f"Image {img_index}:\n")
073      file.write(f"  - Xref: {xref}\n")
074      file.write(f"  - Size: {base_image['width']}x{base_image['height']}\n")
075      file.write(f"  - Resolution: {resolution_width}x{resolution_height} ppi\n")
076      file.write(f"  - Format: {image_ext}\n")
077      file.write(f"  - ColorSpace: {colorspace}\n")
078      file.write(f"  - Image Size: {image_size:.3f} MB\n")
079pdf_document.close()
AppleScriptで生成しました

|

より以前の記事一覧

その他のカテゴリー

Accessibility Acrobat Acrobat 2020 Acrobat AddOn Acrobat Annotation Acrobat ARMDC Acrobat AV2 Acrobat BookMark Acrobat Classic Acrobat DC Acrobat Dialog Acrobat Distiller Acrobat Form Acrobat JS Acrobat Manifest Acrobat Menu Acrobat Open Acrobat Plugin Acrobat Preferences Acrobat Preflight Acrobat python Acrobat Reader Acrobat SCA Acrobat SCA Updater Acrobat Sequ Acrobat Sign Acrobat Stamps Acrobat Watermark Acrobat Windows Acrobat Windows Reader Admin Admin Account Admin Apachectl Admin configCode Admin Device Management Admin LaunchServices Admin Locationd Admin loginitem Admin Maintenance Admin Mobileconfig Admin Permission Admin Pkg Admin Power Management Admin Printer Admin SetUp Admin SMB Admin Support Admin System Information Admin Tools Admin Users Admin Volumes Adobe Adobe FDKO Adobe RemoteUpdateManager AppKit Apple AppleScript AppleScript do shell script AppleScript List AppleScript ObjC AppleScript Osax AppleScript PDF AppleScript Pictures AppleScript record AppleScript Script Editor AppleScript Script Menu AppleScript Shortcuts AppleScript Shortcuts Events AppleScript System Events AppleScript System Events Plist AppleScript Video Applications AppStore Archive Attributes Automator BackUp Barcode Barcode QR Barcode QR Decode Bash Basic Basic Path Bluetooth BOX Browser Calendar CD/DVD Choose Chrome CIImage CityCode CloudStorage Color com.apple.LaunchServices.OpenWith Console Contacts CotEditor CURL current application Date&Time delimiters Desktop Device Diff Disk Dock DropBox Droplet eMail Encode % Encode Decode Encode UTF8 Error EXIFData ffmpeg File Finder Firefox Folder FolderAction Fonts GIF github Guide HTML HTML Entity Icon Illustrator Image Events Image2PDF ImageOptim iPhone iWork Javascript Jedit Json Label Leading Zero List locationd LRC lsappinfo LSSharedFileList m3u8 Mail MakePDF Map Math Media Media AVAsset Media AVconvert Media AVFoundation Media AVURLAsset Media Movie Media Music Memo Messages Microsoft Microsoft Edge Microsoft Excel Mouse Music NetWork Notes NSArray NSArray Sort NSBezierPath NSBitmapImageRep NSBundle NSCFBoolean NSCharacterSet NSColor NSColorList NSData NSDecimalNumber NSDictionary NSError NSEvent NSFileAttributes NSFileManager NSFileManager enumeratorAtURL NSFont NSFontManager NSGraphicsContext NSImage NSIndex NSKeyedArchiver NSKeyedUnarchiver NSLocale NSMutableArray NSMutableDictionary NSMutableString NSNotFound NSNumber NSOpenPanel NSPasteboard NSpoint NSPredicate NSPrintOperation NSRange NSRect NSRegularExpression NSRunningApplication NSScreen NSSize NSString NSString stringByApplyingTransform NSStringCompareOptions NSTask NSTimeZone NSURL NSURL File NSURLBookmark NSURLComponents NSURLResourceKey NSURLSession NSUserDefaults NSUUID NSView NSWorkspace Numbers OAuth OneDrive PDF PDFAnnotation PDFAnnotationWidget PDFContext PDFDisplayBox PDFDocumentPermissions PDFImageRep PDFKit PDFnUP PDFOutline perl Photoshop PlistBuddy pluginkit postalcode PostScript prefPane Preview Python QuickLook QuickTime ReadMe Regular Expression Reminders ReName Repeat RTF Safari SaveFile ScreenCapture ScreenSaver SF Symbols character id SF Symbols Entity sips Skype Slack Sound Spotlight sqlite SRT StandardAdditions Swift System Settings TCC TemporaryItems Terminal Text Text CSV Text MD Text TSV TextEdit Tools Translate Trash Twitter Typography UI Unit Conversion UTType valueForKeyPath Video VisionKit Visual Studio Code VMware Fusion Wacom webarchive webp Wifi Windows XML XML EPUB XML OPML XML Plist XML RSS XML savedSearch XML SVG XML TTML XML webloc XML XMP YouTube zoom