pdf2img python編

คือว่า โปรแกรมpdf24เมื่อกี้มันพัง… พอinput pdfหลายๆไฟล์พร้อมกัน มันบอกว่าหา imageที่extractแล้วเก็บไว้ใน tmp folder ไม่เจอ .. ซึ่งปิดโปรแกรมเปิดใหม่ก็ไม่หาย เหมือนจะต้องรีเซ็ตคอม…
ก็เลย ถาม chatpgtให้มันเขียนโค๊ดให้หน่อย + แก้เองเยอะอยู่
ได้ความว่า

import fitz  # pip install PyMuPDF
import os
import shutil
from pathlib import Path

def extract_images_from_pdf(pdf_path, save_folder):
    doc = fitz.open(pdf_path)
    print(pdf_path)
    save_prefix = "_".join(element[:10] for element in pdf_path.split("\\"))
    #save_prefix = pdf_path.replace("\\", "-")[0:20]
    print(save_prefix)

    img_index =0
    for page_number in range(doc.page_count):
        page = doc[page_number]
        images = page.get_images(full=True)
        #print("found images "+len(images))


        for img_info in images:
            img_index += 1
            image_index = img_info[0]
            #print(img_index,image_index)
            base_image = doc.extract_image(image_index)

            image_bytes = base_image["image"]
            image_filename = f"{save_folder}/{save_prefix}_{img_index}.jpg"

            with open(image_filename, "wb") as image_file:
                image_file.write(image_bytes)
    print("extracted images = "+str(img_index)+"\n")
    doc.close()
    
    
def extract_images_from_pdfs(pdf_folder, save_folder):
    files = [f for f in os.listdir(pdf_folder) if os.path.isfile(os.path.join(pdf_folder, f))]
    for file in files:
        #print(file)
        if file.lower().endswith(('.pdf')):
            filepath = os.path.join(pdf_folder, file)
            extract_images_from_pdf(filepath, save_folder)
    print("Done!")
            
extract_images_from_pdfs('Session 5 - Interfaces for the Body and Beyond','extracted_images')

คือใส่ชื่อ folder เป็น input แล้วอ่าน pdf ในโฟล์เดอร์นั้น extract image
ซึงอันนี้ ถ้ารูปต้นฉบับเป็น transparent มา มันจะใส่ background สีดำให้ ต่างกับตัวโปรแกรมpdf24 ที่เซฟเป็นสีขาวให้ ดูคลีนตากว่า

ละก็contrastสีเพี้ยนน ไม่รู้ว่ารูปต้นฉบับเป็นไฟล์อะไร

folder ismar นี่ล่มมาก ทั้งสีเพี้ยน ภาพมาเป็นเศษๆ ไม่รู้เป็นไร

กับอีกอย่างที่ยังทำไม่ได้คือ ถ้ารูปต้นฉบับ embed เป็น pdf มา (มักจะเป็นพวกกราฟที่อยากได้ …) ทั้งโปรแกรมpdf24 ทั้ง python lib ตัวนี้ยัง extract ออกมาให้ไม่ได้

pdf2img

พอดีจะหาไอเดียทำกราฟใส่เปเปอร์ ปกติก็จะนั่งเปิดอ่านทีละอัน นั่งcropอันที่ชอบละsaveเก็บไว้ในfolderบ้าง แปะใน powerpoint/excel บ้างแล้วแต่อารมณ์ เสร็จละก็มักจะหาไม่เจอว่ารูปนี้มาจากเปเปอร์ไหน….

ด้วยความขี้เกียจcropรูปละ เลยเซิร์จหาโปรแกรมละก็เจอ มีให้ดาวโหลดโปรแกรมลงคอมด้วยนะ
https://tools.pdf24.org/en/extract-images

คือลากไฟล์เยอะๆใส่ได้เลย ละมันจะextractรูปภาพออมาให้ ตอนที่เซฟยังแยกโฟลเดอร์ตามชื่อ paper อยู่ โชคดีที่ชื่อรูปยังมี prefix เป็นชื่อโฟลเดอร์อยู่ (ถ้าทำในเว็ป ชื่อรูปไม่มี prefix เป็น 0.png 1.png 2.png ไป)
เดี่ยวเขียน python ให้มันเอารูปออกมาจากโฟลเดอร์จะได้ดูง่ายๆ ถาม chatgpt กับเขียนเพิ่มเองอีกนิด

import os
import shutil
from pathlib import Path

def move_images_and_delete_folders(folder_path):
    print("process on :"+folder_path)
    # Get a list of all subdirectories
    subdirectories = [f for f in os.listdir(folder_path) if os.path.isdir(os.path.join(folder_path, f))]

    # Iterate through each subdirectory
    for subdir in subdirectories:
        print(subdir)
        subdir_path = os.path.join(folder_path, subdir)
        if not os.path.isdir(subdir_path):
            print("not a directory, skip!")
            continue

        # Get a list of all files in the subdirectory
        files = [f for f in os.listdir(subdir_path) if os.path.isfile(os.path.join(subdir_path, f))]
        folder_contain_image = False
        # Iterate through each file in the subdirectory
        for file in files:
            # Check if the file is an image (you can customize this check based on your file extensions)
            if file.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp')):
                # Move the image file to the parent directory
                source_file = os.path.join(subdir_path, file)
                destination_file = os.path.join(folder_path, file)
                shutil.move(source_file, destination_file)
                folder_contain_image=True

        # Delete the empty subdirectory
        if(folder_contain_image):
            os.rmdir(subdir_path)

# Replace 'your_folder_path' with the path to the folder containing subfolders
folder_path = os.getcwd()

move_images_and_delete_folders(folder_path)

Pdf merge and compress

pdftk : https://www.pdflabs.com/tools/pdftk-server/

gswin64 : https://ghostscript.com/releases/gsdnld.html

filenames = os.listdir()
result = ” “.join(filenames)
result

pdftk 1.pdf 2.pdf 3.pdf cat output merged.pdf

gswin64 -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 –dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=merged_compress.pdf merged.pdf

  • -dPDFSETTINGS=/screen lower quality, smaller size. (72 dpi)
  • -dPDFSETTINGS=/ebook for better quality, but slightly larger pdfs. (150 dpi)
  • -dPDFSETTINGS=/prepress output similar to Acrobat Distiller “Prepress Optimized” setting (300 dpi)
  • -dPDFSETTINGS=/printer selects output similar to the Acrobat Distiller “Print Optimized” setting (300 dpi)
  • -dPDFSETTINGS=/default selects output intended to be useful across a wide variety of uses, possibly at the expense of a larger output file

Reference:  https://ghostscript.readthedocs.io/en/latest/VectorDevices.html#controls-and-features-specific-to-postscript-and-pdf-input

pdf to png command

gswin64 -sDEVICE=pngalpha -sOutputFile=math.png -r144 math.pdf