Skip to content

Commit 08c36c7

Browse files
fix(latex): keep Tectonic engine within module boundaries
1 parent 2acd68c commit 08c36c7

1 file changed

Lines changed: 27 additions & 5 deletions

File tree

docling/backend/latex/engines/tectonic.py

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,38 @@
44
import shutil
55
import subprocess
66
import tempfile
7+
import threading
78
from pathlib import Path
89

910
from docling_core.types.doc.document import ImageRef
11+
from PIL import Image, ImageChops
1012

1113
from docling.backend.latex.engines.base import RenderEngine
12-
from docling.utils.locks import pypdfium2_lock
1314

1415
_log = logging.getLogger(__name__)
16+
_PYPDFIUM2_LOCK = threading.Lock()
17+
18+
19+
def _crop_whitespace(
20+
image: Image.Image,
21+
bg_color: float | tuple[int, ...] | int | None = None,
22+
padding: int = 0,
23+
) -> Image.Image:
24+
if bg_color is None:
25+
bg_color = image.getpixel((0, 0))
26+
27+
bg = Image.new(image.mode, image.size, bg_color)
28+
diff = ImageChops.difference(image, bg)
29+
bbox = diff.getbbox()
30+
if bbox is None:
31+
return image
32+
33+
left, upper, right, lower = bbox
34+
left = max(0, left - padding)
35+
upper = max(0, upper - padding)
36+
right = min(image.width, right + padding)
37+
lower = min(image.height, lower + padding)
38+
return image.crop((left, upper, right, lower))
1539

1640

1741
class TectonicEngine(RenderEngine):
@@ -281,17 +305,15 @@ def render(
281305
try:
282306
import pypdfium2 as pdfium
283307

284-
from docling.backend.docx.drawingml.utils import crop_whitespace
285-
286-
with pypdfium2_lock:
308+
with _PYPDFIUM2_LOCK:
287309
with pdfium.PdfDocument(pdf_file) as pdf:
288310
page = pdf[0]
289311
pil_image = page.render(scale=300 / 72).to_pil()
290312
page.close()
291313

292314
# Auto-crop the generous border added by standalone,
293315
# keeping a small padding (10px) for clean margins.
294-
pil_image = crop_whitespace(pil_image, padding=10)
316+
pil_image = _crop_whitespace(pil_image, padding=10)
295317

296318
return ImageRef.from_pil(pil_image, dpi=300)
297319
except Exception as e:

0 commit comments

Comments
 (0)