logo

Treballar amb fitxers PDF a Python

Tots heu d'estar familiaritzats amb què són els PDF. De fet, són un dels mitjans digitals més importants i utilitzats. PDF significa Format de document portàtil . S'utilitza .pdf extensió. S'utilitza per presentar i intercanviar documents de manera fiable, independentment del programari, maquinari o sistema operatiu.
Inventat per Adobe , PDF és ara un estàndard obert mantingut per l'Organització Internacional per a l'Estandardització (ISO). Els PDF poden contenir enllaços i botons, camps de formulari, àudio, vídeo i lògica empresarial.
En aquest article, aprendrem com podem fer diverses operacions com:

  • Extracció de text del PDF
  • Pàgines PDF rotatives
  • Fusionar PDF
  • Divisió de PDF
  • Afegeix una marca d'aigua a les pàgines PDF

Instal·lació: Utilitzant scripts Python senzills!
Farem servir un mòdul de tercers, pypdf.
pypdf és una biblioteca Python creada com a conjunt d'eines PDF. És capaç de:

  • Extracció d'informació del document (títol, autor,...)
  • Divisió de documents pàgina per pàgina
  • Fusionar documents pàgina per pàgina
  • Retallar pàgines
  • Combinació de diverses pàgines en una única pàgina
  • Xifrar i desxifrar fitxers PDF
  • i més!

Per instal·lar pypdf, executeu l'ordre següent des de la línia d'ordres:



pip install pypdf>

El nom d'aquest mòdul distingeix entre majúscules i minúscules, així que assegureu-vos que i és en minúscula i tota la resta és en majúscula. Tots els fitxers de codi i PDF utilitzats en aquest tutorial/article estan disponibles aquí .

1. Extracció de text d'un fitxer 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())>

>

>

La sortida del programa anterior té aquest aspecte:

20 PythonBasics S.R.Doty August27,2008 Contents 1Preliminaries 4 1.1WhatisPython?................................... ..4 1.2Installationanddocumentation.................... .........4   [and some more lines...]>

Intentem entendre el codi anterior en trossos:

reader = PdfReader('example.pdf')>
  • Aquí, creem un objecte de PdfReader classe del mòdul pypdf i passeu el camí al fitxer PDF i obteniu un objecte lector de PDF.
print(len(reader.pages))>
  • pàgines La propietat proporciona el nombre de pàgines del fitxer PDF. Per exemple, en el nostre cas, és 20 (vegeu la primera línia de sortida).
pageObj = reader.pages[0]>
  • Ara, creem un objecte de PageObject classe del mòdul pypdf. L'objecte lector de PDF té una funció pàgines[] que pren el número de pàgina (a partir de l'índex 0) com a argument i retorna l'objecte de la pàgina.
print(pageObj.extract_text())>
  • L'objecte de la pàgina té funció extracte_text() per extreure text de la pàgina PDF.

Nota: Tot i que els fitxers PDF són excel·lents per dissenyar el text d'una manera que sigui fàcil d'imprimir i llegir per a la gent, no són senzills per al programari per analitzar-los en text pla. Com a tal, pypdf pot cometre errors en extreure text d'un PDF i fins i tot pot ser que no pugui obrir alguns PDF. Malauradament, no hi ha gaire que puguis fer al respecte. És possible que pypdf simplement no pugui funcionar amb alguns dels vostres fitxers PDF concrets.

2. Rotació de pàgines 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)):> > ># creating rotated page object> >pageObj>=> reader.pages[page]> >pageObj.rotate(rotation)> > ># adding rotated page object to pdf writer> >pdfWriter.add_page(pageObj)> > ># new pdf file object> >newFile>=> open>(newFileName,>'wb'>)> > ># writing rotated pages to new file> >pdfWriter.write(newFile)> > ># closing the new pdf file object> >newFile.close()> > > 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()>

>

>

Aquí, podeu veure com la primera pàgina de exemple_rotat.pdf sembla (imatge de la dreta) després de la rotació:

Girant un fitxer pdf

Alguns punts importants relacionats amb el codi anterior:

java ordenant una llista de matrius
  • Per a la rotació, primer creem un objecte lector de PDF del PDF original.
writer = PdfWriter()>
  • Les pàgines girades s'escriuran en un PDF nou. Per escriure en PDF, fem servir l'objecte de PdfWriter classe del mòdul pypdf.
for page in range(len(pdfReader.pages)): pageObj = pdfReader.pages[page] pageObj.rotate(rotation) pdfWriter.add_page(pageObj)>
  • Ara, repetim cada pàgina del PDF original. Obtenim l'objecte de la pàgina per pàgines .[] mètode de classe de lector de PDF. Ara, girem la pàgina girar () mètode de classe d'objectes de pàgina. A continuació, afegim una pàgina a l'objecte d'escriptor de PDF utilitzant addage() mètode de classe d'escriptor PDF passant l'objecte de pàgina girada.
newFile = open(newFileName, 'wb') pdfWriter.write(newFile) newFile.close()>
  • Ara, hem d'escriure les pàgines PDF en un fitxer PDF nou. En primer lloc, obrim el nou objecte de fitxer i escrivim pàgines PDF amb ell escriure () mètode de l'objecte de l'escriptor PDF. Finalment, tanquem l'objecte fitxer PDF original i l'objecte fitxer nou.

3. Fusionar fitxers PDF

Python




# importing required modules> from> pypdf>import> PdfMerger> > > def> PDFmerge(pdfs, output):> ># creating pdf file merger object> >pdfMerger>=> PdfMerger()> > ># appending pdfs one by one> >for> pdf>in> pdfs:> >pdfMerger.append(pdf)> > ># writing combined pdf to output pdf file> >with>open>(output,>'wb'>) as f:> >pdfMerger.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()>

>

>

La sortida del programa anterior és un PDF combinat, exemple_combinat.pdf , obtingut per fusió exemple.pdf i exemple_rotat.pdf .

  • Fem una ullada als aspectes importants d'aquest programa:
pdfMerger = PdfMerger()>
  • Per a la fusió, utilitzem una classe preconstruïda, PdfMerger del mòdul pypdf.
    Aquí, creem un objecte pdf Fusió de la classe de fusió de PDF
for pdf in pdfs: pdfmerger.append(open(focus, 'rb'))>
  • Ara, afegim un objecte de fitxer de cada objecte de fusió de PDF a PDF mitjançant el afegir() mètode.
with open(output, 'wb') as f: pdfMerger.write(f)>
  • Finalment, escrivim les pàgines PDF al fitxer PDF de sortida mitjançant escriure mètode d'objecte de fusió de PDF.

4. Divisió d'arxiu 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()>

>

>

La sortida serà de tres fitxers PDF nous divisió 1 (pàgina 0,1), divisió 2 (pàgina 2,3), divisió 3 (pàgina 4-final) .
No s'ha utilitzat cap funció o classe nova al programa Python anterior. Utilitzant una lògica i iteracions senzilles, vam crear les divisions dels PDF passats segons la llista aprovada es divideix .

5. Afegir una marca d'aigua a les pàgines PDF

Python




# importing the required modules> from> pypdf>import> PdfReader> > def> add_watermark(wmFile, pageObj):> ># creating pdf reader object of watermark pdf file> >reader>=> PdfReader(wmFileObj)> > ># 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)> > ># new pdf file object> >newFile>=> open>(newFileName,>'wb'>)> > ># writing watermarked pages to new file> >writer.write(newFile)> > ># closing the new pdf file object> >newFile.close()> > if> __name__>=>=> '__main__'>:> ># calling the main function> >main()>

què és una interfície
>

>

Així és com es veu la primera pàgina del fitxer PDF original (esquerra) i amb filigrana (dreta):

Marca d'aigua del fitxer pdf

  • Tot el procés és el mateix que l'exemple de rotació de pàgines. L'única diferència és:
wmpageObj = add_watermark(mywatermark, pdfReader.pages[page])>
  • L'objecte de pàgina es converteix en objecte de pàgina amb filigrana mitjançant afegir_marca d'aigua() funció.
  • Intentem entendre-ho afegir_marca d'aigua() funció:
reader = PdfReader(wmFile) pageObj.merge_page(reader.pages[0]) wmFileObj.close() return pageObj>
  • En primer lloc, creem un objecte lector de PDF filigrana.pdf . A l'objecte de pàgina passat, fem servir merge_page() funció i passa l'objecte de pàgina de la primera pàgina de l'objecte lector de PDF de filigrana. Això superposarà la filigrana sobre l'objecte de la pàgina passat.

I aquí arribem al final d'aquest llarg tutorial sobre com treballar amb fitxers PDF en Python.
Ara, podeu crear fàcilment el vostre propi gestor de PDF!
Referències:

Si t'agrada techcodeview.com i vols contribuir, també pots escriure un article mitjançant write.techcodeview.com o enviar el teu article a [email protected]
Si us plau, escriviu comentaris si trobeu alguna cosa incorrecta o si voleu compartir més informació sobre el tema tractat anteriorment.