العمل مع ملفات PDF في بايثون

العمل مع ملفات PDF في بايثون

يجب أن تكونوا جميعًا على دراية بماهية ملفات PDF. في الواقع، فهي واحدة من أهم الوسائط الرقمية وأكثرها استخدامًا. PDF لتقف على تنسيق المستندات المحمولة . يستخدم .pdf امتداد. يتم استخدامه لتقديم المستندات وتبادلها بشكل مستقل عن الأجهزة البرمجية أو نظام التشغيل.
اخترع بواسطة أدوبي أصبح PDF الآن معيارًا مفتوحًا تحتفظ به المنظمة الدولية للمعايير (ISO). يمكن أن تحتوي ملفات 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')   
  • هنا نقوم بإنشاء كائن قارئ PDF فئة وحدة pypdf وتمرير المسار إلى ملف PDF والحصول على كائن قارئ PDF.
     
 print(len(reader.pages))   
  • الصفحات الخاصية تعطي عدد الصفحات في ملف PDF. على سبيل المثال، في حالتنا هو 20 (انظر السطر الأول من الإخراج).
     
 pageObj = reader.pages[0]   
  • الآن نقوم بإنشاء كائن كائن الصفحة فئة وحدة pypdf. كائن قارئ 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 نستخدم كائن كاتب PDF فئة وحدة pypdf.
 for page in range(len(pdfReader.pages)):   
pageObj = pdfReader.pages[page]
pageObj.rotate(rotation)
writer.add_page(pageObj)
  • نقوم الآن بتكرار كل صفحة من ملف PDF الأصلي. نحصل على كائن الصفحة بواسطة .الصفحات[] طريقة فئة قارئ 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()  
  • للدمج نستخدم فئة مبنية مسبقًا كاتب PDF من وحدة pypdf.
    هنا نقوم بإنشاء كائن 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 - النهاية) .
لم يتم استخدام أي وظيفة أو فئة جديدة في برنامج بايثون أعلاه. باستخدام المنطق والتكرارات البسيطة، قمنا بإنشاء تقسيمات لملف 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 العلامة المائية.pdf . إلى كائن الصفحة الذي تم تمريره الذي نستخدمه دمج_الصفحة() وظيفة وتمرير كائن الصفحة للصفحة الأولى من كائن قارئ PDF للعلامة المائية. سيؤدي هذا إلى تراكب العلامة المائية فوق كائن الصفحة الذي تم تمريره.


وهنا نصل إلى نهاية هذا البرنامج التعليمي الطويل حول العمل مع ملفات PDF في بايثون.
الآن يمكنك بسهولة إنشاء مدير PDF الخاص بك!
مراجع:
 

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

إذا كنت تحب GeeksforGeeks وترغب في المساهمة، يمكنك أيضًا كتابة مقال باستخدام write.geeksforgeeks.org أو إرسال مقالتك بالبريد إلى [email protected]. شاهد مقالتك التي تظهر على صفحة GeeksforGeeks الرئيسية وساعد المهوسون الآخرين.
يرجى كتابة التعليقات إذا وجدت أي شيء غير صحيح أو إذا كنت ترغب في مشاركة المزيد من المعلومات حول الموضوع الذي تمت مناقشته أعلاه.
 

إنشاء اختبار