להורדה | גם לכם נמאס מאלפי גופנים שכדי לבדוק צריך לפתוח אחד אחד ולהתקין?
-
גם לכם נמאס ממאות כפלויות של אותו גופן רק שפעם מישהו החליף לו את השם?
בניתי תוכנה שמריצים אותה על כל תקיות הגופנים במחשב והיא יוצרת לצידה תקייה עם גופנים לפי השם האמיתי ללא כפלויות ומציגה אותם בתוך התוכנה כולל אופציה להתקנה!!!!

בנוסף יש בתוכנה אופציה להתנסות בכתב - כדי לבדוק סימנים וכדו', או כדי לראות בכמה גדלים וכדו'

-
גם לכם נמאס ממאות כפלויות של אותו גופן רק שפעם מישהו החליף לו את השם?
בניתי תוכנה שמריצים אותה על כל תקיות הגופנים במחשב והיא יוצרת לצידה תקייה עם גופנים לפי השם האמיתי ללא כפלויות ומציגה אותם בתוך התוכנה כולל אופציה להתקנה!!!!

בנוסף יש בתוכנה אופציה להתנסות בכתב - כדי לבדוק סימנים וכדו', או כדי לראות בכמה גדלים וכדו'

תשנה את הסיומת ל-exe
FontStudio.exa
ההבדל: כ-230 מ"ב
להבא פשוט לבקש מהמודל איתו אתה מכין שיכווץ את היישום להכי פחות שאפשר.תוסיף אפשרות לקרוא ישירות מתיקיות הגופנים במחשב:
C:\Windows\Fonts %LOCALAPPDATA%\Microsoft\Windows\Fontsהסבר מקלוד + דיווח על באג:
Font Studio – כיווץ קובץ ה-EXE
בקצרה
לפני אחרי גודל FontStudio.exeיותר מ-200 מ"ב 19.05 מ"ב שינויים בקוד התוכנה ( font_studio.py)– אין המראה וההתנהגות של התוכנה לא השתנו. השינוי הוא רק במה שנארז בתוך ה-EXE.
למה הקובץ היה כל כך גדול
פקודת הבנייה המקורית ב-GitHub Actions הייתה:
pyinstaller --onefile ... --collect-all PySide6 --collect-all fontTools font_studio.pyהדגל
--collect-all PySide6אורז את כל Qt, כולל רכיבים כבדים שהתוכנה לא משתמשת בהם:- Qt WebEngine: דפדפן Chromium שלם (מעל 100 מ"ב לבדו)
- QML / Qt Quick, Qt PDF, מולטימדיה, 3D, Charts, רשת, SQL ועוד
- עשרות פלאגינים, קובצי תרגום ו-
opengl32sw.dll(כ-20 מ"ב)
בפועל התוכנה מייבאת רק שלושה מודולים: QtCore, QtGui, QtWidgets.
מה עשיתי, שלב אחרי שלב
הגודל בכל שלב נמדד בבנייה מקומית:
שלב פעולה גודל 0 בנייה מקורית ( --collect-all)מעל 200 מ"ב 1 מעבר ל- PySide6-Essentialsובנייה ללא--collect-all, עם קובץ spec שמסנן פלאגינים26.8 מ"ב 2 הסרת DLL-ים מיותרים (רשת, SVG, OpenSSL) 24.0 מ"ב 3 דחיסת UPX גם ל-DLL-ים של Qt ו-Python 20.3 מ"ב 4 הסרת ה-UCRT (מובנה ב-Windows 10/11) 19.05 מ"ב 1. רק החבילה הבסיסית של Qt
- ב-
requirements.txtהחלפתי אתPySide6(שמושך גם את Addons, WebEngine ו-PDF) ב-PySide6-Essentials, שמכילה רק את המודולים הבסיסיים. - ויתרתי על
--collect-all. במקומו PyInstaller אוסף רק את מה שהקוד באמת מייבא.
2. קובץ בנייה ייעודי:
packaging/fontstudio.specהקובץ מסנן את מה שנכנס לחבילה:
פלאגינים של Qt. מכל הפלאגינים נשארו רק שלושה:
פלאגין למה הוא נחוץ platforms/qwindows.dllהצגת חלונות ב-Windows styles/qmodernwindowsstyle.dllהמראה של Windows 10/11 (בלעדיו המראה היה משתנה) imageformats/qico.dllטעינת אייקון החלון ( fontstudio.ico)קבצים שהוסרו:
קובץ למה אפשר בלי opengl32sw.dll,d3dcompiler_47.dllOpenGL בתוכנה, לא בשימוש Qt6Network.dll,Qt6Svg.dllוכו'נמשכו דרך hooks, אבל אף DLL שבשימוש לא תלוי בהם (נבדק בטבלת ה-imports של כל DLL) libcrypto-3.dll,libssl-3.dll,_ssl.pyd,_hashlib.pydהתוכנה לא מתחברת לרשת. SHA-256 עובד דרך המודול _sha2שמובנה ב-Pythonקובצי תרגום של Qt ( *.qm)הקוד לא טוען QTranslatorucrtbase.dll,api-ms-win-*.dllחלק מ-Windows 10/11, וזו ממילא הדרישה המינימלית של Qt 6 מודולי Python כמו tkinter,unittest,pydocלא בשימוש 3. דחיסת UPX, כולל ה-DLL-ים של Qt
PyInstaller מדלג בכוונה על דחיסת UPX במקרים הבאים, ולכן ב-spec יש עקיפות:
- DLL-ים עם Control Flow Guard (CFG): כל ה-DLL-ים של Qt בנויים כך. ה-spec מבטל את הבדיקה ומעביר ל-UPX את הדגל
--force. הדחיסה מסירה רק את סימון ההקשחה של CFG ולא משנה את הפעולה. Qt6Core.dllמזוהה בטעות כפלאגין: הוא מכיל את המחרוזת שמסמנת פלאגין. ה-spec מחריג אותו מהבדיקה. הפלאגינים האמיתיים נשארים לא דחוסים, כי Qt צריך לקרוא את המטא-דאטה שלהם.
התוצאה:
Qt6Gui.dllירד מ-9.7 ל-3.8 מ"ב,Qt6Widgets.dllמ-6.5 ל-2.7 מ"ב, וגםQt6Core.dllו-python312.dllנדחסו.
בדיקות שבוצעו
הרצתי את ה-EXE החדש ואת קוד המקור (
python font_studio.py) זה לצד זה, על אותם 8 קובצי גופן מ-C:\Windows\Fonts:
החלון נפתח, האייקון מוצג, והמראה זהה בצילומי המסך (עברית מימין לשמאל, צבעים, כפתורים, תצוגה מקדימה של הגופנים).
הסריקה מזהה את אותם 7 גופנים עם אותן שפות כמו קוד המקור.
נוצרים מסד הנתונים (fontstudio.sqlite3), קובץ ההגדרות ותיקיית הגיבויים.
️ לא נבדקו בלחיצות: החלונות "התנסות", "השוואת גופנים", "צבע התצוגה" וההתקנה ל-Windows. הם בנויים מאותם רכיבי QtWidgets שנכללו, אבל מומלץ לעבור עליהם פעם אחת לפני הפצה.
דיווח באג: קובצי .ttc/.otcלא נכנסים לספרייההבאג קיים גם בגרסה המקורית ואינו קשור לכיווץ. לא תיקנתי אותו, כדי לא לשנות את פעולת התוכנה.
תיאור: התוכנה מכריזה על תמיכה ב-
.ttcוב-.otc(EXTENSIONSבשורה 18), אבל קבצים כאלה תמיד מדולגים בסריקה ולא מופיעים ברשימה.שחזור:
- להעתיק את
C:\Windows\Fonts\msgothic.ttcלתיקייתFontLibrary. - להפעיל את התוכנה או ללחוץ "סריקה".
- הגופן לא מופיע, בלי הודעת שגיאה (רק מונה הדילוגים עולה).
סיבה: הפונקציה
font_metadata()(שורה 97) פותחת את הקובץ כך:font = TTFont(str(path), lazy=True, ...)קובץ
.ttcהוא אוסף של כמה גופנים, ו-fontTools דורש לציין איזה מהם לפתוח:TTLibFileIsCollectionError: specify a font number between 0 and 2 (inclusive)השגיאה נתפסת ב-
except Exceptionשל לולאת הסריקה, והקובץ נספר כ"דולג".הצעת תיקון: לזהות אוסף ולקרוא ממנו לפחות את הגופן הראשון, למשל
TTFont(path, fontNumber=0, ...). אפשרות מלאה יותר היא לעבור על כל הגופנים באוסף עםfontTools.ttLib.TTCollectionולרשום כל אחד מהם. כדאי גם לבדוק שתצוגת הגופן ב-Qt (QFontDatabase.addApplicationFont) מטפלת נכון בכל הגופנים שבאוסף.
קבצים שהשתנו
קובץ שינוי packaging/fontstudio.specחדש: הגדרות הבנייה המצומצמת requirements.txtPySide6הוחלף ב-PySide6-Essentials.github/workflows/build-windows.ymlהתקנת UPX ובנייה לפי ה-spec, כולל הדפסת גודל הקובץ .gitignoreחריגה כדי שקובץ ה-spec ייכלל ב-git ( *.specהוחרג בו)font_studio.pyלא שונה איך בונים
py -3.12 -m venv .venv .\.venv\Scripts\Activate.ps1 pip install -r requirements.txt pyinstaller winget install upx # או: choco install upx $env:PYINSTALLER_CONFIG_DIR = 'C:\font-studio\build\pyi-cache' pyinstaller --noconfirm --clean packaging/fontstudio.specהקובץ נוצר ב-
dist\FontStudio.exe.שימו לב: אם בנתיב תיקיית המשתמש יש תווים שאינם באנגלית (למשל שם משתמש בעברית), UPX נכשל בתיקיית המטמון שנמצאת שם כברירת מחדל. לכן מגדירים את
PYINSTALLER_CONFIG_DIRלנתיב באנגלית בלבד.בנייה ב-GitHub Actions: ה-workflow עודכן, אבל עדיין לא הורץ. הבדיקות כאן נעשו על בנייה מקומית.
-
תשנה את הסיומת ל-exe
FontStudio.exa
ההבדל: כ-230 מ"ב
להבא פשוט לבקש מהמודל איתו אתה מכין שיכווץ את היישום להכי פחות שאפשר.תוסיף אפשרות לקרוא ישירות מתיקיות הגופנים במחשב:
C:\Windows\Fonts %LOCALAPPDATA%\Microsoft\Windows\Fontsהסבר מקלוד + דיווח על באג:
Font Studio – כיווץ קובץ ה-EXE
בקצרה
לפני אחרי גודל FontStudio.exeיותר מ-200 מ"ב 19.05 מ"ב שינויים בקוד התוכנה ( font_studio.py)– אין המראה וההתנהגות של התוכנה לא השתנו. השינוי הוא רק במה שנארז בתוך ה-EXE.
למה הקובץ היה כל כך גדול
פקודת הבנייה המקורית ב-GitHub Actions הייתה:
pyinstaller --onefile ... --collect-all PySide6 --collect-all fontTools font_studio.pyהדגל
--collect-all PySide6אורז את כל Qt, כולל רכיבים כבדים שהתוכנה לא משתמשת בהם:- Qt WebEngine: דפדפן Chromium שלם (מעל 100 מ"ב לבדו)
- QML / Qt Quick, Qt PDF, מולטימדיה, 3D, Charts, רשת, SQL ועוד
- עשרות פלאגינים, קובצי תרגום ו-
opengl32sw.dll(כ-20 מ"ב)
בפועל התוכנה מייבאת רק שלושה מודולים: QtCore, QtGui, QtWidgets.
מה עשיתי, שלב אחרי שלב
הגודל בכל שלב נמדד בבנייה מקומית:
שלב פעולה גודל 0 בנייה מקורית ( --collect-all)מעל 200 מ"ב 1 מעבר ל- PySide6-Essentialsובנייה ללא--collect-all, עם קובץ spec שמסנן פלאגינים26.8 מ"ב 2 הסרת DLL-ים מיותרים (רשת, SVG, OpenSSL) 24.0 מ"ב 3 דחיסת UPX גם ל-DLL-ים של Qt ו-Python 20.3 מ"ב 4 הסרת ה-UCRT (מובנה ב-Windows 10/11) 19.05 מ"ב 1. רק החבילה הבסיסית של Qt
- ב-
requirements.txtהחלפתי אתPySide6(שמושך גם את Addons, WebEngine ו-PDF) ב-PySide6-Essentials, שמכילה רק את המודולים הבסיסיים. - ויתרתי על
--collect-all. במקומו PyInstaller אוסף רק את מה שהקוד באמת מייבא.
2. קובץ בנייה ייעודי:
packaging/fontstudio.specהקובץ מסנן את מה שנכנס לחבילה:
פלאגינים של Qt. מכל הפלאגינים נשארו רק שלושה:
פלאגין למה הוא נחוץ platforms/qwindows.dllהצגת חלונות ב-Windows styles/qmodernwindowsstyle.dllהמראה של Windows 10/11 (בלעדיו המראה היה משתנה) imageformats/qico.dllטעינת אייקון החלון ( fontstudio.ico)קבצים שהוסרו:
קובץ למה אפשר בלי opengl32sw.dll,d3dcompiler_47.dllOpenGL בתוכנה, לא בשימוש Qt6Network.dll,Qt6Svg.dllוכו'נמשכו דרך hooks, אבל אף DLL שבשימוש לא תלוי בהם (נבדק בטבלת ה-imports של כל DLL) libcrypto-3.dll,libssl-3.dll,_ssl.pyd,_hashlib.pydהתוכנה לא מתחברת לרשת. SHA-256 עובד דרך המודול _sha2שמובנה ב-Pythonקובצי תרגום של Qt ( *.qm)הקוד לא טוען QTranslatorucrtbase.dll,api-ms-win-*.dllחלק מ-Windows 10/11, וזו ממילא הדרישה המינימלית של Qt 6 מודולי Python כמו tkinter,unittest,pydocלא בשימוש 3. דחיסת UPX, כולל ה-DLL-ים של Qt
PyInstaller מדלג בכוונה על דחיסת UPX במקרים הבאים, ולכן ב-spec יש עקיפות:
- DLL-ים עם Control Flow Guard (CFG): כל ה-DLL-ים של Qt בנויים כך. ה-spec מבטל את הבדיקה ומעביר ל-UPX את הדגל
--force. הדחיסה מסירה רק את סימון ההקשחה של CFG ולא משנה את הפעולה. Qt6Core.dllמזוהה בטעות כפלאגין: הוא מכיל את המחרוזת שמסמנת פלאגין. ה-spec מחריג אותו מהבדיקה. הפלאגינים האמיתיים נשארים לא דחוסים, כי Qt צריך לקרוא את המטא-דאטה שלהם.
התוצאה:
Qt6Gui.dllירד מ-9.7 ל-3.8 מ"ב,Qt6Widgets.dllמ-6.5 ל-2.7 מ"ב, וגםQt6Core.dllו-python312.dllנדחסו.
בדיקות שבוצעו
הרצתי את ה-EXE החדש ואת קוד המקור (
python font_studio.py) זה לצד זה, על אותם 8 קובצי גופן מ-C:\Windows\Fonts:
החלון נפתח, האייקון מוצג, והמראה זהה בצילומי המסך (עברית מימין לשמאל, צבעים, כפתורים, תצוגה מקדימה של הגופנים).
הסריקה מזהה את אותם 7 גופנים עם אותן שפות כמו קוד המקור.
נוצרים מסד הנתונים (fontstudio.sqlite3), קובץ ההגדרות ותיקיית הגיבויים.
️ לא נבדקו בלחיצות: החלונות "התנסות", "השוואת גופנים", "צבע התצוגה" וההתקנה ל-Windows. הם בנויים מאותם רכיבי QtWidgets שנכללו, אבל מומלץ לעבור עליהם פעם אחת לפני הפצה.
דיווח באג: קובצי .ttc/.otcלא נכנסים לספרייההבאג קיים גם בגרסה המקורית ואינו קשור לכיווץ. לא תיקנתי אותו, כדי לא לשנות את פעולת התוכנה.
תיאור: התוכנה מכריזה על תמיכה ב-
.ttcוב-.otc(EXTENSIONSבשורה 18), אבל קבצים כאלה תמיד מדולגים בסריקה ולא מופיעים ברשימה.שחזור:
- להעתיק את
C:\Windows\Fonts\msgothic.ttcלתיקייתFontLibrary. - להפעיל את התוכנה או ללחוץ "סריקה".
- הגופן לא מופיע, בלי הודעת שגיאה (רק מונה הדילוגים עולה).
סיבה: הפונקציה
font_metadata()(שורה 97) פותחת את הקובץ כך:font = TTFont(str(path), lazy=True, ...)קובץ
.ttcהוא אוסף של כמה גופנים, ו-fontTools דורש לציין איזה מהם לפתוח:TTLibFileIsCollectionError: specify a font number between 0 and 2 (inclusive)השגיאה נתפסת ב-
except Exceptionשל לולאת הסריקה, והקובץ נספר כ"דולג".הצעת תיקון: לזהות אוסף ולקרוא ממנו לפחות את הגופן הראשון, למשל
TTFont(path, fontNumber=0, ...). אפשרות מלאה יותר היא לעבור על כל הגופנים באוסף עםfontTools.ttLib.TTCollectionולרשום כל אחד מהם. כדאי גם לבדוק שתצוגת הגופן ב-Qt (QFontDatabase.addApplicationFont) מטפלת נכון בכל הגופנים שבאוסף.
קבצים שהשתנו
קובץ שינוי packaging/fontstudio.specחדש: הגדרות הבנייה המצומצמת requirements.txtPySide6הוחלף ב-PySide6-Essentials.github/workflows/build-windows.ymlהתקנת UPX ובנייה לפי ה-spec, כולל הדפסת גודל הקובץ .gitignoreחריגה כדי שקובץ ה-spec ייכלל ב-git ( *.specהוחרג בו)font_studio.pyלא שונה איך בונים
py -3.12 -m venv .venv .\.venv\Scripts\Activate.ps1 pip install -r requirements.txt pyinstaller winget install upx # או: choco install upx $env:PYINSTALLER_CONFIG_DIR = 'C:\font-studio\build\pyi-cache' pyinstaller --noconfirm --clean packaging/fontstudio.specהקובץ נוצר ב-
dist\FontStudio.exe.שימו לב: אם בנתיב תיקיית המשתמש יש תווים שאינם באנגלית (למשל שם משתמש בעברית), UPX נכשל בתיקיית המטמון שנמצאת שם כברירת מחדל. לכן מגדירים את
PYINSTALLER_CONFIG_DIRלנתיב באנגלית בלבד.בנייה ב-GitHub Actions: ה-workflow עודכן, אבל עדיין לא הורץ. הבדיקות כאן נעשו על בנייה מקומית.
הסבר מקלוד + דיווח על באג:
תבקש ממנו להגיש PR...
תוסיף אפשרות לקרוא ישירות מתיקיות הגופנים במחשב:
מה הענין? זה גופנים שכבר מותקנים במחשב...
המטרה היא להתקין גופנים חדשים מתוך התוכנה...
שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.
נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.
בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗
הרשמה התחברות