() 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 بدست آورید.