≡ כל המדריכים ⇩ הורד PDF

Data Pulse / Engineering Note

איך גורמים ל‑PDF לדבר עברית — באמת

עברית ב‑PDF היא אחת הבעיות הקלאסיות שנראות פשוטות עד שמנסים. הטקסט יוצא הפוך, האותיות מתפרקות, והמספרים קופצים למקום הלא נכון. הנה איך פתרנו את זה אצלנו ב‑Data Pulse — צד‑שרת, נקי, בלי דפדפן ובלי טריקים שבירים.

⇩ הורד את המדריך (PDF)
לפני — בלי טיפול
BTU 12,000 יליע ןגזמ

אותיות בסדר הפוך, יישור לשמאל, המספר במקום הלא נכון.

אחרי — הפתרון שלנו
מזגן עילי 12,000 BTU · ₪1,200

סדר RTL תקין, עברית ומספרים חיים יחד כמו שצריך.

אותה שורת הצעת מחיר — פעם כמו שהיא יוצאת "מהקופסה", ופעם אחרי הפתרון.

The Problem

למה זה קשה בכלל?

קובץ PDF לא "יודע" עברית מעצמו. שלושה מכשולים נפרדים מצטרפים לאותה תקלה, וצריך לפתור את כולם — לא רק אחד מהם:

Fonts

פונטים

פונטי ברירת‑המחדל של PDF הם Latin‑1 בלבד — פשוט אין בהם גליפים עבריים.

Bidi

כיווניות

עברית זורמת מימין לשמאל, וצריך את אלגוריתם ה‑Bidi של יוניקוד כדי לסדר אותה נכון.

Mixed

ערבוב

עברית + מספרים + לועזית באותה שורה (₪, BTU, 12,000) — כאן רוב הפתרונות נשברים.

The Fix

הפתרון: שלושה מהלכים

בנינו את מחולל ה‑PDF על גבי fpdf2 — הגרסה המתוחזקת של PyFPDF. במקום להיאבק בעברית ידנית, נתנו למנוע הנכון לעשות את העבודה:

מטמיעים פונט Unicode עם עברית

דרך add_font() מטמיעים פונט אמיתי (Arial / Liberation Sans) שכולל גליפים עבריים, במקום פונטי הליבה המוגבלים.

מדליקים text‑shaping

שורה אחת — set_text_shaping(True) — מפעילה את מנוע HarfBuzz (דרך uharfbuzz), שמבצע אוטומטית את אלגוריתם ה‑Bidi ואת עיצוב הגליפים. זה הלב של הפתרון.

פורסים RTL בעצמנו

יישור לימין (align="R") ועיגון כל אלמנט מהשוליים הימניים — כך הטבלה, הכותרות, הסכומים והחתימה יושבים במקום הנכון בעמוד.

quote_pdf.py
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, עם ערכי צבע שנשמרים לכל חברה בנפרד.

כותרות
rgb(26,42,58)
הדגשה / מיתוג
rgb(79,70,229)
הערות
rgb(146,64,14)
צבע החברה
per‑company

Why It Holds

למה זה עדיף על הדרך ה"רגילה"

הדרך ה"רגילה"הדרך שלנו
הופכים מחרוזות עברית ביד HarfBuzz מעצב את הטקסט; באף מחרוזת לא נוגעים
ספריית Bidi חיצונית מודבקת מלמעלה אלגוריתם ה‑Bidi של יוניקוד, בתוך המנוע עצמו
מתפרק ברגע שמערבבים מספרים, פיסוק או לועזית עברית, מספרים ולועזית חיים באותה שורה
כל תקלה מתגלה אצל הלקוח, בקובץ שכבר נשלח מנוע אחד לכל המסמכים — מה שנבדק פעם עובד בכולם

הגישה הישנה הייתה להפוך מחרוזות עברית ביד ולהיעזר בספריות Bidi חיצוניות — פתרון שביר שמתפרק בדיוק ברגע שמערבבים מספרים, פיסוק או לועזית. כשנותנים ל‑HarfBuzz לטפל בכיווניות ובעיצוב, הכול "פשוט עובד" — גם במקרי הקצה.

מה יצא מזה

  • PDF עברי תקין לחלוטין — כותרות, טבלת פריטים, סכומים, הערות וחתימה דיגיטלית.
  • שומר על המיתוג — לוגו, צבעי כותרות, רקע וטקסט בערכי RGB מדויקים, לכל חברה הצבעים שלה.
  • עברית, מספרים, ₪ ולועזית חיים יחד באותה שורה בלי להישבר.
  • הכול צד‑שרת ב‑Python טהור — בלי דפדפן נסתר, בלי wkhtmltopdf, מהיר ודטרמיניסטי.
  • שורה אחת (set_text_shaping) במקום מאות שורות של תיקוני Bidi ידניים.

Build It Yourself

רוצים לבנות את זה? פרומפט להתחלה

העתיקו את הפרומפט הבא ל‑AI (כמו Claude או ChatGPT) כדי לקבל בסיס עובד:

prompt
צור PDF בעברית תקינה (RTL) ב־Python עם הספרייה fpdf2:
• הטמע פונט Unicode עם גליפים עבריים דרך add_font (למשל arial.ttf / Liberation Sans), במקום פונטי הליבה Latin-1.
• הפעל pdf.set_text_shaping(True) לקבלת אלגוריתם Bidi ו־shaping אוטומטיים (מנוע HarfBuzz).
• ישר טקסט לימין (align="R") ועגן אלמנטים מהשוליים הימניים.
• ודא שעברית, מספרים ולועזית מופיעים נכון באותה שורה, ושמור על צבעי מיתוג עם set_fill_color / set_text_color.