עבודה עם קבצי PDF ב-Python

עבודה עם קבצי PDF ב-Python

כולכם חייבים להכיר מה הם קובצי PDF. למעשה הם אחת המדיה הדיגיטלית החשובה והנפוצה ביותר. PDF מייצג פורמט מסמך נייד . זה משתמש .pdf הַרחָבָה. הוא משמש כדי להציג ולהחליף מסמכים בצורה מהימנה ללא תלות בחומרת תוכנה או מערכת הפעלה.
הומצא על ידי אדובי PDF הוא כעת תקן פתוח המתוחזק על ידי ארגון התקינה הבינלאומי (ISO). קובצי PDF יכולים להכיל קישורים וכפתורים של שדות אודיו וידאו והיגיון עסקי.
במאמר זה נלמד כיצד אנו יכולים לבצע פעולות שונות כמו:
 

  • חילוץ טקסט מ-PDF
  • סיבוב דפי PDF
  • מיזוג קובצי PDF
  • פיצול PDF
  • הוספת סימן מים לדפי PDF

הַתקָנָה: שימוש בסקריפטים פשוטים של פיתון!
אנו נשתמש במודול pypdf של צד שלישי.
pypdf היא ספריית פיתון הבנויה כערכת כלים PDF. הוא מסוגל:
 

  • חילוץ מידע על המסמך (כותב הכותרת...)
  • פיצול מסמכים עמוד אחר עמוד
  • מיזוג מסמכים עמוד אחר עמוד
  • חיתוך דפים
  • מיזוג עמודים מרובים לדף אחד
  • הצפנה ופענוח קבצי PDF
  • ועוד!

כדי להתקין pypdf הפעל את הפקודה הבאה משורת הפקודה:

 pip install pypdf  

שם המודול הזה הוא תלוי רישיות אז ודא ש ו הוא אותיות קטנות וכל השאר באותיות גדולות. כל הקוד וקובצי PDF המשמשים במדריך/מאמר זה זמינים כָּאן .

1. חילוץ טקסט מקובץ PDF

Python
   # importing required classes   from   pypdf   import   PdfReader   # creating a pdf reader object   reader   =   PdfReader  (  'example.pdf'  )   # printing number of pages in pdf file   print  (  len  (  reader  .  pages  ))   # creating a page object   page   =   reader  .  pages  [  0  ]   # extracting text from page   print  (  page  .  extract_text  ())   

הפלט של התוכנית לעיל נראה כך:
 

 20   
PythonBasics
S.R.Doty
August272008
Contents

1Preliminaries
4
1.1WhatisPython?...................................
..4
1.2Installationanddocumentation....................
.........4 [and some more lines...]

הבה ננסה להבין את הקוד לעיל בחתיכות:
 

 reader = PdfReader('example.pdf')   
  • כאן אנו יוצרים אובייקט של PdfReader מחלקה של מודול pypdf והעבירו את הנתיב לקובץ ה-PDF וקבל אובייקט קורא PDF.
     
 print(len(reader.pages))   
  • דפים מאפיין נותן את מספר העמודים בקובץ ה-PDF. למשל במקרה שלנו זה 20 (ראה שורת פלט ראשונה).
     
 pageObj = reader.pages[0]   
  • כעת אנו יוצרים אובייקט של PageObject מחלקה של מודול pydf. לאובייקט קורא PDF יש פונקציה דפים[] שלוקח את מספר העמוד (החל מאינדקס 0) כארגומנט ומחזיר את אובייקט העמוד.
     
 print(pageObj.extract_text())   
  • לאובייקט העמוד יש פונקציה extract_text() כדי לחלץ טקסט מדף ה-PDF.


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

2. סיבוב דפי PDF
 

Python
   # importing the required classes   from   pypdf   import   PdfReader     PdfWriter   def   PDFrotate  (  origFileName     newFileName     rotation  ):   # creating a pdf Reader object   reader   =   PdfReader  (  origFileName  )   # creating a pdf writer object for new pdf   writer   =   PdfWriter  ()   # rotating each page   for   page   in   range  (  len  (  reader  .  pages  )):   pageObj   =   reader  .  pages  [  page  ]   pageObj  .  rotate  (  rotation  )   # Add the rotated page object to the PDF writer   writer  .  add_page  (  pageObj  )   # Write the rotated pages to the new PDF file   with   open  (  newFileName     'wb'  )   as   newFile  :   writer  .  write  (  newFile  )   def   main  ():   # original pdf file name   origFileName   =   'example.pdf'   # new pdf file name   newFileName   =   'rotated_example.pdf'   # rotation angle   rotation   =   270   # calling the PDFrotate function   PDFrotate  (  origFileName     newFileName     rotation  )   if   __name__   ==   '__main__'  :   # calling the main function   main  ()   

כאן אתה יכול לראות איך העמוד הראשון של rotated_example.pdf נראה כמו (תמונה ימנית) לאחר סיבוב:

סיבוב קובץ pdf

כמה נקודות חשובות הקשורות לקוד לעיל:
 

  • לסיבוב אנו יוצרים תחילה אובייקט קורא PDF של ה-PDF המקורי.
 writer = PdfWriter()   
  • דפים מסובבים ייכתבו לקובץ PDF חדש. לכתיבה לקובצי PDF אנו משתמשים באובייקט של PdfWriter מחלקה של מודול pydf.
 for page in range(len(pdfReader.pages)):   
pageObj = pdfReader.pages[page]
pageObj.rotate(rotation)
writer.add_page(pageObj)
  • כעת אנו חוזרים על כל עמוד ב-PDF המקורי. אנו מקבלים אובייקט עמוד על ידי .pages[] שיטה של ​​שיעור קורא PDF. כעת אנו מסובבים את הדף לפי לְסוֹבֵב() שיטת מחלקת אובייקט עמוד. לאחר מכן אנו מוסיפים דף לאובייקט כותב PDF באמצעות לְהוֹסִיף() שיטה של ​​מחלקה לכותב PDF על ידי העברת אובייקט העמוד המסובב.
 newFile = open(newFileName 'wb')   
writer.write(newFile)
newFile.close()
  • כעת עלינו לכתוב את דפי ה-PDF לקובץ PDF חדש. ראשית אנו פותחים את אובייקט הקובץ החדש וכותבים אליו דפי PDF באמצעות לִכתוֹב() שיטת אובייקט כותב PDF. לבסוף נסגור את אובייקט קובץ ה-PDF המקורי ואת אובייקט הקובץ החדש.

3. מיזוג קבצי PDF

Python
   # importing required modules   from   pypdf   import   PdfWriter   def   PDFmerge  (  pdfs     output  ):   # creating pdf file writer object   pdfWriter   =   PdfWriter  ()   # appending pdfs one by one   for   pdf   in   pdfs  :   pdfWriter  .  append  (  pdf  )   # writing combined pdf to output pdf file   with   open  (  output     'wb'  )   as   f  :   pdfWriter  .  write  (  f  )   def   main  ():   # pdf files to merge   pdfs   =   [  'example.pdf'     'rotated_example.pdf'  ]   # output pdf file name   output   =   'combined_example.pdf'   # calling pdf merge function   PDFmerge  (  pdfs  =  pdfs     output  =  output  )   if   __name__   ==   '__main__'  :   # calling the main function   main  ()   

הפלט של התוכנית לעיל הוא PDF משולב combined_example.pdf מתקבל על ידי מיזוג example.pdf ו rotated_example.pdf .
 

  • הבה נסתכל על היבטים חשובים של תוכנית זו:
     
 pdfWriter = PdfWriter()  
  • למיזוג אנו משתמשים במחלקה בנויה מראש PdfWriter של מודול pydf.
    כאן אנו יוצרים אובייקט pdfwriter של כיתת כותבי PDF
  # appending pdfs one by one   
for pdf in pdfs:
pdfWriter.append(pdf)
  • כעת אנו מצרפים אובייקט קובץ של כל PDF לאובייקט כותב PDF באמצעות ה- לְצַרֵף() שִׁיטָה.
  # writing combined pdf to output pdf file   
with open(output 'wb') as f:
pdfWriter.write(f)
  • לבסוף אנו כותבים את דפי ה-PDF לקובץ ה-PDF הפלט באמצעות לִכתוֹב שיטת אובייקט כותב PDF.

4. פיצול קובץ PDF

Python
   # importing the required modules   from   pypdf   import   PdfReader     PdfWriter   def   PDFsplit  (  pdf     splits  ):   # creating pdf reader object   reader   =   PdfReader  (  pdf  )   # starting index of first slice   start   =   0   # starting index of last slice   end   =   splits  [  0  ]   for   i   in   range  (  len  (  splits  )  +  1  ):   # creating pdf writer object for (i+1)th split   writer   =   PdfWriter  ()   # output pdf file name   outputpdf   =   pdf  .  split  (  '.pdf'  )[  0  ]   +   str  (  i  )   +   '.pdf'   # adding pages to pdf writer object   for   page   in   range  (  start    end  ):   writer  .  add_page  (  reader  .  pages  [  page  ])   # writing split pdf pages to pdf file   with   open  (  outputpdf     'wb'  )   as   f  :   writer  .  write  (  f  )   # interchanging page split start position for next split   start   =   end   try  :   # setting split end position for next split   end   =   splits  [  i  +  1  ]   except   IndexError  :   # setting split end position for last split   end   =   len  (  reader  .  pages  )   def   main  ():   # pdf file to split   pdf   =   'example.pdf'   # split page positions   splits   =   [  2    4  ]   # calling PDFsplit function to split pdf   PDFsplit  (  pdf     splits  )   if   __name__   ==   '__main__'  :   # calling the main function   main  ()   

הפלט יהיה שלושה קבצי PDF חדשים עם פיצול 1 (עמוד 01) פיצול 2 (עמוד 23) פיצול 3 (עמוד 4-סוף) .
לא נעשה שימוש בפונקציה או מחלקה חדשה בתוכנית python לעיל. בעזרת לוגיקה ואיטרציות פשוטות יצרנו את הפיצולים של PDF שעבר על פי הרשימה שעברה פיצולים .

5. הוספת סימן מים לדפי PDF

Python
   # importing the required modules   from   pypdf   import   PdfReader     PdfWriter   def   add_watermark  (  wmFile     pageObj  ):   # creating pdf reader object of watermark pdf file   reader   =   PdfReader  (  wmFile  )   # merging watermark pdf's first page with passed page object.   pageObj  .  merge_page  (  reader  .  pages  [  0  ])   # returning watermarked page object   return   pageObj   def   main  ():   # watermark pdf file name   mywatermark   =   'watermark.pdf'   # original pdf file name   origFileName   =   'example.pdf'   # new pdf file name   newFileName   =   'watermarked_example.pdf'   # creating pdf File object of original pdf   pdfFileObj   =   open  (  origFileName     'rb'  )   # creating a pdf Reader object   reader   =   PdfReader  (  pdfFileObj  )   # creating a pdf writer object for new pdf   writer   =   PdfWriter  ()   # adding watermark to each page   for   page   in   range  (  len  (  reader  .  pages  )):   # creating watermarked page object   wmpageObj   =   add_watermark  (  mywatermark     reader  .  pages  [  page  ])   # adding watermarked page object to pdf writer   writer  .  add_page  (  wmpageObj  )   # writing watermarked pages to new file   with   open  (  newFileName     'wb'  )   as   newFile  :   writer  .  write  (  newFile  )   # closing the original pdf file object   pdfFileObj  .  close  ()   if   __name__   ==   '__main__'  :   # calling the main function   main  ()   

כך נראה העמוד הראשון של קובץ PDF מקורי (משמאל) ועם סימן מים (מימין):
 

סימון מים לקובץ pdf

  • כל התהליך זהה לדוגמה של סיבוב העמוד. ההבדל היחיד הוא:
     
 wmpageObj = add_watermark(mywatermark pdfReader.pages[page])   
  • אובייקט עמוד מומר לאובייקט עמוד עם סימן מים באמצעות add_watermark() פוּנקצִיָה.
  • בואו ננסה להבין add_watermark() פוּנקצִיָה:
     
  reader = PdfReader(wmFile)   
pageObj.merge_page(reader.pages[0])
return pageObj
  • בראש ובראשונה אנו יוצרים אובייקט קורא PDF של watermark.pdf . לאובייקט הדף שעבר בו אנו משתמשים Merge_page() פונקציה והעבירו את אובייקט העמוד של העמוד הראשון של אובייקט קורא סימן המים של PDF. פעולה זו תכסה את סימן המים על אובייקט העמוד שעבר.


והנה הגענו לסוף המדריך הארוך הזה על עבודה עם קבצי PDF ב-python.
עכשיו אתה יכול ליצור בקלות מנהל PDF משלך!
הפניות:
 

  • https://automatetheboringstuff.com/chapter13/
  • https://pypi.org/project/pypdf/

אם אתה אוהב את GeeksforGeeks ותרצה לתרום אתה יכול גם לכתוב מאמר באמצעות write.geeksforgeeks.org או לשלוח את המאמר שלך לכתובת [email protected]. ראה את המאמר שלך מופיע בעמוד הראשי של GeeksforGeeks ועזור לגיקים אחרים.
אנא כתוב הערות אם אתה מוצא משהו שגוי או אם אתה רוצה לשתף מידע נוסף על הנושא שנדון לעיל.
 

צור חידון