Popular Posts

Google Colab වලින් PDF-to-Image Converter එකක් හදමු

PDF එකකින් High Quality Images විදියට පිටු කිහිපයක් ගන්න ඕන වුණාම, වෙනත් software දාගන්න හරි සල්ලි ගෙවලා online සයිට් පාවිච්චි කරන්න හරි ඔබටත් සිද්ධ වෙලා ඇති. මේක ගොඩක් අයට තියෙන ප්‍රශ්නයක්.

අද අපි ඒ කිසිම කරදරයක් නැතුව, Google Colab එකේම ලේසියෙන් පාවිච්චි කරන්න පුළුවන් ලස්සන Tool එකක් හදාගමු.

මේක හදාගත්තට පස්සේ, ඔයාටම කියලා සම්පූර්ණයෙන්ම නොමිලේ පාවිච්චි කරන්න පුළුවන් Tool එකක් ලැබෙනවා. ඒකෙන් PDF එක upload කරලා, ඕන පිටු ටික තෝරලා, quality එකත් හදලා ලේසියෙන්ම Images විදියට download කරගන්න පුළුවන්.

Google Colab කියන්නේ අපිට කිසිම දෙයක් අපේ Computer එකේ Install කරන්නේ නැතුව, නොමිලේම පාවිච්චි කරන්න පුළුවන් සේවාවක්. මේක browser එකේම වැඩ කරන නිසා සාමාන්‍ය Python GUI හදන්න පාවිච්චි කරන දේවල් (tkinter, PyQt වගේ) මේකෙ වැඩ කරන්නේ නෑ.

Quality එක වෙනස් කිරීම (Custom DPI): පින්තූරයේ පැහැදිලිකම තමන්ට ඕන විදියට වෙනස් කරන්න පුළුවන් (සාමාන්‍ය 72 DPI ඉඳලා ඉතා පැහැදිලි 600 DPI වෙනකන්).

ඕන පිටු විතරක් තෝරාගැනීම: සම්පූර්ණ PDF එකම හරි, නැත්නම් ඔයාට ඕනම පිටු ටිකක් (උදා: 1, 4, 7/ 5-11) විතරක් හරි තෝරගන්න පුළුවන්.

Format එක: Images, JPEG විදියට හරි PNG විදියට හරි ලබාගන්න පුළුවන්.

Auto-Zipping: හදාගත්තු පින්තූර ටික වෙන වෙනම නැතුව, ලේසියෙන්ම එක zip ෆයිල් එකක් විදියට ඉබේම download වෙනවා.

අපේ Tool එක භාවිතා කරන ආකාරය

මුලින්ම Colab Site එකට ගිහින් අලුත් Sheet එකක් Open කරන්න.

දැන් පහල Code එක Copy කරන් Colab Site එකෙ Cell එකක Paste කරන්න.

# 1. Setup & Install
!apt-get install -y poppler-utils > /dev/null 2>&1
!pip install pdf2image > /dev/null 2>&1

import ipywidgets as widgets
from IPython.display import display, clear_output
from pdf2image import convert_from_path, pdfinfo_from_path
import os
import shutil
from google.colab import files

# 2. GUI Widgets
upload_widget = widgets.FileUpload(accept='.pdf', multiple=False, description='Upload PDF')
dpi_widget = widgets.IntSlider(value=300, min=72, max=600, step=10, description='DPI:')
format_widget = widgets.Dropdown(options=['JPEG', 'PNG'], value='JPEG', description='Format:')

# Text input for flexible page selection
pages_widget = widgets.Text(
    placeholder='e.g., 1, 3, 5 or 1-5 (Leave blank for all)',
    description='Pages:',
    layout=widgets.Layout(width='350px')
)

convert_button = widgets.Button(description="Convert & Download", button_style='success', icon='download')
output_log = widgets.Output()

# Global variable to store total pages for validation
total_pdf_pages = 0

def update_pdf_info(change):
    global total_pdf_pages
    if upload_widget.value:
        val = upload_widget.value
        file_name = list(val.keys())[0] if isinstance(val, dict) else val[0]['name']
        with open(file_name, "wb") as f:
            f.write(val[file_name]['content'] if isinstance(val, dict) else val[0]['content'])
        
        info = pdfinfo_from_path(file_name)
        total_pdf_pages = info["Pages"]
        print(f"✅ '{file_name}' loaded. Total pages: {total_pdf_pages}")

upload_widget.observe(update_pdf_info, names='value')

# Helper function to parse strings like "1,3,5" and "1-5"
def parse_page_selection(input_str, max_pages):
    if not input_str.strip():
        return list(range(1, max_pages + 1)) # Default to all pages
    
    pages = set()
    # Split by commas first
    parts = input_str.split(',')
    for part in parts:
        part = part.strip()
        if '-' in part:
            # Handle ranges like 1-5
            try:
                start, end = map(int, part.split('-'))
                # Ensure the range is valid and within PDF boundaries
                start = max(1, start)
                end = min(max_pages, end)
                if start <= end:
                    pages.update(range(start, end + 1))
            except ValueError:
                raise ValueError(f"Invalid range format: '{part}'")
        else:
            # Handle single digits
            try:
                p = int(part)
                if 1 <= p <= max_pages:
                    pages.add(p)
            except ValueError:
                raise ValueError(f"Invalid page number: '{part}'")
                
    return sorted(list(pages))

# 3. Main Conversion Logic
def process_pdf(b):
    with output_log:
        clear_output()
        if not upload_widget.value:
            print("⚠️ Please upload a PDF first.")
            return

        # Define unique folders/files
        output_folder = "final_output"
        zip_name = "converted_pdf_pages"
        
        # Parse the custom page string safely
        try:
            selected_pages = parse_page_selection(pages_widget.value, total_pdf_pages)
            if not selected_pages:
                print("⚠️ No valid pages selected within the document's page range.")
                return
        except ValueError as e:
            print(f"❌ Input Error: {e}")
            return

        # Hard Cleanup: Wipe out old folders/ZIPs to stop browser from getting confused
        if os.path.exists(output_folder): shutil.rmtree(output_folder)
        if os.path.exists(f"{zip_name}.zip"): os.remove(f"{zip_name}.zip")
        os.makedirs(output_folder, exist_ok=True)

        val = upload_widget.value
        file_name = list(val.keys())[0] if isinstance(val, dict) else val[0]['name']
        
        print(f"🔄 Converting pages: {selected_pages}...")
        for p in selected_pages:
            images = convert_from_path(file_name, dpi=dpi_widget.value, first_page=p, last_page=p)
            if images:
                images[0].save(f"{output_folder}/page_{p}.{format_widget.value.lower()}", format_widget.value)

        # Create exactly ONE Archive
        shutil.make_archive(zip_name, 'zip', output_folder)
        print("🎉 Conversion successful! Bundling complete. Downloading...")
        files.download(f"{zip_name}.zip")

convert_button.on_click(process_pdf)

# 4. Layout Display
display(widgets.VBox([
    widgets.HTML("<h3>PDF to Image Converter</h3>"),
    upload_widget,
    dpi_widget,
    format_widget,
    pages_widget,
    convert_button,
    output_log
]))

දැන් code block එකේ ඇති ‘Run’ button එක click කරන්න.

දැන් code block එකට යටින් ඔයාට Interface බලාගන්න පුළුවන්. මුලින්ම ඒකේ තියෙන ‘Upload PDF’ බට්න් එක ක්ලික් කරලා ඔයාගේ ෆයිල් එක සිලෙක්ට් කරගන්න. ඊළඟට, DPI ස්ලයිඩරේ අවශ්‍ය විදියට සීරුමාරු කරගන්න (සාමාන්‍යයෙන් print එකක් ගන්න හෝ පැහැදිලිව කියවන්න නම් 300 DPI කියන එක තමයි වඩාත් හොඳ). pdf එකේ තියෙන පිටු ඔක්කොම ඕනේ නැත්නම්, ඔයාට අවශ්‍ය පිටු අංක ටික විතරක් වෙනම ඇතුළත් කරන්නත් පුළුවන්

ඊළඟට, ‘Convert & Download’ button එක click කරන්න. එතකොට වැඩේ සිද්ධ වෙන විදිය ඔයාට ඒ පල්ලෙහා තියෙන text log එකෙන් බලාගන්න පුළුවන් වෙයි. වැඩේ ඉවර වුණාම, ඔයාගේ web browser එකෙන් ඉබේම ඒ images ටික තියෙන .zip file එක save කරගන්න කියලා ඔයාගෙන් අහයි.

ඔන්න දැන් ඔයා ළඟ පට්ටම පහසු, ඕනෙම web browser එකකින් use කරන්න පුළුවන් PDF Tool එකක් තියෙනවා. ඔයාගේ දෛනික වැඩ කටයුතු automate කරන්න මේ වගේ තව ගොඩක් දේවල් ඔයාටම Google Colab එක තුළින්ම හදාගන්න පුළුවන්. මේක පටන්ගැනීම විතරයි!


Leave a Reply

Your email address will not be published. Required fields are marked *