חוקי הפורום

PHP | חילוץ טקסט בעברית מקובץ PDF


  • תכנות

    אני רוצה לחלץ טקסט מ PDF ב PHP.
    הקבצים יכולים להיות בעברית או מעורבב עברית ואנגלית.
    אני מחפש ספריה נורמלית לחילוץ הטקסט ללא הפיכת סדר התווים בעברית ו/או ג'יבריש.

    תודה!



  • @WWW אמר בPHP | חילוץ טקסט בעברית מקובץ PDF:

    הפיכת סדר התווים בעברית ו/או ג'יבריש

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


  • תכנות

    @yossiz יש ספריות מצוינות, שמוציאים כמעט את כל התווים גם לעברית UTF-8.
    הבעיה שזה הופך את סדר התווים.
    זה מוצג ככה-
    במקום:

    מה קורה
    ברוך השם

    מוצג:
    הרוק המ
    םשה ךורב

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

    [שי]כתבתי פונקציה שהופכת את התווים רק בתוך מילים בעברית והופכת את המילים רק בתוך שורה.
    אבל עדיין יש לו הרבה פשלות עם סימנים, טאבים וכו'.

    אני מחפש משהו מושלם.

    אני לא מצליח להבין איך זה עובד? כשאני כותב 'שלום', התו 'ם' נכתב בקובץ ראשון, או התו 'ש'?
    אז למה הוא מציג לי קודם 'ם'?



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


  • תכנות

    @dovid אמר בPHP | חילוץ טקסט בעברית מקובץ PDF:

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

    אני מנסה על קובץ סטנדטי, נכתב בוורד, עם תבליטים וכדו'.



  • @WWW אמר בPHP | חילוץ טקסט בעברית מקובץ PDF:

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

    זה לא כל כך פשוט, כמו שאתה רואה בעצמך, נסה לחפש משהו שמממש את ה-Unicode Bidirectional Algorithm.

    כשאני כותב 'שלום', התו 'ם' נכתב בקובץ ראשון, או התו 'ש'?

    זה תלוי בתוכנה שמייצרת את ה-PDF, אפשר לבדוק בתוכנת רנטגון ל-PDF כמו זה או זה


  • תכנות

    @yossiz אמר בPHP | חילוץ טקסט בעברית מקובץ PDF:

    נסה לחפש משהו שמממש את ה-Unicode Bidirectional Algorithm.

    מצאתי ג"כ משהו שמשתמש בכעין זה.
    זה מוסיף איזה תו בתחילת המחרוזת ובסופה.
    וכך זה מוצג מימין לשמאל.

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


  • תכנות

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


  • תכנות

    @dovid בדקתי כעת ב https://pdftotext.com/
    את הקובץ הנ"ל זה הוציא פיקס!!!
    איך הם עושים את זה?



  • @WWW אמר בPHP | חילוץ טקסט בעברית מקובץ PDF:

    זה מוסיף איזה תו בתחילת המחרוזת ובסופה.

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

    כל ספרייה שמוציאה טקסט תקין לכאורה עושה את זה. אתה צריך רק למצוא ספרייה שיעשה את זה. או לממש את החלק הזה בעצמך.

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


  • תכנות

    @yossiz אמר בPHP | חילוץ טקסט בעברית מקובץ PDF:

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

    לא הבנתי.
    תוכל להסביר יותר.



  • @WWW
    כאשר יש לך מחרוזת "Hello, עולם!", אז יש לתווים סדר חזותי וסדר לוגי, חזותי זה מה שאתה רואה לפניך ולוגי זה הסדר שבו זה נשמר בזכרון המחשב (וזה גם הסדר האמיתי של התווים).

    1 2 3 4 5 6 7 8 9 10 11 12
    סדר לוגי H e l l o , ע ו ל ם !
    סדר חזותי קטע LTR ! ע ו ל ם , o l l e H
    סדר חזותי קטע RTL o l l e H , ע ו ל ם !

    אתה מקבל כרגע טקסט שחולץ מתוך ה-PDF עם שתי בעיות: א) זה חולץ משמאל לימין, וב) זה בסדר חזותי ולא בסדר לוגי.

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

    • לקטע ימין לשמאל: fribidi_log2vis ( $str , FRIBIDI_RTL , FRIBIDI_CHARSET_UTF8 )‎
    • לקטע שמאל לימין: fribidi_log2vis ( $str , FRIBIDI_LTR , FRIBIDI_CHARSET_UTF8 )‎

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


  • תכנות

    @yossiz תודה רבה!

    1. הפונקציה הזאת מצוינת! היא ממירה אוטומטית את הסדר של התווים (רוורס). מעניין שאין אזכור לזה ברשת..

    2. יש לה אופציה לדגל FRIBIDI_AUTO במקום RTL, ככה שזה אמור להיות אוטומטי (זה לא מושלם בכלל).

    3. הפונקציה אינה כלולה ב PHP ברירת מחדל, צריך לבנות את הספריה fribidi ואח"כ לרשום את התוסף ב PHP.INI.

    4. זה עדיין לא מושלם בכלל 😞


  • תכנות

    @yossiz זה מוצג אצלי ככה:
    Hello !עולם ,
    במקום:
    Hello, עולם!

    במקור זה מופיע כך:
    Hello !םלוע ,



  • @WWW אמר בPHP | חילוץ טקסט בעברית מקובץ PDF:

    יש לה אופציה לדגל FRIBIDI_AUTO במקום RTL, ככה שזה אמור להיות אוטומטי (זה לא מושלם בכלל).

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


  • תכנות

    @WWW ניסיתי את כוחי בעבר, אבל היתה לי עוד בעייה, חוץ מהRTL.
    מה אתה עושה עם טורים?


  • תכנות

    @שואף אמר בPHP | חילוץ טקסט בעברית מקובץ PDF:

    מה אתה עושה עם טורים?

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


  • תכנות

    @yossiz אמר בPHP | חילוץ טקסט בעברית מקובץ PDF:

    וזה לא יזהה את הכיוון נכון.

    אז איך זה כן עובד?
    ולמה זה אוטומטית הופך את סדר התווים?



  • @WWW אמר בPHP | חילוץ טקסט בעברית מקובץ PDF:

    אז איך זה כן עובד?
    ולמה זה אוטומטית הופך את סדר התווים?

    לא כל כך הבנתי מה אתה שואל אבל אני אסביר יותר מה התכוונתי.
    מה זה אופציות אלו FRIBIDI_XXXX?
    זה קובע את כיוון הבסיס של הקטע. בטקסט דו כיווני יש תווים שאין להם אורינטציה כיוונית מובהקת והכיוון שלהם נקבע לפי כוון הבסיס של הקטע.
    FRIBIDI_RTL אומר לפונקציה שכיוון הבסיס הוא RTL.
    AUTO אומר לקבוע את הכיוון לפי התו הראשון בקטע שיש לו כיוון מובהק (לאפוקי פיסוק וכו').
    אופציית AUTO יכול לעבוד רק אם נותנים לפונקציה קטע שלם. אין הגיון לקבוע את הכיוון לכל שורה בפני עצמה לפי התו הראשון של השורה.
    מכיוון שאתה חייב לעבוד שורה שורה ולא בקטעים שלמים, (כי יש לך טקסט בסדר וויזואלי שזה מפוסק על ידי מעבר שורה, הבנת? אין לי כח להסביר יותר...) לכן אתה לא יכול להשתמש באופצית AUTO.
    חוץ מזה, בכללות לא מומלץ להשתמש באופציה האוטומטית אם יש לך דרך אחר לדעת את הכוון הנכון כי האוטומטי לא תמיד מזהה נכון. (ע"ע כווני הקטעים בפורום אתמול).



  • @שואף אמר בPHP | חילוץ טקסט בעברית מקובץ PDF:

    מה אתה עושה עם טורים?

    לכאורה טורים לא אמורים להיות בעיה כל כמה שהם מרונדרים ב-PDF בסדר נכון


  • תכנות

    @yossiz אמר בPHP | חילוץ טקסט בעברית מקובץ PDF:

    ולמה זה אוטומטית הופך את סדר התווים?

    לא כל כך הבנתי מה אתה שואל אבל אני אסביר יותר מה התכוונתי.

    יש לי תווים בסדר הפוך:
    םולש
    במקום
    שלום.

    והפונקציה הזאת מחזירה את התווים בסדר הנכון, האיך?



  • @WWW עם איזה אופציה FRIBIDI_XXXX קראת לפונקציה?


  • תכנות

    @yossiz אמר בPHP | חילוץ טקסט בעברית מקובץ PDF:

    @WWW עם איזה אופציה FRIBIDI_XXXX קראת לפונקציה?

    בשניהם.
    רק שב LTR זה מחזיר: Hello !עולם ,
    וב RTL זה מחזיר: , עולם! Hello



  • אני רואה שעשיתי טעות.
    חשבתי שבקטע RTL הפונקציה יביא סדר חזותי מימין לשמאל. למעשה לפי מה שאתה אומר זה מביא את הסדר משמאל לימין.

    יש דבר שאני לא מבין,
    @WWW אמר בPHP | חילוץ טקסט בעברית מקובץ PDF:

    במקור זה מופיע כך:
    Hello !םלוע ,

    למה? זה לא סדר וויזואלי, אולי זה הסדר של הרינדור ב-PDF? אתה יכול להעלות את ה-PDF?



  • @yossiz אמר בPHP | חילוץ טקסט בעברית מקובץ PDF:

    אולי זה הסדר של הרינדור ב-PDF?

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


  • תכנות

    @dovid @yossiz בסוף הסתדרתי ב"ה.
    במקום להשתמש בספריה pdfparser.
    התקנתי את pdftotext בלינוקס ומימשתי בעצמי פקודת shell אל /usr/bin/pdftotext.
    וב"ה זה עובד טוב! בלי להפוך תווים וכו'.

    עדיין יש קצת בעיות עם תווים בלתי מזוהים.


  • תכנות

    @WWW אמר בPHP | חילוץ טקסט בעברית מקובץ PDF:

    עדיין יש קצת בעיות עם תווים בלתי מזוהים.

    גם עם זה הסתדתי ב"ה, עם זה: https://stackoverflow.com/a/3466049

    /**
     * Removes invalid XML
     *
     * @access public
     * @param string $value
     * @return string
     */
    function stripInvalidXml($value)
    {
        $ret = "";
        $current;// למחוק גורם לשגיאה.
        if (empty($value)) 
        {
            return $ret;
        }
    
        $length = strlen($value);
        for ($i=0; $i < $length; $i++)
        {
            $current = ord($value{$i});
            if (($current == 0x9) ||
                ($current == 0xA) ||
                ($current == 0xD) ||
                (($current >= 0x20) && ($current <= 0xD7FF)) ||
                (($current >= 0xE000) && ($current <= 0xFFFD)) ||
                (($current >= 0x10000) && ($current <= 0x10FFFF)))
            {
                $ret .= chr($current);
            }
            else
            {
                $ret .= " ";
            }
        }
        return $ret;
    }
    

  • תכנות

    @WWW בינתיים מצאתי קובץ אחד שזה לא מוציא את רוב הטקטס.
    מדובר בקובץ שנוצר ע"י וורד עם התוסף החינמי של חלון ומרכוז שורה אחרונה, ב2 טורים.
    הוא מוציא רק את הכותרות.



  • @WWW תוכל להעלות קובץ דוגמה?


  • תכנות

    @yossiz לשלוח ל יוסי@xn--eeb0a.xn--9dbq2a ?


התחבר כדי לפרסם תגובה