דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. הדפסת קובץ PDF בפייתון (windows)

הדפסת קובץ PDF בפייתון (windows)

מתוזמן נעוץ נעול הועבר תכנות
14 פוסטים 5 כותבים 503 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • ה מנותק
    ה מנותק
    הפצת אנקי
    כתב ב נערך לאחרונה על ידי
    #1

    שאלה פשוטה עם תשובה מסובכת:
    אני מחפש דרך לשליחת קובץ pdf להדפסה שתעבוד ללא תלות בתוכנות המותקנות במחשב.
    יש את הדרך win32api:

    win32api.ShellExecute(0, "print", f, None,  ".",  0)
    

    החיסרון בזה- הוא עובד רק אם יש קורא PDF שיש לו api מתאים (כגון foxit). לא מתאים לי מכיון שזה מיועד לשימוש ציבורי והרבה אנשים משתמשים רק בedge כקורא pdf ואין לו את הapi המתאים.
    קראתי את המאמר הזה ולמעשה יצאתי בידיים ריקות...

    ניתן לקבל את התוכנה לזכירת הלימוד בכתובת מייל 3422973@gmail.com
    הודעה זמנית: לעת עתה אנו מנסים לארגן מסע פרסום לתוכנה כדי שכלל הלומדים יוכלו לחזור בקלות על לימודם. תרומות בקישור: https://nedar.im/lGvN

    M yossizY 3 תגובות תגובה אחרונה
    0
    • M מנותק
      M מנותק
      mekev
      השיב להפצת אנקי ב נערך לאחרונה על ידי
      #2

      @הפצת-אנקי
      גילוי נאות: אינני מכיר את פייתון כלל

      אשקף את הבנתי מהשאלה
      הינך מעוניין שלחיצה על 'הדפס' תשלח ישירות את הקובץ להדפסה
      במדפסת ברירת מחדל של המשתמש

      ראה כאן

      (חיפוש בגוגל: Python how to print file directly to default printer)

      dovidD תגובה 1 תגובה אחרונה
      0
      • dovidD מנותק
        dovidD מנותק
        dovid ניהול
        השיב לmekev ב נערך לאחרונה על ידי dovid
        #3

        @mekev וזה עובד "רק אם יש קורא PDF שיש לו api מתאים (כגון foxit)."
        השאלה אכן לא קשורה לפייתון, אם תמצא דרך בC# קרוב לודאי שהוא יצליח לחקות אותה בפייתון.

        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

        בכל נושא אפשר ליצור קשר dovid@tchumim.com

        M תגובה 1 תגובה אחרונה
        1
        • M מנותק
          M מנותק
          mekev
          השיב לdovid ב נערך לאחרונה על ידי mekev
          #4

          @dovid
          בc#
          להדפסת קובץ ספציפי אני כותב כך:

          var printfiil = new ProcessStartInfo(@"d:\SH22041640.pdf");
                      printfiil.UseShellExecute = true;
                      printfiil.Verb = "print";
                      var process = System.Diagnostics.Process.Start(printfiil);
          
          yossizY תגובה 1 תגובה אחרונה
          1
          • yossizY מנותק
            yossizY מנותק
            yossiz
            השיב לmekev ב נערך לאחרונה על ידי
            #5

            @mekev זה שוה לשורת הפייתון שהשואל הביא

            📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

            תגובה 1 תגובה אחרונה
            2
            • yossizY מנותק
              yossizY מנותק
              yossiz
              השיב להפצת אנקי ב נערך לאחרונה על ידי yossiz
              #6

              @הפצת-אנקי אין תמיכה מובנית בווינדוס להדפסת PDF.
              אם זה היה קובץ XPS או קובץ EMF אולי המצב היה שונה, נראה לי שבשני המקרים האלו היה לך אפשרות לשלוח ישירות למדפסת כי זה פורמט שווינודס מבין
              אבל במקרה של קובץ PDF זה קופסה שחורה עבור ווינדוס וצריך קודם להמיר אותו למשהו שווינדוס או המדפסת מבינים.
              אם זה משהו שווינדוס מבין הוא יודע לתרגם את זה לשפה של המדפסת, ואם המדפסת מבין, אז אפשר לשלוח את זה ישירות למדפסת
              אבל במקרה הזה שלא ווינדוס ולא המדפסת מבינים את הפורמט, חייבים תוכנה באמצע לתרגם
              האפשרות היחידה שאני רואה פה זה ספריית פייתון שיודע לרנדר PDF, ואז אולי כמו שהוא ידע לרנדר אותו למסך הוא גם יתן לך API לרנדר למדפסת

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

              📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

              WWWW תגובה 1 תגובה אחרונה
              5
              • M מנותק
                M מנותק
                mekev
                השיב להפצת אנקי ב נערך לאחרונה על ידי mekev
                #7

                @הפצת-אנקי
                מקווה שאני לא 'מספים' לך את השאלה המקורית

                לפי דברי @yossiz
                אולי ניתן לעשות מיד אחרי הלחיצה - בדיקה האם מותקן במחשב מדפסת PDF
                (יוצא מתוך הנחה שכל מדפסת PDF מופיע בשם המדפסת האותיות PDF)

                במידה וקיים - תדפיס ישירות כדלעיל
                במידה ולא קיים - תציע למשתמש התקנה של מדפסת PDF כלשהיא

                yossizY תגובה 1 תגובה אחרונה
                1
                • yossizY מנותק
                  yossizY מנותק
                  yossiz
                  השיב לmekev ב נערך לאחרונה על ידי yossiz
                  #8

                  @mekev אני לא חושב שיעזור פה מדפסת PDF
                  א. בד״כ הם רשומים במערכת כמדפסות postscript והם ממירים את ה-postscript שווינדוס שולח להם ל-PDF, אני לא חושב שאפשר לשלוח להם ישירות קבצי PDF, וגם אלה שלא עובדים כמדפסות postscript - כמו זה של pdfXchange מכל מקום מסופקני מאוד אם הם יסכימו לקבל קובץ PDF
                  ב. גם אם הם יקבלו קובץ pdf הם יפלטו קובץ pdf אבל השואל רוצה להדפיס למדפסת נייר.

                  האם לא הבנתי את הצעתך בצורה נכונה?

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

                  📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                  תגובה 1 תגובה אחרונה
                  3
                  • WWWW מנותק
                    WWWW מנותק
                    WWW
                    השיב לyossiz ב נערך לאחרונה על ידי
                    #9

                    @yossiz כתב בהדפסת קובץ PDF בפייתון (windows):

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

                    מה עם XPS?

                    WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

                    yossizY תגובה 1 תגובה אחרונה
                    1
                    • yossizY מנותק
                      yossizY מנותק
                      yossiz
                      כתב ב נערך לאחרונה על ידי yossiz
                      #10

                      @הפצת-אנקי מה באמת המטרה שלך? למה אתה רוצה לתת אפשרות להדפיס קובץ בלי להציג אותו? ואם אתה מציג אותו אז התוכנה שמציגה נותנת בד״כ אפשרות להדפיס ג״כ

                      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                      ה תגובה 1 תגובה אחרונה
                      2
                      • yossizY מנותק
                        yossizY מנותק
                        yossiz
                        השיב לWWW ב נערך לאחרונה על ידי
                        #11

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

                        📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                        תגובה 1 תגובה אחרונה
                        2
                        • yossizY מנותק
                          yossizY מנותק
                          yossiz
                          כתב ב נערך לאחרונה על ידי yossiz
                          #12

                          @WWW אם כבר, אז התעוררתי בדבריך שלכאורה אפשר להשתמש ב-ghostscript להמיר ל-emf ואז להדפיס.
                          צריך עוד עיון אם זה באמת אפשרות

                          עריכה: בינתיים לא נראה לי שיש אפשרות לפלט emf או xps ב-ghostscript.
                          עריכה2: יש XPS: https://ghostscript.com/doc/current/VectorDevices.htm#XPS

                          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                          תגובה 1 תגובה אחרונה
                          4
                          • ה מנותק
                            ה מנותק
                            הפצת אנקי
                            השיב לyossiz ב נערך לאחרונה על ידי הפצת אנקי
                            #13

                            ראשית, תודה לכל המשיבים
                            @yossiz אפרט הכל מהתחלה:
                            ברמת העיקרון, השאלות בתוכנת אנקי הן בעצם מסמכי html וכתובות בקוד html ותומכות גם בjs וכל הנלווה.
                            התוכנה מתפקדת כדפדפן שמציג את השאלות. הדפדפן הוא יישום מהספריה Qt הנקרא QtWebEngine שמבוסס על כרום.
                            כדי להדפיס את השאלות לפי קריטריונים מסוימים כתבתי קוד שאוסף את השאלות לפי הפרמטרים שהמשתמש מכניס. הפלט הוא דף html.
                            מהhtml הזה אני מתקדם הלאה לצורך המרה לוורד (למתעניינים: על ידי הAPI של וורד), שמירה כpdf (אופציה מובנה בpyqt6) והדפסה.
                            (מכאן ואילך העיקר)
                            עד הגירסאות האחרונות תוכנת אנקי היתה מבוססת על pyqt5 ושם השתמשתי בקוד מוכן כדי להדפיס. כעת הגירסא העדכנית עברה לPyqt6 ושם נעשו הרבה שינויים במחלקות שקשורות להדפסה (QPrintSupport ונספחיה) עם כמעט אפס תיעוד.
                            בתחילה ניסיתי להמיר את הקוד ללא הצלחה. השלב הבא היה לחפש דרכים אחרות. במהלך החיפושים גיליתי שההדפסה דרך Qt איטית בצורה משמעותית מאשר להדפיס בדרכים אחרות מלבד מה שאין אינדיקציה כמה דפים יצאו מהמדפסת בסופו של דבר. הדרך היותר מהירה הייתה לבצע המרת ביניים לpdf ומשם להדפיס.
                            התצוגה המקדימה של ההדפסה היא בסך הכל דף html ארוך ללא שום קשר לתוצאה הסופית. אני מעדיף לא ליצור עוד מידי הרבה תיבות דו שיח כדי לא להכביד.
                            כנראה שמה שהכי יעיל יהיה להמיר לתמונה ומשם להדפיס (?).

                            ניתן לקבל את התוכנה לזכירת הלימוד בכתובת מייל 3422973@gmail.com
                            הודעה זמנית: לעת עתה אנו מנסים לארגן מסע פרסום לתוכנה כדי שכלל הלומדים יוכלו לחזור בקלות על לימודם. תרומות בקישור: https://nedar.im/lGvN

                            תגובה 1 תגובה אחרונה
                            0
                            • ה מנותק
                              ה מנותק
                              הפצת אנקי
                              כתב ב נערך לאחרונה על ידי הפצת אנקי
                              #14

                              למעשה, לבעיה שלי מצאתי פתרון הדפסה ישירות מהhtml עם תצוגה מקדימה שנראית ככה:
                              1f2558dd-9a38-4cd2-a15e-0c77819b388d-image.png

                              אם אי פעם יהיה למישהו צורך בקוד (או למקרה שיש צורך דחוף להדפיס את הדף הזה דרך Pyqt6 דווקא...):

                              import sys
                              from PyQt6.QtCore import QCoreApplication, QUrl, pyqtSlot, QEventLoop
                              from PyQt6.QtPrintSupport import QPrintPreviewDialog, QPrinter
                              from PyQt6.QtWebEngineWidgets import QWebEngineView
                              from PyQt6.QtWidgets import QApplication
                              
                              class PDFPage(QWebEngineView):
                                  def __init__(self, url, filename):
                                      super(PDFPage, self).__init__()
                                      self.url = QUrl.fromUserInput(url)
                                      self.filename = filename
                                      self.loadFinished.connect(self.load_finished)
                                      self.m_printer = QPrinter(QPrinter.PrinterMode.HighResolution)
                                      self.m_waitForResult = QEventLoop()
                                      self.printFinished.connect(self.print_finished)
                              
                                  def start(self):
                                      self.load(self.url)
                              
                                  def load_finished(self, ok):
                                      if ok:
                                          self.QPrintPreviewDialog = QPrintPreviewDialog(self.m_printer)
                                          self.QPrintPreviewDialog.paintRequested.connect(self.printDocument)
                                          self.QPrintPreviewDialog.exec()
                                      else:
                                          QCoreApplication.exit(-1)
                              
                                  def printDocument(self, printer):
                                      self.print(printer)
                                      self.m_waitForResult.exec()
                              
                                  def print_finished(self):
                                      self.m_waitForResult.quit()
                              
                              def pdf_from_url(url, filename):
                                  app = QApplication(sys.argv)
                                  page = PDFPage(url, filename)
                                  page.start()
                                  ret = app.exec()
                                  return ret == 0
                              
                              sucess = pdf_from_url("https://tchumim.com/topic/13945/%D7%94%D7%93%D7%A4%D7%A1%D7%AA-%D7%A7%D7%95%D7%91%D7%A5-pdf-%D7%91%D7%A4%D7%99%D7%99%D7%AA%D7%95%D7%9F-windows/13?_=1662075589691", "test.pdf")
                              if sucess:
                                  print("PDF has been generated")
                              
                              

                              לגופו של עניין, כנראה שהתשובה תהיה באמת להמיר את הpdf לתמונה באמצעות pdf2image ואחר כך להדפיס באמצעות win32print. דוגמא מובאת למעלה בקישור שבהודעה הראשונה שלי.

                              תודה לכל העוזרים ובפרט ל @yossiz המיוחד...

                              ניתן לקבל את התוכנה לזכירת הלימוד בכתובת מייל 3422973@gmail.com
                              הודעה זמנית: לעת עתה אנו מנסים לארגן מסע פרסום לתוכנה כדי שכלל הלומדים יוכלו לחזור בקלות על לימודם. תרומות בקישור: https://nedar.im/lGvN

                              תגובה 1 תגובה אחרונה
                              5
                              • ה הפצת אנקי התייחס לנושא זה ב
                              • ה הפצת אנקי התייחס לנושא זה ב

                              בא תתחבר לדף היומי!
                              • התחברות

                              • אין לך חשבון עדיין? הרשמה

                              • התחברו או הירשמו כדי לחפש.
                              • פוסט ראשון
                                פוסט אחרון
                              0
                              • דף הבית
                              • קטגוריות
                              • פוסטים אחרונים
                              • משתמשים
                              • חיפוש
                              • חוקי הפורום