Data Pulse / Engineering Note
עברית ב‑PDF היא אחת הבעיות הקלאסיות שנראות פשוטות עד שמנסים. הטקסט יוצא הפוך, האותיות מתפרקות, והמספרים קופצים למקום הלא נכון. הנה איך פתרנו את זה אצלנו ב‑Data Pulse — צד‑שרת, נקי, בלי דפדפן ובלי טריקים שבירים.
אותיות בסדר הפוך, יישור לשמאל, המספר במקום הלא נכון.
סדר RTL תקין, עברית ומספרים חיים יחד כמו שצריך.
אותה שורת הצעת מחיר — פעם כמו שהיא יוצאת "מהקופסה", ופעם אחרי הפתרון.
The Problem
קובץ PDF לא "יודע" עברית מעצמו. שלושה מכשולים נפרדים מצטרפים לאותה תקלה, וצריך לפתור את כולם — לא רק אחד מהם:
פונטי ברירת‑המחדל של PDF הם Latin‑1 בלבד — פשוט אין בהם גליפים עבריים.
עברית זורמת מימין לשמאל, וצריך את אלגוריתם ה‑Bidi של יוניקוד כדי לסדר אותה נכון.
עברית + מספרים + לועזית באותה שורה (₪, BTU, 12,000) — כאן רוב הפתרונות נשברים.
The Fix
בנינו את מחולל ה‑PDF על גבי fpdf2 — הגרסה המתוחזקת של PyFPDF. במקום להיאבק בעברית ידנית, נתנו למנוע הנכון לעשות את העבודה:
דרך add_font() מטמיעים פונט אמיתי (Arial / Liberation Sans) שכולל גליפים עבריים, במקום פונטי הליבה המוגבלים.
שורה אחת — set_text_shaping(True) — מפעילה את מנוע HarfBuzz (דרך uharfbuzz), שמבצע אוטומטית את אלגוריתם ה‑Bidi ואת עיצוב הגליפים. זה הלב של הפתרון.
יישור לימין (align="R") ועיגון כל אלמנט מהשוליים הימניים — כך הטבלה, הכותרות, הסכומים והחתימה יושבים במקום הנכון בעמוד.
from fpdf import FPDF
pdf = FPDF(orientation="P")
pdf.add_page()
# 1) פונט Unicode עם גליפים עבריים (במקום פונטי הליבה Latin-1)
pdf.add_font("Heb", "", "arial.ttf")
pdf.add_font("Heb", "B", "arialbd.ttf")
# 2) HarfBuzz עושה Bidi + shaping אוטומטית
pdf.set_text_shaping(True)
# 3) פריסת RTL — יישור והצמדה לימין
pdf.set_font("Heb", "B", 14)
pdf.cell(0, 10, "מזגן עילי 12,000 BTU · ₪1,200", align="R")
pdf.output("quote.pdf")
Brand & Color
ה‑PDF אצלנו אף פעם לא "טקסט שחור על לבן". כל חברה מקבלת את המראה שלה: לוגו, כותרות צבעוניות, רקע וצבע טקסט לפי הגדרות החברה, ותיבות סכום וחתימה מעוצבות — הכול נשמר בדיוק. מאחורי הקלעים זה נעשה בערכי RGB מדויקים עם set_fill_color ו‑set_text_color, עם ערכי צבע שנשמרים לכל חברה בנפרד.
Why It Holds
| הדרך ה"רגילה" | הדרך שלנו |
|---|---|
| הופכים מחרוזות עברית ביד | HarfBuzz מעצב את הטקסט; באף מחרוזת לא נוגעים |
| ספריית Bidi חיצונית מודבקת מלמעלה | אלגוריתם ה‑Bidi של יוניקוד, בתוך המנוע עצמו |
| מתפרק ברגע שמערבבים מספרים, פיסוק או לועזית | עברית, מספרים ולועזית חיים באותה שורה |
| כל תקלה מתגלה אצל הלקוח, בקובץ שכבר נשלח | מנוע אחד לכל המסמכים — מה שנבדק פעם עובד בכולם |
הגישה הישנה הייתה להפוך מחרוזות עברית ביד ולהיעזר בספריות Bidi חיצוניות — פתרון שביר שמתפרק בדיוק ברגע שמערבבים מספרים, פיסוק או לועזית. כשנותנים ל‑HarfBuzz לטפל בכיווניות ובעיצוב, הכול "פשוט עובד" — גם במקרי הקצה.
Build It Yourself
העתיקו את הפרומפט הבא ל‑AI (כמו Claude או ChatGPT) כדי לקבל בסיס עובד: