• About Us
  • Privacy Policy
  • Disclaimer
  • Contact Us
AimactGrow
  • Home
  • Technology
  • AI
  • SEO
  • Coding
  • Gaming
  • Cybersecurity
  • Digital marketing
No Result
View All Result
  • Home
  • Technology
  • AI
  • SEO
  • Coding
  • Gaming
  • Cybersecurity
  • Digital marketing
No Result
View All Result
AimactGrow
No Result
View All Result

OCRmyPDF Tutorial: Convert Scanned Paperwork into Searchable PDF/A Recordsdata with Sidecar Textual content Extraction and Batch Processing

Admin by Admin
June 29, 2026
Home AI
Share on FacebookShare on Twitter


def _purge(*prefixes):
   for title in [m for m in list(sys.modules)
                if any(m == p or m.startswith(p + ".") for p in prefixes)]:
       del sys.modules[name]
def _load_ocrmypdf():
   _purge("PIL", "ocrmypdf")
   import ocrmypdf
   return ocrmypdf
attempt:
   ocrmypdf = _load_ocrmypdf()
besides ImportError as e:
   if "_Ink" in str(e) or "PIL" in str(e):
       print("Repairing an incompatible Pillow (reinstalling pillow<12)...")
       sh(f'"{sys.executable}" -m pip set up -q --force-reinstall "pillow<12"')
       attempt:
           ocrmypdf = _load_ocrmypdf()
           print("Pillow repaired — persevering with and not using a restart.")
       besides Exception:
           elevate RuntimeError(
               "Pillow remains to be incompatible on this session. Use the Colab menu: "
               "Runtime > Restart session, then run this cell once more."
           )
   else:
       elevate
from ocrmypdf.exceptions import (
   ExitCode,
   PriorOcrFoundError,
   EncryptedPdfError,
   MissingDependencyError,
   TaggedPDFError,
   DigitalSignatureError,
   DpiError,
   InputFileError,
   UnsupportedImageFormatError,
)
from ocrmypdf.helpers import check_pdf
from ocrmypdf.pdfa import file_claims_pdfa
import img2pdf
from PIL import Picture, ImageDraw, ImageFont, ImageFilter
logging.basicConfig(degree=logging.WARNING, format="%(levelname)s: %(message)s")
logging.getLogger("ocrmypdf").setLevel(logging.WARNING)
logging.getLogger("pdfminer").setLevel(logging.ERROR)
logging.getLogger("PIL").setLevel(logging.WARNING)
SAMPLE_TEXT_PAGES = [
   "Optical Character Recognition, commonly abbreviated as OCR, is the "
   "process of converting images of typed or printed text into machine "
   "encoded text. This page was generated as a synthetic scan so that the "
   "OCRmyPDF pipeline has something realistic to recognize and search.",
   "On 14 March 2026 the archive contained 1,482 pages across 37 folders. "
   "Roughly 92 percent of those pages were scanned at 200 to 300 dots per "
   "inch. The remaining 8 percent were skewed and required deskewing before "
   "any reliable recognition was possible.",
   "After OCRmyPDF finishes, the output is a searchable PDF/A file. You can "
   "select text, copy it, and run full text search across thousands of "
   "documents. The original image resolution is preserved while a hidden "
   "text layer is placed accurately underneath the page image.",
]
def _find_font():
   for cand in (
       "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf",
       "/usr/share/fonts/truetype/liberation/LiberationSans-Common.ttf",
   ):
       if os.path.exists(cand):
           return cand
   return None
_FONT_PATH = _find_font()
FONT = ImageFont.truetype(_FONT_PATH, 40) if _FONT_PATH else ImageFont.load_default()
def _add_speckle(img, n=6000, darkish=60):
   """Sprinkle gentle darkish specks to mimic scanner noise (motivates --clean)."""
   import random
   px = img.load()
   w, h = img.dimension
   for _ in vary(n):
       px[random.randint(0, w - 1), random.randint(0, h - 1)] = random.randint(0, darkish)
   return img
def render_page(textual content, skew=False):
   """Render one A4 web page (1654x2339 px ≈ 200 DPI) of darkish textual content on white."""
   W, H = 1654, 2339
   img = Picture.new("L", (W, H), 255)
   draw = ImageDraw.Draw(img)
   draw.multiline_text((150, 180), textwrap.fill(textual content, width=58),
                       fill=25, font=FONT, spacing=18)
   if skew:
       img = img.rotate(6, resample=Picture.BICUBIC, develop=False, fillcolor=255)
       img = img.filter(ImageFilter.GaussianBlur(0.6))
       img = _add_speckle(img)
   return img
def build_scanned_pdf(pdf_path: Path, pages_text, skew_index=1):
   """Render pages to PNGs and wrap them losslessly into an image-only PDF."""
   pngs = []
   for i, textual content in enumerate(pages_text):
       img = render_page(textual content, skew=(i == skew_index))
       p = pdf_path.mother or father / f"_pg_{pdf_path.stem}_{i}.png"
       img.save(p, format="PNG", dpi=(200, 200))
       pngs.append(str(p))
   with open(pdf_path, "wb") as f:
       f.write(img2pdf.convert(pngs))
   for p in pngs:
       os.take away(p)
   return pdf_path
def do_ocr(input_file, output_file, **kw):
   """Wrapper round ocrmypdf.ocr() that disables the progress bar and occasions it."""
   kw.setdefault("progress_bar", False)
   t0 = time.perf_counter()
   rc = ocrmypdf.ocr(input_file, output_file, **kw)
   return rc, time.perf_counter() - t0
def tokens(s: str):
   return re.findall(r"[a-z0-9]+", s.decrease())
def kb(path) -> str:
   return f"{Path(path).stat().st_size / 1024:,.1f} KB"
def banner(title: str):
   line = "─" * 74
   print(f"n{line}n  {title}n{line}")
Tags: BatchConvertdocumentsExtractionFilesOCRmyPDFPDFAProcessingScannedSearchableSidecartextTutorial
Admin

Admin

Next Post
Search And Brokers Are One Product. You Solely Want One Playbook

Search And Brokers Are One Product. You Solely Want One Playbook

Leave a Reply Cancel reply

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

Recommended.

The 4 Greatest Listening to Aids for Seniors in 2025, Examined and Reviewed

The 4 Greatest Listening to Aids for Seniors in 2025, Examined and Reviewed

August 11, 2025
The place is your N + 1?

Time effectively spent | Seth’s Weblog

February 11, 2026

Trending.

From Basement to Breakthroughs: Contained in the Studio Powering the Web’s Boldest Manufacturers

From Basement to Breakthroughs: Contained in the Studio Powering the Web’s Boldest Manufacturers

December 15, 2025
HunyuanCustom Brings Single-Picture Video Deepfakes, With Audio and Lip Sync

HunyuanCustom Brings Single-Picture Video Deepfakes, With Audio and Lip Sync

May 8, 2025
A SQL MERGE assertion performs actions primarily based on a RIGHT JOIN

Use jOOQ’s code generator to simply go table-valued parameters

April 26, 2025
A SQL MERGE assertion performs actions primarily based on a RIGHT JOIN

With jOOQ – Java, SQL and jOOQ.

May 25, 2025
A SQL MERGE assertion performs actions primarily based on a RIGHT JOIN

Implicit path joins could now skip pointless tables within the be a part of tree

April 11, 2025

AimactGrow

Welcome to AimactGrow, your ultimate source for all things technology! Our mission is to provide insightful, up-to-date content on the latest advancements in technology, coding, gaming, digital marketing, SEO, cybersecurity, and artificial intelligence (AI).

Categories

  • AI
  • Coding
  • Cybersecurity
  • Digital marketing
  • Gaming
  • SEO
  • Technology

Recent News

The Safety Jobs Rising Round Enterprise AI Brokers

The Safety Jobs Rising Round Enterprise AI Brokers

November 14, 2026
CopilotKit Releases OpenBot 1.0: An MIT-Licensed, Self-Hostable AI Coworker With Constructed-In Governance

CopilotKit Releases OpenBot 1.0: An MIT-Licensed, Self-Hostable AI Coworker With Constructed-In Governance

November 14, 2026
  • About Us
  • Privacy Policy
  • Disclaimer
  • Contact Us

© 2025 https://blog.aimactgrow.com/ - All Rights Reserved

No Result
View All Result
  • Home
  • Technology
  • AI
  • SEO
  • Coding
  • Gaming
  • Cybersecurity
  • Digital marketing

© 2025 https://blog.aimactgrow.com/ - All Rights Reserved