ברוך ה' !
העצות הועילו ואכן היה חסר סגירה של הZIP כיון שהבקוד שפורסם יש סגירה רק בסוף כל פונקציה אבל מה שקורה שפעמים הוא יוצא מהפונקציה כבר באמצע בלא לסגור וכך הוא נשאר פתוח.
תודה רבה לכולם!!
פורסם במקור בפורום CODE613 ב25/07/2013 18:32 (+03:00)
ברוך ה' !
העצות הועילו ואכן היה חסר סגירה של הZIP כיון שהבקוד שפורסם יש סגירה רק בסוף כל פונקציה אבל מה שקורה שפעמים הוא יוצא מהפונקציה כבר באמצע בלא לסגור וכך הוא נשאר פתוח.
תודה רבה לכולם!!
פורסם במקור בפורום CODE613 ב25/07/2013 18:32 (+03:00)
הנה הפרוייקט המקורי כפי שפורסם:
DocxToText_demo.zip
הקוד הוא מאוד פשוט וקצר אני מקווה שתגלו בקלות מה מונע את וורד לפתוח את הקובץ לעריכה.
תבורכו מפי עליון!
פורסם במקור בפורום CODE613 ב25/07/2013 17:13 (+03:00)
@דוד ל.ט.
הנה קוד מעודכן למה שביקשת:
Dim Doc = Packaging.WordprocessingDocument.Open(filename, False) Dim tb As New Text.StringBuilder For Each P In Doc.MainDocumentPart.Document.Elements(Of Wordprocessing.Paragraph)() tb.Append(P.InnerText) tb.Append(vbCrLf) Next Doc.Close() Return tb.ToString()
משום מה הקוד הזה לא עובד הוא לא מזהה שום פיסקה במסמך, מה גם שה DLL שלו הוא חמש מגה! וכעת אני מחלץ את הטקסט מוורד ואקסל בפחות מ300 KB
פורסם במקור בפורום CODE613 ב25/07/2013 16:56 (+03:00)
@דוד ל.ט.
לדעתי הבעיה היא לא קובץ בשימוש, אלא סימון כסופי וכדומה.
כוונתך שהמסמך הוורד מסומן כסופי? אבל הוא לא מסומן, והראיה שאחרי סגירת תוכנית חילוץ הטקסט הקובץ נפתח לעריכה כרגיל.
@דוד ל.ט.
אתה יכול לבדוק זאת בקלות ע"י השוואת שני ה"חבילות" (הקבצים אחרי פתיחת ZIP).
לא הבנתי למה כוונתך.
@דוד ל.ט.
ככלל, כשיש ספק אם בעיה מסויימת היא עקב שימוש של יישום אחר, העתקה של הקובץ פותרת את הספק.
דווקא אפשר להעתיק קובץ וורד גם בזמן שהוא פתוח בוורד ע''י הפקודה File.Copy. וכאשר אני רוצה לחלץ טקסט מקובץ וורד שפתוח בוורד אני לא יכול לפתוח אותו עם ספריית ZIP הנ''ל כי הוא מוציא שגיאה שהקובץ בשימוש ואז אני קודם מעתיק אותו לקובץ זמני ואז את הזמני אני פותח עם ZIP.
@דוד ל.ט.
אבל, וה"אבל" הזה גדול, אני לא מבין מה ההוא מCodeproject יותר טוב מהשימוש בOpen XML.
הקוד שלו נותן לך טקסט עם חלוקה לפסקאות אבל אם אתה תקח רק את ה Document.InnerText אתה תקבל את כל המילים דבוקות. דבר שהקוד שלו לא נותן זה הטקסט של ההערות שוליים והערות הסיום אבל את זה אני כבר הוספתי לבד.
אגב על אותה הדרך כתבתי קלאס שמחלץ טבלאות/גליונות מתוך xlsx
פורסם במקור בפורום CODE613 ב25/07/2013 15:53 (+03:00)
לא ראיתי את כל הקוד ממש ואני גם לא יודע באיזו פונקציה אתה משתמש, אבל בכל אופן, צריך שיהיה באופן מפורש פקודת Close שמתיחחסת ישירות למסמך הוורד, אחרת הוא עדיין טעון ובשימוש של אותה התוכנית, כך שלפי כללי windows אסור ש 2 תהליכים ישתמשו באותו קובץ לעריכה, ועל כן הוא נפתח לקריאה בלבד.
בהצלחה.
תודה.
כיון שקובץ docx הוא בעצם ZIP משתמשים שם ב ספריה ICSharpCode.SharpZipLib.Zip
ואכן יש שם פקודה של Close לאחר כל שימוש בספריה זו.
יש פה עובדה מעניינת:
אם הקובץ כבר פתוח בוורד ואני בא לחלץ את הטקסט שלו אי אפשר לפתוח אותו עם הספריה הנ''ל והוא מודיע שקובץ בשימוש, אבל אם הקובץ לא פתוח בשום מקום ועשיתי לו חילוץ ושוב חילוץ זה עובד ואין הודעת שגיאה שהקובץ תפוס כלומר שהחילוץ הראשון לא השאיר את הקובץ תפוס אלא סגר אותו ולכן אפשר לחלץ שוב. אבל כאשר פותחים את הקובץ אחר החילוץ בוורד הוא נפתח לקריאה בלבד כאילו הקובץ תפוס, וגם וורד לא שואל כלל אם לפתוח לקריאה בלבד כמו שהוא נוהג כאשר הקובץ בשימוש אלא מיד פותח לקריאה בלבד.
אודה לכם מאוד אם תעיינו בקוד הוא מאוד מאוד פשוט, רק צריך מומחה שיתפוס את הנקודה אם זו בעיה בקוד או בספריית ה ZIP או אולי בוורד עצמו.
פורסם במקור בפורום CODE613 ב25/07/2013 13:34 (+03:00)
אני משתמש בתוכנית המפורסמת כאן כדי לחלץ את הטקסט שבמסמכי וורד:
http://www.codeproject.com/Articles/20529/Using-DocxToText-to-Extract-Text-from-DOCX-Files
אך לאחר שהתוכנית מחלצת את המסמך ומציגה רק את הטקסט שלו - אם פותחים את המסמך בוורד הוא נפתח לקריאה בלבד, אע''פ שהתוכנית כבר לא משתמשת במסמך כלל, ורק לאחר סגירת התוכנית אפשר לפתוח את המסמך בוורד לעריכה.
מישהו מוכן לעיין בקוד של התוכנית ולאמר לי מדוע זה קורא ואיך אפשר למנוע את זה?
תודה רבה!
פורסם במקור בפורום CODE613 ב24/07/2013 20:22 (+03:00)
HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Excel\File MRU
מה שנראה שכל תוכנה מחזיקה ערכים ברג'יסטרי
ניסיתי למחוק מפתחות משנה של המפתח שציינת אבל זה מוחק פריטים מהרשימה של הקבצים האחרונים שמופיעה בתוך אקסעל בתפריט קובץ, אבל לא מהרשימה הקופצת היא נשאר כמו שהיתה.
פורסם במקור בפורום CODE613 ב20/07/2013 23:46 (+03:00)
כאשר לוחצים עם הימני של העכבר בשורת המשימות על האייקון של וורד או אקסל וכו' קופצת רשימה של קבצים שנפתחו לאחורנה, מישהו יודע היכן שמורה רשימה זו ? ברצוני לגשת לשם ולמיין ו/או להסיר קיצורים מהרשימה זו בדרך תיכנותית.
תודה.
פורסם במקור בפורום CODE613 ב18/07/2013 21:34 (+03:00)
@דוד ל.ט.
זה לא בדיוק מה שהצעתי לעיל?
לא כ''כ הבנתי מה כתבת על סטיית תקן, אם התכוונת לבדיקת צבעם של פיקסילים שכנים אז ברוך שכיוונתי.
פורסם במקור בפורום CODE613 ב21/07/2013 14:30 (+03:00)
הנה ניתוח חדש:
לפי מה שאני הבנתי היסטוגרמה היא מבנה של קוים עומדים 64 במספר, כל קו עומד הוא כנגד צבע אחר, גובה הקו נקבע ע''פ כמות של אותו צבע בתמונה כולה ולכן בתמונה של השחור לבן ראינו את הקו הראשון שמיצג את הצבע שחור גבוה עד למעלה כיון שיש הרבה צבע שחור בתמונה, וכל שאר הקווים הם על 0 כיון שאין צבעים אחרים כלל, והקו האחרן הוא קטן כיון שהוא מיצג את הצבע הלבן ואותו יש מעט.
עוד נתון: ההבדל בין תמונה לצילום הוא שבצילום יש הרבה צבעים שונים ותמונה לא, אבל מבחינת כמות עבור כל צבע אין הבדל ברור בין צילום לתמונה.
א''כ המסקנה העולה היא שכדי להבדיל בין תמונה לצילום צריך לעבור על המערך ולבדוק כמה צבעים נמצאים על כמות אפס, אם הם רבים הרי שאין הרבה צבעים שונים וזו תמונה אם אין כמעט איברים במערך שערכם 0 הרי שזה צילום, ואין צורך להתיחס לאורך הקו אלא רק אם הוא גדול מ0 או לא.
אבל עדיין לא נראה שזה יתן תוצאות נכונות בכל מקרה, לדעתי כדי להבדיל בין תמונה לצילום לא תועיל היסטוגרמה אלא צריך לעבור כל כל הפיקסילים או על כמות מדגמית ולראות כמה פעמים הצבע משתנה מפיקסיל לפיקסיל, כלומר האם רוב הפעמים פיקסיל נתון שווה בצבעו לפיקסיל השכן, או שרוב הפעמים פקסילים שכנים שונים זה מזה בצבעם.
פורסם במקור בפורום CODE613 ב21/07/2013 12:31 (+03:00)
עכשיו אני מקבל את זה בצורת מערך של 64 אברים שכל אבר מכיל ערך לדוגמא מ 0 עד 1. כל אבר מיצג בתמונה קו ואם הוא 100 הקו מופיע עד למעלה ואם הוא 0 הוא לא מופיע בכלל ואם הוא 0.5 הוא מופיע חצי וכן הלאה.
איך אני יכול לקבוע כלל שיהיה אפשר לפי המערך להבדיל בין תמונה מצולמת לתמונה מצויירת.
חשב את הממוצע של כל האברים במערך אם הממוצע מעל 50 בוודאי שזה מצולם ואם פחות מ 10 בוודאי שזה ציור.
וכמובן ממוצע זה חיבור של כל האיברים לחלק במספר האיברים.
פורסם במקור בפורום CODE613 ב18/07/2013 16:40 (+03:00)
תודה רבה על ההסבר המפורט ,
אבל אני מתרשם שאם אני בונה תוכנה שלא אמורה לתת חויה חזותית מרשימה במיוחד אין צורך ב WPF ולגבי חיסכון בקוד ראיתי שבסופו של דבר ההוראה שרוחב תיבת הטקסט ישתנה בהתאם לסלייד נמצאת ב XAML במקום בתוך קלאס של החלון כמו ב-WFA, אז מה הרווחנו? בפרט שאת הקוד ב XAML אי אפשר להקליק עם העכבר בחלון המאפיינים אלא צריך ללמוד תחביר חדש של XAML ולרשום את ההוראה בתוך ה XAML.
עוד דבר כשיש איזו שגיאה בהוראה שנתת לפקדים בתוך ה XAML איך אתה בודק את זה ? איך אתה יודע בדיוק באיזה שלב יש את הבאג, ומה הערך של כל דבר בכל שלב? אבל אם זה קוד אתה עובר עם הדבאגר ורואה הכל.
עוד דבר שרציתי להבין מדוע הכל יושב על ה Grid למה אי אפשר שהכל ישב על ה Window בעצמו ?
אודה לך אם תפרט על עוד יתרונות של WPF לאומת WFA.
פורסם במקור בפורום CODE613 ב18/07/2013 08:26 (+03:00)
פעם ראשונה שאני שומע על WFA מה זה מי זה מו זה??? לינקים הסברים???
הכוונה ל:
Windows Forms Application
לגבי WPF זהו המודל הכי חכם שיש היום לניהול תצוגות טהורות, וקוד טהור, בלי לערבב אותם אחת עם השניה, אלא לתת להם רק לדבר זה עם זה.
יש בזה כזה יתרון גדול עד שהלכו ועשו מזה מסלול חדש לגמרי ?
החיסרון שלו הוא בכך שאינו אינטרנטי, ולא הייתי ממליץ לך ללמוד דבר חדש זולת אינטרנט.
WFA כן נחשב אינטרנטי ? עכ''פ מה כן נחשב אינטרנטי.
בהצלחה.
אמן! וכן למר.
פורסם במקור בפורום CODE613 ב18/07/2013 00:06 (+03:00)
אני רגיל לכתוב תוכנות ב WFA , אבל אני רואה שיש פה הרבה דיונים על WPF, האם יש ב WPF משהו מיוחד [חוץ מהעיצוב כמובן] לאומת WFA ?
כשאני רוצה לחליט אם לכתוב את התוכנה בזה או בזה אלו שיקולים אתם יכולים להציע לי לשקול?
פורסם במקור בפורום CODE613 ב17/07/2013 21:12 (+03:00)
אם ניסיתם פעם לכתוב ב C או C++ זה באמת כמו שויסמן אמר - אתה כותב שעה ובודק 2 שעות,
כיון שאין לך את כל הכלים שיש בדוטנט, כל ההתראות של גלישה מחוץ למערך וכדומה לא קיימות בשפות C ועוד שלל התראות, חיפוש של סימבולים והחלפת שמות סימבולים , ב- C אתה צריך לחשוב לבד על הקצאת זיכרון ולבד לדאוג לשחרר אותו דברים שבדוט נט קורים לבד מאחורי הקלעים, C היא שפה שאתה מנהל שם הכל לבד וזה המעלה שלה כי כך ניבנת תוכנה תפורה במדוייק לתפקיד שלה, וגם החיסרון כי הדבר לוקח הרבה זמן עבודה ובדיקות, ועוד המון דברים לא נתמכים כלל ב C לאומת דוט נט.
אבל בדוט נט אפשר לכתוב קוד נקי מהתחלה, אם לא מיד יושבים וכותבים אלא קמים מהמחשב מסתובבים קצת ומתכננים בראש מה המטרה? באילו דרכים אפשר להגיע אליה ? וכו' וכו'
פורסם במקור בפורום CODE613 ב17/07/2013 16:32 (+03:00)
לדעתי אפשר לעשות דבר פשוט:
הלולאה תעבור על כל המערך כלומר על כל המילון, אבל לפני שנבדוק האם המילה במילון מתאימה למילה עם הכוכביות קודם תבדוק אם האות הראשונה במילה במילון שווה לאות הראשונה במילה עם הכוכביות.
ניסיתי את זה ואכן זה מאוד מהיר והקוד קצר ופשוט.
פורסם במקור בפורום CODE613 ב07/07/2013 18:21 (+03:00)
כן, תודה רבה.
פורסם במקור בפורום CODE613 ב07/07/2013 13:11 (+03:00)
זהו שהקריאה מהמילון לא מתארכת כאשר מחפשים עם כוכבית או בלי אלא אם כן הכוכבית היא בתחילת המילה ואז צריך לעבור על כל המילון אבל אם הכוכבית באמצע המילה מחפשים רק באות הרלוונטית בלבד.
אלא מה שמתארך זה בשלב השני שמחפשים באינדקס ועבור כל מילה שנמצאה במילון צריך לעבור פעם אחת על הקובץ וזה לא כדאי כלל כאשר מדובר בכמה עשרות מילים, אלא עדיף לאתחל מערך מסוג שלי ואז הכל יותר מהיר, אבל הבעיה שאי אפשר לבנות שני אינדקסים אחד בשיטה שלי ואחד בשיטה שלך, אלא או את זה או את זה, בקיצור לא מצאתי דרך לשלב בין שתי השיטות.
פורסם במקור בפורום CODE613 ב07/07/2013 12:55 (+03:00)
מצאתי דבר מאוד מעניין כאשר אני משווה בין השיטה שלך לשלי:
בשיטה שלך מחפשים על קובץ האינדקס בעצמו ללא אתחול מערך זה ממש ממהר את החיפוש כאשר מחפשים 2-3 מילים ואז יוצא שצריך לעבור על כל הקובץ 2-3 פעמים וזה כמובן יותר מהר ב30% מלאתחל מערך מהקובץ.
אולם כאשר מחפשים הרבה מילים כמו בחיפוש עם כוכביות וכדומה שכל מילה שהמשתמש מקליד בשאילתא הופכת לכמה עשרות או מאות מילים, הרי שהחיפוש בשיטה שלך איטי פי 7 ! כי צריך לעבור על הקובץ מאות או עשרות פעמים וכמובן שלאתחל מערך זה יותר מהר.
אבל בשיטה של איתחול מערך אומנם בתחילה זה לוקח קצת זמן כדי לאתחלו אבל אחר שיש מערך וצריך רק לגשת לאיברים לכמה עשרות או מאות איברים ולקבל את כל המיקומים מוכנים אז כמעט אין הפרש בזמן בין חיפוש עם כוכביות או בלי , עם כוכביות זמן החיפוש עולה ב 10% בלבד.
אני מקווה שההסבר שלי מספיק מובן אבל בכל מקרה אלו עובדות שמתגלות כאשר אני משווה בין שתי התוכנות עם אותן השאילתות ועל אותם המאגרים ממש.
פורסם במקור בפורום CODE613 ב07/07/2013 11:52 (+03:00)
@דוד ל.ט.
[u:11abktml]ג. חיפוש תוך כדי הקריאה[/u:11abktml]
כשמחפשים לדוגמה את המילים: שלום {30} ברה {11} הצלה {22} שמח,
אז דבר ראשון נשיג מהמילון את קודי הזיהוי שלהם. לא בצורת מספר, אלא מספר מומר למערך בתים בגודל 4 (עדיף כבר במילון בזיכרון, אבל אם לא עכשיו).
דבר שני נעבור בלולאה של Stream על קובץ האינדקס שמורכב כאמור מסטים של ארבע ארבע בתים.
אז במהלך הלולאה שעוברת על בתי הקובץ (של האינדקס), לבדוק התאמה בין הקטע הנקרא כעת לבין אחד מאבעת הקודים אותם אנו מחפשים.
**[size=85:11abktml]אפשר לעשות את זה תוך כדי (שהקריאה לא תחכה לבדיקה, והבדיקה לא תחכה לקריאה) אבל זה כבר מורכב יותר. אם תאחז בזה אשמח להראות לך איך.[/size:11abktml]**אם נמצאה התאמה פותחים מונה שיבדוק את המרחק בין ההתאמה הזו לזו שאחריה, במידה וזה התאמה לא ראושנה נבדוק את המרחק ונחליט אם יש בהתאמה הוקדמת רלוונטיות לאור המרחק.בקשר לשאילתה שמרשה תווים מיוחדים כמו כוכבית זה מאוד קל ליישם זאת גם, אבל זה שלב נוסף.
טוב, בניתי את המילון והאינדקס כמו שאמרת כעת הגעתי לשלב הקריאה אז איך עושים שהקריאה לא תחכה לבדיקה, והבדיקה לא תחכה לקריאה ?
עוד דבר למעשה השאילתא קצת יותר מורכבת היא יכולה להראות כך:
+שלום/שפע# {30} ברה {11} הצלה/רווח {22} שמח/מאושר/עליז/רוקד
כאשר סימן הפלוס מיצג קידומות דיקדוקיות סימן הסולמית מיצג סיומות דיקדוקיות והקוים הנטויים כוונתו או מילה הזאת או הזאת וכו'.
בשיטה שלי הכל עובד מצויין איך עושים את זה בשיטה שלך?
פורסם במקור בפורום CODE613 ב05/07/2013 16:39 (+03:00)