倧éã®ç»åãè³æãšããŠãŸãšãããæãã誰ãã«èŠããããšæã£ããšããèªåã§1ããŒãžã«ç¶ºéºã«å²ãä»ããããå ŽåãããããããªæãPDFãå©çšããã®ã䟿å©ã ãã€ãã§ã«ãç»åãµã€ãºãèªåã§ãªãµã€ãºããŠããããé åžãããããªããä»åã¯ããããªããŒã«ãäœã£ãŠã¿ããã
Pythonã§ç»åããPDFãäœãæ¹æ³ãèããã
ç»åæ°æãPDFã«è²Œãä»ãããã ããªããããããããã°ã©ã ãäœããŸã§ããªããWordãPowerPointãéããŠãç»åããã©ãã°ïŒããããããŠãPDFã§ä¿åããã ãã ãããããæ¥åã§é »ç¹ã«åçç»åã䜿ãå Žåãªã©ããšã«ããçæéã§PDFãäœæãããå Žåã«ã¯ãå°çšã®PDFäœæããŒã«ãäœããšäŸ¿å©ã ã
ããã§ã¯ã䜿ãåæãªã©ãèããŠãæå®ã®ãã©ã«ãã«PDFã«è²Œãä»ãããç»åãæŸã蟌ãã§ãããããã¡ã€ã«ãå®è¡ãããšPDFãèªåçã«äœæããããããªããã°ã©ã ãäœã£ãŠã¿ãããæ¥ã ã®æ¥åã§äœ¿ãããšãæ³å®ããŠããšã«ããçæéã§äœæ¥ãçµãããšããç¹ã«çæãããã
- (1) ãpdf-inããšãããã©ã«ãã«PDFã«å·®ã蟌ã¿ããç»åãã³ããŒããŠãã
- (2) ãimage-to-pdf.batããšããããããã¡ã€ã«ãããã«ã¯ãªãã¯
- (3) ãimages.pdfããšããPDFãäœæããã
ããã§ã¯ããããå®çŸããããã«ãã©ããããè¯ãã®ããèãããããŸãã¯ãã©ããªåŠçãããå¿ èŠãããã®ãããŸãšããŠã¿ããã
- (1) ãpdf-inããšãããã©ã«ãã«ããJPEGãã¡ã€ã«ãåæãã
- (2) PDFã®ãã¡ã€ã«ãµã€ãºãå°ããããããã«ãç»åãµã€ãºãå¹
800ã«ãªãµã€ãºããããŸããç»åã瞊åãã§ããã°ã暪åãã«90床å転ãã
- (3) PDFã®1ããŒãžã«åçãæå€§6æè²Œãä»ãã
- (4) ãimages.pdfããšããååã§ãã¡ã€ã«ãä¿åãã
ãããªæé ã§è¯ãããã ã
å€§èŠæš¡èšèªã¢ãã«ã«ããã°ã©ã ã®éªšçµã¿ãäœã£ãŠãããã
ãã®ããã«ã詳ããæé ã宿ããããChatGPTãGoogle Bardãªã©ã®å€§èŠæš¡èšèªã¢ãã«(LLM)ãå©çšããŠããã°ã©ã ã®éªšçµã¿ãäœã£ãŠãããããããããçè ã¯ããã°ã©ã ãäœãã®ãè¶£å³ãªã®ã§ããŒãããããã°ã©ã äœãã®ã奜ãã ããããããããªçè ã§ããæè¿ã§ã¯ããã°ã©ã ã®éªšçµã¿ãäœãã®ã¯ãå€§èŠæš¡èšèªã¢ãã«ã«ä»»ããããšãå¢ããã
ãã1幎ã§ãå€§èŠæš¡èšèªã¢ãã«ã®ããã°ã©ã çæèœåã¯æ Œæ®µã«æ¹åããããChatGPTã ãã§ãªããBardãClaudeãªã©ãæ§ã ãªå®å®ããŠåäœããå€§èŠæš¡èšèªã¢ãã«ãç»å Žãããã¡ãã®æç€ºã«æ²¿ã£ãŠäžæã«ããã°ã©ã ãäœã£ãŠãããããã«ãªã£ãããã®ãããä»ã§ã¯ããã°ã©ã ãå šãã®ãŒãããäœãã®ãéå¹çãšãªã£ããæ¥åã§å¿ èŠãªããã°ã©ã ãäœãã®ã§ããã°ããªãããã ããã
ãšã¯èšãããããã°ã©ã ã®éªšçµã¿ããšè¡šçŸããã®ã¯ããŸã ãŸã 现ããäºçްãªç¹ãŸã§å®å šã«äœã£ãŠãããããã«é Œãã§ãããªããªãæãéãã«ãªããªãäºãå€ãããã ããããšãããã现ãæç€ºãäžããŠãç¡èŠãããããšãããã
ãã®èŸºããèæ ®ããŠãããã§ã¯ã次ã®ãããªããã°ã©ã çæçšã®ããã³ãããçšæããã
### æç€º:
è€æ°ç»åãå
ã«ããŠPDFãäœæããPythonããã°ã©ã ãäœã£ãŠãã ããã
### æé :
1.ãpdf-inããšãããã©ã«ãã«ããJPEGãã¡ã€ã«ãåæãã
2. PDFã®ãã¡ã€ã«ãµã€ãºãå°ããããããã«ãç»åãµã€ãºãå¹
800ã«ãªãµã€ãºããã
3. ç»åã瞊åãã§ããã°ã暪åãã«90床å転ãã
4. PDFã®1ããŒãžã«åçãæå€§6æã貌ãä»ãã
5.ãimages.pdfããšããååã§ãã¡ã€ã«ãä¿åãã
ä»åã¯ãç¡æã§ãå©çšã§ããChatGPT(ã¢ãã«GPT3.5)ã䜿ã£ãŠã¿ããäžèšã®ããã³ãããäžãããšã次ã®ãããªå¿çãè¿ããã
ãªããããã°ã©ã ãå®è¡ããããã«ã¯ãPythonã®ã©ã€ãã©ãªãPillowããšãReportLabããå¿ èŠãšãªããã¿ãŒããã«(WindowsãªãPowerShellãmacOSãªãã¿ãŒããã«.app)ãèµ·åããŠãäžèšã®ã³ãã³ããå®è¡ãããã
# --- Windowsã®å Žå ---
python -m pip install Pillow ReportLab
# --- macOSã®å Žå ---
python3 -m pip install Pillow ReportLab
ãããŠãChatGPTãäœæããããã°ã©ã ããimages-to-pdf.pyããšãããã¡ã€ã«åã§ä¿åãããããããŠãimagesãšãããã©ã«ããäœæããŠãããã«JPEGãã¡ã€ã«ã6æä»¥äžã³ããŒãããããã®åŸãã¿ãŒããã«ã§æ¬¡ã®ã³ãã³ããå®è¡ãããã
# --- Windows ---
python images-to-pdf.py
# --- macOS ---
python3 images-to-pdf.py
ãããšæ¬¡ã®ããã«ãšã©ãŒã衚瀺ããããèªè ã®çããã¯ã©ãã ã£ãã ããããå€§èŠæš¡èšèªã¢ãã«ã¯ãæ¯åç°ãªãè¿çãè¿ããããäœæãããããã°ã©ã ãç°ãªãã®ã ã
ChatGPTã®ããã°ã©ã çæã®èœåã¯æ¥ã é«ããªã£ãŠããã®ã§ããšã©ãŒã衚瀺ããããæ£ããåãããšãããã ãããããããä»åã®ããã«ãšã©ãŒã衚瀺ãããããšãããããããªæã«ã¯ã以äžã®ããã«ããšã©ãŒã¡ãã»ãŒãžãã³ããŒããŠChatGPTã®ç¶ãäŒè©±ã«äžãããšè¯ãã
ããã§ã¯ãChatGPTã®ç¶ãäŒè©±ã«äžèšã®ããã«ãšã©ãŒã¡ãã»ãŒãžãå ¥åããŠã¿ãã
äžèšã®ãšã©ãŒã衚瀺ãããŸããã
TypeError: expected str, bytes or os.PathLike object, not JpegImageFile
ãããšã次ã®ããã«ããã«è¬çœªããæ¹åæ¡ã瀺ããŠããããä»åºŠã¯æåŸ ã§ãããã ã
å ã»ã©ãšåãããã«ãããã°ã©ã ããimages-to-pdf.pyãã«ä¿åããã¿ãŒããã«ã§Pythonã®ããã°ã©ã ãå®è¡ããŠã¿ããããããšãåé¡ãªãåããããšãã§ããã
ããããäœæãããPDFãimages.pdfããèŠããšã次ã®ããã«æ²æšãªãã®ã§ãã£ãã
ãã®ããã«ãChatGPTã䜿ãå Žåããã®éªšçµã¿ãäœãã®ã¯éåžžã«ç°¡åãªã®ã ãã现ããç¹ã¯ãèªåã§èª¿æŽããæ¹ãéããåçã貌ãä»ãã座æšãééã£ãŠãããããªã®ã§ããã®èŸºãã調æŽããã ãã§è¯ãããã ã£ãã
ããã°ã©ã ã宿ãããã
ããã§ãæçµçã«çè ãä¿®æ£ããŠå®æãããããã°ã©ã ã玹ä»ããããå°ãé·ããªã£ãŠããŸã£ãã®ã§ãããã°ã©ã å šäœã¯ãã¡ãã®Gistã«ã¢ãããããå¿ èŠãªéšåãå°ããã€è§£èª¬ãããã
ãŸãã¯ãJPEGç»åã®äžèЧãåæããããã°ã©ã ã確èªãããã以äžã¯ããpdf-inããšãããã©ã«ãã«ããJPEGç»åãåæããäŸã ã
import os
# ãã©ã«ãå
ã®JPEGãã¡ã€ã«ãåæ --- (*1)
image_folder = 'pdf-in'
image_files = [
f for f in os.listdir(image_folder) # os.listdirã§ãã¡ã€ã«ã®äžèЧãååŸ
if f.endswith('.jpg') or f.endswith('.jpeg')] # æ¡åŒµåãå€å®
os.listdirã¡ãœãããšããªã¹ãã®å å èšæ³ãå©çšããŠããã¡ã€ã«ã®äžèЧãååŸããŠããããªã¹ãã®å å 衚èšã䜿ãäºã§ãç°¡æœã«ãã¡ã€ã«ã®äžèЧãååŸã§ããã
次ã«PDFã®ããŒãžãµã€ãºãA4(瞊åã)ã«èšå®ããŠããã®ã次ã®éšåã確èªããŠã¿ããã
from reportlab.lib.pagesizes import A4, landscape, portrait
from reportlab.pdfgen import canvas
# PDFãã¡ã€ã«ã®äœæãšèšå®(A4瞊åãã«ãã) --- (*2)
c = canvas.Canvas(output_pdf, pagesize=portrait(A4))
width, height = portrait(A4)
print(f'PageSize={width:.1f},{height:.1f}')
# A4ã«çžŠåã6æ(2x3)ã§é
眮ããããã«èšç® --- (*3)
margin_x, margin_y = 10, 60
image_width = (width - 3 * margin_x) // 2
image_height = (height - 4 * margin_y) // 3
(ïŒ2)ã®éšåã§ãreportlabã«ã¯ãããŒãžãµã€ãºãåãã衚ã宿°ãçšæãããŠããã®ã§ããããå©çšããŠããŒãžãµã€ãºã®æå®ãå¯èœãšãªã£ãŠããããªããããŒãžãµã€ãºãæå®ãããšã(ïŒ3)ã§å¹ (width)ãšé«ã(height)ãååŸã§ããã®ã§ããããå©çšããŠç»åã®ãµã€ãºãæå®ããã
ãããŠã以äžã®é¢æ°ãç»åãã¡ã€ã«ããµã€ãº(max_width, max_height)ã«ãªãµã€ãºããåŠçã ããªãµã€ãºã«æéã¯ããããã®ã®ããã£ãšãç»åã®ç»è³ªãè¯ããªãLANCZOSã¢ã«ãŽãªãºã ãå©çšããŠãªãµã€ãºããŠããã
# ç»åããªãµã€ãºãã颿° --- (*4)
def resize_image(image, max_width, max_height):
width, height = image.size
# æ°ãããµã€ãºãèšç®
resize_ratio = max_width / width
if width < height:
resize_ratio = max_height / height
new_width = int(width * resize_ratio)
new_height = int(height * resize_ratio)
# ç»åããªãµã€ãº(LANCZOSãå©çš)
image_r = image.resize((new_width, new_height), Image.LANCZOS)
次ã«ãç»åã«åã蟌ãŸããExifæ å ±ãå©çšããŠç»åã®åããå転ããåŠçã確èªããŠã¿ããã
# Exifãå©çšããŠç»åã®åããå転 --- (*5)
def change_image_rotation(img):
exif_data = img._getexif()
if exif_data:
for tag, value in exif_data.items():
if TAGS.get(tag) == 'Orientation':
if value == 3:
img = img.rotate(180, expand=True)
elif value == 6:
img = img.rotate(-90, expand=True)
elif value == 8:
img = img.rotate(90, expand=True)
return img
ã¹ããŒããã©ã³ãããžã¿ã«ã«ã¡ã©ã§æ®åœ±ããJPEGç»åã«ã¯å€§æµExifãšåŒã°ããæ®åœ±æ å ±ãèšé²ãããŠããããã®Exifæ å ±ã«ã¯ç»åã®åãã衚ããOrientationãæ å ±ãå ¥ã£ãŠããããããå©çšããŠç»åãå転ããã®ãäžèšã®åŠçãšãªãã
æåŸã«ãç»åãPDFã«è²Œãä»ããã®ã以äžã®åŠçã ã
# ç»åããªãµã€ãºãå転ããŠPDFã«è²Œãä»ã --- (*6)
for idx, image_file in enumerate(image_files):
if (idx % 6 == 0) and (idx > 0): # --- (*6a)
c.showPage() # æ°ããããŒãžãéå§
i = idx % 6
# åçã®åº§æšãèšç® --- (*7)
x = (i // 3) * (image_width + margin_x) + margin_x
y = (i % 3) * (image_height + margin_y) + margin_y
# ç»åãèªã¿èŸŒãã§ãªãµã€ãº -- (*7a)
img = Image.open(os.path.join(image_folder, image_file))
img = change_image_rotation(img)
img = resize_image(img, int(image_width * 4), int(image_height * 4))
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.jpg')
img.save(temp_file.name, format='JPEG')
# PDFã®ãã£ã³ãã¹ã«ç»åã貌ãä»ã --- (*7b)
c.drawImage(temp_file.name, x, height - y - image_height, image_width, image_height)
temp_file.close()
# PDFãã¡ã€ã«ãä¿å
c.save()
äžèšã®(ïŒ6)ã§ã¯ç»åãäžæãã€foræãå©çšããŠäžã€ãã€åŠçããããªãã1ããŒãžã«6æãã€ã®ç»åã貌ãã®ã§ã6æã«1床æ°ããããŒãžãäœæããããã«ã(ïŒ6a)ã®éšåã§æå®ããŠããã
(ïŒ7)ã§ã¯åçã貌ãä»ãã座æšäœçœ®ãèšç®ããŠãããæŽæ°ã®å²ãç®ãè¡ãã//ãæŒç®åãšãå²ãç®ã®äœããæ±ããã%ãæŒç®åã䜿ãããšã§ããšãŠãã·ã³ãã«ã«åº§æšãèšç®ã§ããã
ãªãã(ïŒ7a)ã§ã¯ç»åãèªã¿èŸŒãã§ãªãµã€ãºãããå転ãããããŠãäžæãã¡ã€ã«ã«ä¿åããã (ïŒ7b)ã§ã¯äžæãã¡ã€ã«ã®å 容ãå ã«ããŠãPDFã«ç»åãåã蟌ãã§ããã
æåŸã«ããã£ã³ãã¹ã®save()ã¡ãœãããåŒã¶ããšã§PDFãã¡ã€ã«ãäœæã§ããã
ããã°ã©ã ããimages-to-pdf.pyããšããååã§ä¿åããŠãã¿ãŒããã«ã§ãpython images-to-pdf.pyãã³ãã³ããå®è¡ããã°ã以äžã®ããã«ããã°ã©ã ãå®è¡ããŠãPDFãäœæã§ããã
æè»œã«å®è¡ã§ããããã«ããããã¡ã€ã«ãçšæããã
æåŸã«ãWindowsã§ããã°ã©ã ãæè»œã«å®è¡ã§ããããã«ãããããã¡ã€ã«ãçšæããããã¿ãŒããã«ã«èšè¿°ããŠãã以äžã®ã³ãã³ãããããããã¡ã€ã«ãimages-to-pdf.batããšããååã§ä¿åãããããããããã«ã¯ãªãã¯ããŠå®è¡ããã°ããã°ã©ã ãå®è¡ã§ããã
python images-to-pdf.py
ãããã¯ãPythonãã€ã³ã¹ããŒã«ããŠããªãç°å¢ã§ãåããããå Žåã¯ãPyInstallerãªã©ãå©çšããŠãPythonã®ããã°ã©ã ãå®è¡ãã¡ã€ã«ã«å€æããããšãã§ããã ããã
ãŸãšã
以äžãä»åã¯å€§éã®ç»åãã¡ã€ã«ã1ããŒãžã«6æãã€é 眮ããPDFãèªåäœæããããã°ã©ã ãäœã£ãŠã¿ããPDFãäœæããæ©äŒã¯ãŸããŸãå¢ããŠããã®ã§ãä»åã®ããã°ã©ã ãåèãããã
ãŸãã骚çµã¿ãäœãã«ã¯ãChatGPTãå©çšããèªåäœæã䟿å©ãšããç¹ã玹ä»ããããã ãã綺éºã«ç»åãé 眮ããããã«ã人éãç®ã§èŠãŠæ£ãã座æšã«é 眮ã§ãããã調æŽããå¿ èŠããã£ããïŒå°æ¥çã«ã¯ããã®èŸºããæ°ãå©ãããã«æ¹åããããããããªããïŒããã§ãããŒãããããã°ã©ã ãçµãŸãªããŠã¯ãããªãããšãèããã°ãåŽåãåæžããã®ã§ãç©æ¥µçã«æŽ»çšãããšè¯ãã ããã
ãšããã§ãæè¿ãããç¥äººãããããã°ã©ããŒã¯ãã®ãã¡äžèŠã«ãªãããã ãããšèšãããããã«ãªã£ããããããä»åèŠãããã«ããã©ãã«ã·ã¥ãŒãã£ã³ã°ãå¿ èŠã«ãªãç¹ãæçµçãªçŸããã®èª¿æŽã¯äººéã«ããã§ããªãç¹ãªã©ãèæ ®ãããšããŸã ãŸã å šãŠãAIä»»ãã«ããããšã¯ã§ããªããããã«ãããããäœãè¡ãããã°ã©ã ãäœãã®ããæç€ºããªããŠã¯ãããªããPythonãçã§æžãã®ããèªç¶èšèªã§æç€ºããŠChatGPTã®ããã³ãããæžãã®ãã®éãã ããªã®ã ãåœé¢ã®éã¯ããã°ã©ããŒãå¿ èŠããã ã
èªç±åããã°ã©ããŒããããã¯ãã©ã«ãŠãããã°ã©ãã³ã°ã®æ¥œãããäŒããæŽ»åãããŠããã代衚äœã«ãæ¥æ¬èªããã°ã©ãã³ã°èšèªããªã§ããã ãããã¹ã鳿¥œããµã¯ã©ããªã©ã2001幎ãªã³ã©ã€ã³ãœãã倧è³å ¥è³ã2004幎床æªèžãŠãŒã¹ ã¹ãŒããŒã¯ãªãšãŒã¿èªå®ã2010幎 OSSè²¢ç®è ç« åè³ãæè¡æžãå€ãå·çããŠãããçŽè¿ã§ã¯ããå®è·µåãã¢ãããã Pythonã«ããã¢ã«ãŽãªãºã ã®æç§æž(ãã€ããåºç)ããã·ãŽããã¯ãã©ã PythonèªååŠçã®æç§æž(ãã€ããåºç)ããããã«äœ¿ãã!æ¥åã§å®è·µã§ãã! Pythonã«ããAIã»æ©æ¢°åŠç¿ã»æ·±å±€åŠç¿ã¢ããªã®ã€ããæ¹ TensorFlow2察å¿(ãœã·ã )ãããã³ã¬ã§ãã£ããåŠã¶Python(ãã€ããåºç)ããªã©ã





