פינגווין עם כיפה

Fribidi, ReportLab, ו pdf

פורסם ב עברית, קוד פתוח ב moshewagner על ידי ספטמבר 23, 2009

לבקשת יואל , אני מפרסם כאן מבוא והסבר על שימוש ב fribidi, ו- pyfribidi, ובהזדמנות הזאת גם על הפאטצ' שכתבתי (אבל עוד לא נכנס :-( ) ל-ReportLab.

זוכרים את זה שפעם כל אתר שני היה מראה עברית בכתב מראה, והאתרים שהיו מראים עברית נכון היו מועתקים לא נכון ל word?

זה קורה בגלל שבצורה טבעית, מחשבים מתייחסים לטקסט משמאל לימין.
למשל, אם נתאר את המחרוזת "שלום", כמערך, זה יראה כך:

c_str[0] = "ש", c_str[1] = "ל", c_str[2] = "ו" ,c_str[3]= "ם"

ואז, כשהמחשב ינסה לכתוב אותה, קודם תגיע האות "ש", משמאלה "ל", וכו', ונקבל את הביטוי המפורסם "םולש".

בפורמטים יותר מתוחכמים, (כמו html של היום), אני מאמין שתיקנו את הבעייה בצורה יסודית, כך שהדפדפן, למשל, יודע שטקסט עברי באמת צריך להתחיל מימין לשמאל.

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

ומאחר ו pdf, שבו אנו עוסקים כרגע, הוא לא מהפורמטים היותר חכמים, זו האפשרות שמשתמשים בה שם.
ככה שאם אתם רואים מילה בעברית בקובץ pdf, דעו לכם שמבחינת הקובץ המילה הפוכה, אלא שלמראית עין זה מוצג נכון.

למאי נפקא מינה?
זו באמת לא בעייה גדולה, אבל מוכרחים להיות מודעים אליה. כשמחלצים טקסט מ pdf, חייבים לדעת שאם יש בו עברית היא תהיה הפוכה, ולהפוך אותה חזרה. כנ"ל כשיוצרים קובץ pdf.

רוב התוכנות הגדולות כבר מודעות לזה, ואכן אין בעייה.
אבל – יצא לי למשל להשתמש ב ReportLab ליצירת pdf, ומאחר ואף אחד לא היה מודע לבעייה, עברית יצאה הפוך.
שלחתי להם תיקון לבעייה , רק שזה כנראה לא בוער להם, אז זה לא נכנס. לי בינתיים התיקון מספיק.

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

לכן, כאן נכנסת הספרייה (או התוכנה) fribidi לתמונה. בפשטות –

"GNU FriBidi is an implementation of the Unicode Bidirectional Algorithm (bidi). "

היינו, מימוש של התקן להצגת טקסטים דו-כיווניים.

זה אומר שהתוכנה מקבלת טקסט כלשהו, והופכת אך ורק את התווים שצריכים ללכת מימין לשמאל:


moshe@debian:~$ echo תירבע and English | fribidi
and English עברית

כל כך פשוט.

כמובן, שתמיד ישנה ההתלבטות לגבי הכיוון הכללי של השורה, מה שמשפיע בעיקר על סימני פיסוק בסוף שורה. (למשל, נקודה יכולה להיות בסוף משפט, אבל השאלה היא האם סוף המשפט זה בצד שמאל או ימין).
כברירת מחדל, Fribidi מבצע זיהוי אוטומטי לפי התו הראשון בשורה. זה כמובן נכון רק לשורות בודדות ולא לפסקאות, ולכן ישנה האפשרות להכריח כיוון מסויים:


moshe@debian:~$ echo תירבע and English. | fribidi --ltr
עברית and English.
moshe@debian:~$ echo תירבע and English. | fribidi --rtl
.and English עברית

זה בערך מכסה את הבסיס לגבי fribidi עצמו. עוד אפשרויות אפשר למצוא ב man page שלו.

אם נרצה להכניס את זה לתוכנה, זה טיפה יותר מסובך, אבל אני אדגים כאן את הצורה הפייתונית, שיחסית פשוטה ( היא משתמשת ב binding לפייתון שכתב קובי זמיר, בשם pyfribidi ):


moshe@debian:~$ python
...
>>> str = "עברית and English!"
>>> print (str)
עברית and English!
>>> import pyfribidi
>>> direction = pyfribidi.LTR
>>> str = pyfribidi.log2vis(str, direction)
>>> print (str)
תירבע and English!

שיעורי בית לקוראים:
מה יקרה יותר כאשר יותר משורה אחת עוברת דרך fribidi? ומה הפתרון לבעייה?

זהו בערך. מקווה שהחכמתם; אם לא, אתה מוזמים לשלוח לי נאצות וכיו"ב באיימל.

שנה טובה,
גמר חתימה טובה,
משה

8 תגובות

לקבלת עדכונים לתגובות באמצעות RSS.

  1. אילן שביט said, on ספטמבר 23, 2009 at 8:31 pm

    משה

    אהבתי מאוד את המאמר!
    יש לי שאלה: האם ביבוא קובץ PDF באופן-אופיס יש בעיה רק עם עברית הפוכה או שיש בעיות נוספות?

  2. Tzafrir Cohen said, on ספטמבר 23, 2009 at 9:19 pm

    לא מדובר על "פורמט חכם" או פורמט טיפש". מדובר על "לוגי" לעומת "ויזואלי".

    הסדר הלוגי הוא סדר הכתיבה של האותיות. הסדר הויזואלי הוא הסדר שבו הן אמורות להיות מוצגות על המסך. קובץ PDF מיועד לייצג את מה שנשלח למדפסת ולכן סדר האותיות שמופיע שם הוא סדר האותיות הויזואלי: בדיוק זה שמופיע על המסך. אין צורך לנחש מה צריך להפוך ומה לא. זה מפשט מאוד את תהליך ההדפסה. החיסרון הוא שאי־אפשר לחפש בטקסט הזה ללא התחכמויות.

    טקסט רגיל וגם HTML נשמר בסדר לוגי – זה הסדר הטבעי: כך אנחנו כותבים.

    • moshewagner said, on ספטמבר 24, 2009 at 10:16 am

      בסדר, מקובל :-)

      הכוונה לא הייתי לפורמט "חכם" אל מול "טיפש", אלא יותר ל"מורכב" למול "פשוט" (אולי "נאיבי").
      וע"ע "מעשה בחכם ותם" של רבי נחמן בעניין ;-)

  3. [...] ב עברית, קוד פתוח ב moshewagner על ידי 24/09/2009 בהמשך לפוסט הקודם , אני מביא כאן דרך להשתמש בספרייה fribidi מתוך קוד c / c++ . [...]

  4. מאיר said, on ספטמבר 24, 2009 at 10:44 am

    אין פה בעיית רישוי ? החברה של pyfribidi יצרו בלאגן והשתמשו ב-GPL למרות ש-fribidi עצמו תחת LGPL‏.

    ReportLab הוא תחת רישון BSD, לא נראה לי שהוא יוכל להשתמש ב-pyfribidi. אתה חייב ליידע אותם בנושא כדי שיחליטו נכון ולמניעת חגיגות.

    • moshewagner said, on ספטמבר 24, 2009 at 10:53 am

      וואלה, לא חשבתי על זה בכלל. זה כמעט כמו מלחמות דוסים הקטע הזה של רשיונות קוד פתוח.

      אבל לפני שאני מתחיל להלחץ (בכל מקרה אין לחץ כי לא נראה לי שהפאטצ' שלי מעניין אותם ;-) ):
      הקוד שלי לא מגיע עם pyfribidi. הוא בסך הכל מנסה (try) לעשות לו import, ואם מצליח, משתמש בו.
      גם מקרה כזה מחייב שהקוד המשתמש יהיה GPL?

      בכל מקרה, "החברה של pyfribidi" זה בעיקר קובי אאל"ט. אם יש בעייה, אפשר לדבר איתו.

      משה

  5. מאיר said, on ספטמבר 24, 2009 at 11:11 am

    לא יודע אם "לא מעניין אותם", הם כתבו שזה אמור להכנס ככל הנראה בגרסה 2.4. בכל מקרה לי נראה שיש בעייתיות בנושא, אז הכי טוב לתת לבעלי הפרוייקט להחליט.

    (נ.ב. כדאי בעתיד לשלוח פאצ', כזה שמיוצר ע"י diff לדוגמא, יבטיח טיפול טוב יותר לדעתי).

  6. netta said, on יולי 28, 2010 at 11:41 am

    הי משה, חיפשתי אימייל שלך באתר ולא מצאתי ולכן אני מכניסה את השאלה שלי כתגובה
    אני מנסה ליצר pdf עם reportlab וכמובן העיברית יוצאת הפוכה…
    הגעתי לפוסט שלך בנושא pyfribidi, אני מבינה שכדי שזה יעבוד אני צריכה להתקין את py++?


להגיב

Fill in your details below or click an icon to log in:

WordPress.com Logo

אתה מגיב באמצעות חשבון WordPress.com שלך. Log Out / לשמור )

Twitter picture

אתה מגיב באמצעות חשבון Twitter שלך. Log Out / לשמור )

Facebook photo

אתה מגיב באמצעות חשבון Facebook שלך. Log Out / לשמור )

Connecting to %s

Follow

Get every new post delivered to your Inbox.