Advertisement
  1. Code
  2. Python

چگونگی کار با اسناد PDF با استفاده از پایتون

Scroll to top
Read Time: 6 min

() translation by (you can also view the original English article)

من واقعا فایل های PDF (فرمت سند قابل حمل) را تحسین می کنم. من روز هایی را به یاد می آورم که این فایل ها تمام مشکلاتی که به دلیل تفاوت در نسخه ی word و یا دلایل دیگر در هنگام جابجایی و تبادل فایل ها به وجود می آمد را حل کردند.

در اینجا ما در اصل در مورد پایتون صحبت می کنیم، اینطور نیست؟ و علاقه مندیم اون رو  برای کار با اسناد PDF به کار ببریم. خب، شاید بگید که این کار خیلی ساده است، مخصوصا اگر قبلا از پایتون برای کار با فایل های متنی(txt) استفاده کرده باشید. اما، این کار مقداری متفاوته. اسناد PDF فایل های باینری هستند و از آن جایی که دربر دارنده فونت های متفاوت، رنگ و غیره هستند از فایل های متنی ساده پیچیده تر هستند.

البته بدین معنی نیست که کار با اسناد PDF بوسیله ی پایتون مشکل است. این کار نسبتا ساده بوده و استفاده از یک ماژول جانبی مسئله را حل می کند.

PyPDF2

همونطوری که در بالا اشاره کردیم، کلید حل مسئله استفاده از یک ماژول جانبی است. ماژولی که ما در این آموزش استفاده خواهیم کرد PyPDF2 است. با توجه به این که این یک ماژول جانبی است، اولین قدمی که معمولا باید برداریم، نصب این ماژول است. بدین منظور، از pip استفاده خواهیم کرد، pip چیست؟(بر اساس wikipedia):

یک سیستم مدیریت پکیج که برای نصب و مدیریت پکیج های نرم افزاری نوشته شده به زبان پایتون استفاده می شود. پکیج های زیادی را می توان در فهرست پکیج های پایتون(PyPI) پیدا کرد.

شما می توانید مراحل شرح داده شده در راهنمای پکیج های پایتون را به منظور نصب pip دنبال کنید، اما اگر شما از پایتون 2.7.9 و بالاتر ، و یا پایتون 3.4 و بالاتر استفاده می کنید، شما از قبل pip را دارید!

حالا PyPDF2 را می توان به راحتی توسط فرمان زیر نصب کرد(در ترمینال Mac OS X) :

pip install pypdf2

عالیه! حالا شما PyPDF2 را نصب کرده اید، و آماده اید تا بازی کردن با اسناد PDF را شروع کنید.

خواندن یک سند PDF

فایل نمونه ای که در این آموزش با آن کار خواهیم کرد sample.pdf است. برید جلو و فایل را برای دنبال کردن آموزش دانلود کنید، و یا اینکه از هر فایل PDF که دوست داشتید استفاده کنید.

حالا بیاید پیش بریم و یک سند PDF رو بخونیم. از آنجایی که ما از PyPDF2 استفاده می کنیم، ما باید این ماژول رو به صورت زیر import کنیم:

import pypdf2

پس از فراخوانی این ماژول، از کلاس PdfFileReader استفاده خواهیم کرد. خب، اسکریپت خواندن اسناد PDF به صورت زیر است:

1
import PyPDF2
2
pdf_file = open('sample.pdf')
3
read_pdf = PyPDF2.PdfFileReader(pdf_file)

کار های بیشتر با اسناد PDF

همونطوری که در این قسمت خواهیم دید پس از خواندن سند PDF، ما قادر هستیم اعمال متفاوتی را روی آن انجام دهیم.

تعداد صفحات

بیاید تعداد صفحات موجود در sample.pdf را بررسی کنیم. بدین منظور، ما می توانیم از متد getNumPages() استفاده کنیم:

1
number_of_pages = read_pdf.getNumPages()
2
print number_of_pages

در این مورد، مقدار بازگشتی 1 خواهد بود.

شماره ی صفحه

حالا بیاید شماره ی یک صفحه رو در سند PDF چک کنیم. می تونیم از متد getPageNumber(page) استفاده کنیم، توجه کنیم که باید یک object از نوع page به عنوان ورودی به این متد بدیم. برای دریافت یک page از متد getPage(number) استفاده خواهیم کرد، به این صورت که number شماره ی صفحه در سند PDF است. آرگومان number با مقدار 0 آغار می شود.

خب، من می دونم زمانی که شما از getPage(number) استفاده می کنید از قبل شماره صفحه را می دانید، اما این فقط برای این است که نحوه ی استفاده از این دو متد در کنار هم را تجسم کنید. این موضوع را می توان ار اسکریپت زیر دریافت:

1
page = read_pdf.getPage(0)
2
page_number = read_pdf.getPageNumber(page)
3
print page_number

برید جلو و اسکریپت رو امتحان کنید. چه خروجی دریافت کردید؟

ما می دانیم که در sample.pdf (فایلی که با آن آزمایش می کنیم) فقط یک صفحه داریم( عدد 0) اما اگر عدد 1 به عنوان شماره ی صفحه به getPage(number) رد شود چه اتفاقی می افتد؟ در این مورد، شما خطای زیر را دریافت خواهید کرد:

1
Traceback (most recent call last):
2
  File "test.py", line 6, in <module>
3
    page = read_pdf.getPage(1)
4
  File "/usr/local/lib/python2.7/site-packages/PyPDF2/pdf.py", line 1158, in getPage
5
    return self.flattenedPages[pageNumber]
6
IndexError: list index out of range

این موضوع بدین دلیل است که صفحه در دسترس نمی باشد، و ما از یک شماره ی صفحه ی خارج از بازه استفاده می کنیم( وجود ندارد).

Page Mode (حالت صفحه)

صفحه ی PDF در حالات مختلفی وجود دارد که به شرح زیر می باشند:

/UseNone outline ها و thumbnail panel ها را نمایش نده.
/UseOutlines
نمایش پنل outline ها‌ (aka bookmark)
/UseThumbs
نمایش پنل های thumbnail (بند انگشتی) صفحه
/FullScreen
نمای تمام صفحه
/UseOC
نمایش پنل گروه محتوای اختیاری (OCG)
/UseAttachments
نمایش پنل پیوست ها

برای بررسی حالت صفحه مون ، ما می توانیم از اسکریپت زیر استفاده کنیم:

1
page = read_pdf.getPage(0)
2
page_mode = read_pdf.getPageMode()
3
print page_mode

در مورد سند PDF ما(sample.pdf) ، مقدار بازگشتی none است، که بدین معنی است که حالت صفحه مشخص نشده است. اگر بخواهید حالت یک صفحه را مشخص کنید، می توانید از متد setPageMode(mode) استفاده کنید، بدین صورت که mode یکی از حالات لیست شده در جدول بالاست.

استخراج متن

ما تاحالا دور این فایل گشتیم، خب بیاید ببینیم داحلش چیه. متد extractText() در این کار به ما کمک خواهد کرد.

اجازه بدید اسکریپت کامل برای انجام آن را به شما نشان دهم، که بر خلاف آن چیزی است که در بالا انجام دادم یعنی تنها نشان دادن اسکریپت لازم برای انجام یک کار. اسکریپت استخراج متن از سند PDF به صورت زیر است:

1
import PyPDF2
2
pdf_file = open('sample.pdf')
3
read_pdf = PyPDF2.PdfFileReader(pdf_file)
4
number_of_pages = read_pdf.getNumPages()
5
page = read_pdf.getPage(0)
6
page_content = page.extractText()
7
print page_content

وقتی نتیجه ی زیر را دریافت کردم، در مقایسه با آنچه که در فایل sample.pdf بود غافلگیر شدم:

1
!"#$%#$%&%$&'()*%+,-%./01'*23%4

2
5'%1$#26%3/%7/))/8%&)/26%8#3"%3"*%313/9#&)
3
%

این موضوع غالبا به علت یک مشکل فونت است ، چون کد های کاراکتر های فایل به مقادیر دیگری تبدیل می شوند. خب این مشکل بعضی وقت ها با خود اسناد PDF وجود دارد، چرا که فایل های PDF ممکن است شامل داده هایی باشند که امکان یا نیاز استخراج آن وجود نداشته باشد.

پس من از یک فایل دیگه استفاده کردم، که یک صفحه از این فایل است: paper.pdf امتحان کنید و در کد فایل sample.pdf‌ را با paper.pdf جایگزین کنید. در این مورد خروجی به صورت زیر بود:

1
Medical Imaging 2012: Image Perception, Observer Performance, and Technology Assessment, edited by Craig K. Abbey, Claudia R. Mello-Thoms, Proc. of SPIE Vol. 8318, 83181I © 2012 SPIE · CCC code: 1605-7422/12/$18 · doi: 10.1117/12.912389Proc. of SPIE Vol. 8318  83181I-1Downloaded from SPIE Digital Library on 13 Aug 2012 to 134.130.12.208. Terms of Use:  http://spiedl.org/terms

اما، متن های دیگر موجود در صفحه کجاست؟ خب، در واقع به نظر می آید متد extractText() کامل نبوده و نیاز به بهبود دارد. اما، ما به این هدف که کار با فایل های PDF با استفاده از پایتون را به شما نشان دهیم رسیده ایم، البته به نظر می رسد این روش نیاز به بهبود و پیشرفت دارد.

جمع بندی و نتیجه گیری

همونطوری که می تونیم ببینیم، پایتون کار با اسناد PDF را آسان می کند. این آموزش تنها شامل مباحث مقدماتی از این موضوع بود، و شما می توانید اطلاعات بیشتری در مورد دیگر اعمالی که می توان با اسناد PDF انجام داد در اسناد PyPDF2 بدست آورید.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.