import fitz # PyMuPDF for PDF processing from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import letter import streamlit as st import tempfile import os from PIL import Image def convert_pdf_to_images(pdf_path): """ Converts PDF pages to images using PyMuPDF (fitz). """ doc = fitz.open(pdf_path) image_paths = [] for page_num in range(len(doc)): page = doc.load_page(page_num) pix = page.get_pixmap(dpi=300) temp_image_path = f"temp_page_{page_num + 1}.png" pix.save(temp_image_path) image_paths.append(temp_image_path) return image_paths def ocr_text_from_image(image_path): """ Perform OCR on the given image to extract text. """ image = Image.open(image_path) text = pytesseract.image_to_string(image, lang="eng") # Use English OCR return text def extract_to_editable_pdf(uploaded_file, output_pdf_path): """ Extracts text using OCR and diagrams separately, and saves as an editable PDF. """ # Save uploaded file temporarily with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as temp_file: temp_file.write(uploaded_file.read()) temp_file_path = temp_file.name # Convert PDF pages to images for OCR images = convert_pdf_to_images(temp_file_path) c = canvas.Canvas(output_pdf_path, pagesize=letter) for i, image_path in enumerate(images): # Extract text from the image using OCR text = ocr_text_from_image(image_path) # Write extracted text to the PDF c.drawString(50, 750, f"Page {i + 1}") # Page header text_lines = text.split("\n") y = 730 for line in text_lines: c.drawString(50, y, line) y -= 12 # Line spacing # Overlay original page image for diagrams c.drawImage(image_path, 50, 300, width=500, height=400) # Adjust coordinates # Cleanup temporary image os.remove(image_path) c.save() # Cleanup temporary PDF os.remove(temp_file_path) def main(): """ Streamlit app for converting PDFs into editable formats. """ st.title("PDF to Editable CorelDRAW Converter") st.write("Upload a vector-based PDF to convert it into editable formats.") # File uploader for the user to upload a PDF uploaded_file = st.file_uploader("Upload PDF", type=["pdf"]) if uploaded_file: # Process the uploaded PDF with st.spinner("Processing..."): output_pdf_path = "editable_output.pdf" extract_to_editable_pdf(uploaded_file, output_pdf_path) st.success("Processing complete!") # Provide a download button for the generated editable PDF with open(output_pdf_path, "rb") as f: st.download_button( label="Download Editable PDF", data=f, file_name="editable_output.pdf", mime="application/pdf" ) # Cleanup generated output file os.remove(output_pdf_path) if __name__ == "__main__": main()