Instala la biblioteca PyPDF2, que permite manipular archivos PDF.

pip install PyPDF2

Dividir PDF

En las páginas que se indiquen.

import sys
from PyPDF2 import PdfReader, PdfWriter

def split_pdf(input_pdf, start_page, end_page, output_pdf):
    reader = PdfReader(input_pdf)
    writer = PdfWriter()

    for i in range(start_page - 1, end_page):
        writer.add_page(reader.pages[i])

    with open(output_pdf, 'wb') as out_file:
        writer.write(out_file)

if __name__ == "__main__":
    if len(sys.argv) != 5:
        print("Uso: python split_pdf.py <archivo.pdf> <pagina_inicial> <pagina_final> <salida.pdf>")
        sys.exit(1)

    input_pdf = sys.argv[1]
    start_page = int(sys.argv[2])
    end_page = int(sys.argv[3])
    output_pdf = sys.argv[4]

    split_pdf(input_pdf, start_page, end_page, output_pdf)

Combinar PDFs

Indicando la Carpeta que los contiene

import os
import re
import argparse
from PyPDF2 import PdfMerger

def extract_number_from_filename(filename):
    # Utilizar una expresión regular para extraer el primer número que aparezca en el nombre del archivo
    match = re.search(r'\d+', filename)
    return int(match.group()) if match else float('inf')  # Si no se encuentra un número, asignar un valor muy alto

def merge_pdfs_in_folder(folder_path, output_pdf='merged_output.pdf'):
    # Crear una instancia de PdfMerger
    merger = PdfMerger()

    # Obtener todos los archivos PDF en la carpeta
    pdf_files = [f for f in os.listdir(folder_path) if f.endswith('.pdf')]

    # Ordenar los archivos numéricamente por el número en su nombre
    pdf_files.sort(key=extract_number_from_filename)

    # Verificar si hay archivos PDF en la carpeta
    if not pdf_files:
        print("No se encontraron archivos PDF en la carpeta.")
        return

    # Recorrer cada archivo PDF y agregarlo al merger
    for pdf in pdf_files:
        pdf_path = os.path.join(folder_path, pdf)
        print(f"Añadiendo {pdf_path}")
        merger.append(pdf_path)

    # Guardar el PDF combinado en el archivo de salida
    with open(output_pdf, 'wb') as output_file:
        merger.write(output_file)

    # Cerrar la instancia de PdfMerger
    merger.close()

    print(f"PDFs combinados exitosamente en: {output_pdf}")

if __name__ == "__main__":
    # Configuración de argumentos para pasar la carpeta y el nombre del archivo de salida
    parser = argparse.ArgumentParser(description="Combina todos los archivos PDF en una carpeta.")
    parser.add_argument('folder', type=str, help='Ruta de la carpeta que contiene los archivos PDF.')
    parser.add_argument('--output', type=str, default='merged_output.pdf', help='Nombre del archivo PDF de salida (opcional).')

    # Parsear los argumentos
    args = parser.parse_args()

    # Llamar a la función para combinar los PDFs
    merge_pdfs_in_folder(args.folder, args.output)