PDF dosyalarından (bağlantıyla) veri dışa aktarmak için Python'u nasıl kullanacağınızı öğretin

Yazar: Mike Driscoll

Çeviri: Ji Yang

Redaksiyon: Ding Nanya

Bu makale hakkında 4000 kelime 10 dakika okumanız tavsiye edilir.

Bu makale, istenen verileri çıkardıktan sonra verilerin diğer biçimlere nasıl aktarılacağını açıklar.

Pek çok kez bir PDF'den veri ayıklamak ve ardından başka formatlara aktarmak için Python'u kullanmak isteyeceksiniz. Ne yazık ki, işin bu bölümünü iyi bir şekilde gerçekleştirebilecek çok fazla Python paketi yok. Bu yazıda, birkaç farklı Python paketini keşfedeceğiz ve belirli görüntüleri PDF'den nasıl çıkaracağımızı öğreneceğiz. Python'da tam bir çözüm olmasa da, başlamak için buradaki becerileri kullanmaya devam edebilmelisiniz. İstenilen verileri çıkardıktan sonra, verileri diğer formatlara nasıl aktaracağımızı da inceleyeceğiz.

Metnin nasıl çıkarılacağıyla başlayalım!

Metni çıkarmak için PDFMiner'ı kullanın

Belki de en bilineni PDFMiner adlı bir pakettir. PDFMiner paketi Python 2.4'ten beri var. Temel amacı PDF'den metin çıkarmaktır. Aslında, PDFMiner size sayfadaki bir metnin belirli konumunu ve yazı tipi bilgilerini söyleyebilir. Python 2.4 ila 2.7 için, PDFMiner hakkında daha fazla bilgi edinmek için aşağıdaki web sitesine başvurabilirsiniz:

GitHub - https://github.com/euske/pdfminerPyPI - https://pypi.python.org/pypi/pdfminer/Webpage - https://euske.github.io/pdfminer/

PDFMiner, Python 3 ile uyumlu değildir. Neyse ki, PDFMiner ailesinin bir dalı olan PDFMiner.six, Python 3'te tamamen aynı işlevi görebilir.

Aşağıdaki web sitesinde bulabilirsiniz:

https://github.com/pdfminer/pdfminer.six

PDFMiner için kurulum talimatları oldukça güncel değildir. Aslında, bunu pip komutuyla kurabilirsiniz:

Python 3'e PDFMiner'ı yüklemek istiyorsanız (şu anda yaptığınız şey bu olabilir), bunu şu şekilde yüklemeniz gerekir:

PDFMiner için birkaç ilgili belge vardır. Bu yazının kapsadığı içeriğin dışında PDFMiner'ı nasıl etkili bir şekilde kullanacağınızı anlamak için büyük olasılıkla iki sorgu aracı, Google ve Stack Overflow kullanmanız gerekecektir.

Tüm metni çıkart

Bazen bir PDF dosyasındaki tüm metni çıkarmak isteyeceksiniz. PDFMiner paketi, bunu yapmanızı sağlamak için birkaç farklı yol sunar. Önce bazı programlama yöntemlerini tartışalım. IRS W9 formundaki tüm metni okumaya çalışalım.

Formun bir kopyasını buradan alabilirsiniz:

https://www.irs.gov/pub/irs-pdf/fw9.pdf

Bu PDF dosyasını kaydettikten sonra aşağıdaki koda başvurabilirsiniz:

PDFMiner paketini doğrudan kullandığınızda, genellikle biraz külfetli olur. Burada, PDFMiner'ın farklı modüllerinden çok sayıda farklı sınıf sunuyoruz. Bu sınıfların hiçbiri belgelenmediğinden ve docstring özelliklerini uygulamadıklarından, ne yaptıklarıyla ilgili ayrıntılara girmeyeceğim. Gerçekten merak ediyorsanız, kaynak kodlarını derinlemesine inceleyebilirsiniz. Her durumda, yukarıdaki kodu kabaca takip edebileceğimizi düşünüyorum.

Yaptığımız ilk şey, kaynak yöneticisinin bir örneğini oluşturmaktır. Daha sonra Python'un giriş ve çıkış (io) modülü aracılığıyla dosya benzeri bir nesne oluşturun. Python 2 kullanıyorsanız, StringIO modülünü kullanmalısınız. Bir sonraki adım, bir dönüştürücü oluşturmaktır. Bu örnekte, TextConverter'ı kullanmayı seçiyoruz, isterseniz HTMLConverter veya XMLConverter'ı da kullanabilirsiniz. Son olarak, metni çıkarmak için kaynak yöneticimizi ve dönüştürücü nesnelerimizi taşıyan bir PDF yorumlayıcı nesnesi oluşturuyoruz.

Son adım, PDF dosyasını açmak ve her sayfada döngü yapmaktır. Sonunda, tüm metni alır, farklı bilgi işlemcilerini kapatır ve metni standart çıktıya (stdout) yazdırırız.

Metni sayfaya göre ayıklayın

Genellikle çok sayfalı bir belgeden tüm metni almamız gerekmez. Genellikle belgenin belirli kısımlarını işlemek isteyeceksiniz. Öyleyse, metni sayfalandırılmış bir biçimde çıkarması için kodu yeniden yazalım. Bu, metni her seferinde bir sayfa kontrol etmemize olanak tanır:

Bu örnekte, sayfaya göre bir oluşturucu işlevi oluşturduk Oluştur (verim) Metni yükseltin. Extract_text işlevi, metni sayfa sayfa yazdırır. Burada istediğimiz analiz sonuçlarını elde etmek için bazı analiz mantığı ekleyebiliriz. Veya metni (veya HTML veya XML) analiz için farklı dosyalara kaydedebiliriz.

Metnin beklediğiniz sırada olmadığını fark edebilirsiniz. Bu nedenle, ilgilendiğiniz metni analiz etmek için bazı yöntemler düşünmeniz gerekir.

PDFMiner'ın avantajı, PDF dosyalarını metin, HTML veya XML biçiminde kolayca "dışa aktarabilmenizdir".

PDFMiner'ın komut satırı aracını da kullanabilirsiniz, pdf2txt.py ile dumppdf.py İhracat işlerini sizin adınıza gerçekleştirmek. PDFMiner'ı kendiniz anlamaya çalışmak istemiyorsanız. göre pdf2txt.py PDF'yi düz metin, HTML, XML veya "etiket" biçiminde dışa aktarmak için kullanılabilir.

Metni pdf2txt.py aracılığıyla dışa aktarın

PDFMiner'a eşlik eden pdf2txt.py komut satırı aracı, bir PDF dosyasındaki metni çıkarır ve varsayılan olarak standart çıktıya (stdout) yazdırır. Metin görüntülerini tanıyamaz, tıpkı PDFMiner'ın optik karakter tanımayı (OCR) desteklememesi gibi. En basit şekilde kullanmaya çalışalım, yani bir PDF dosyasının yolunu geçirelim. W9.pdf dosyasını kullanacağız. Bir terminal açın ve PDF dosyasını sakladığınız konumu bulun veya işlenecek dosyayı işaret edecek şekilde komutu değiştirin:

Bu komutu çalıştırırsanız, tüm metni standart çıktıya (stdout) yazdıracaktır. Ayrıca pdf2txt.py'nin metin, HTML, XML veya "etiketli PDF" biçiminde bir dosyaya metin yazmasını da sağlayabilirsiniz. XML biçimi, dosyadaki her harfin konumunu ve yazı tipi bilgilerini içerdiği için PDF hakkındaki bilgilerin çoğunu verecektir. Pdf2txt tarafından oluşturulan biçimlendirme genellikle çirkin olduğu için HTML formatı önerilmez. Farklı formatlarda nasıl çıktı üreteceğinizi size şu şekilde öğretebilirsiniz:

İlk komut bir HTML dosyası oluşturacak ve ikincisi bir XML dosyası oluşturacaktır.

Nihai sonuç biraz tuhaf görünüyor ama çok da kötü değil. XML formatındaki çıktı son derece ayrıntılı, bu yüzden onu burada tamamen yeniden üretemiyorum.İşte kısa bir örnek:

Metni çıkarmak için Seçenek Listesini kullanın

Tim McNamara, PDFMiner'ın kullanılamayacak kadar aptal ve zahmetli olduğunu hissetti, bu yüzden PDF'den metin almayı kolaylaştırmak için onun etrafına slate adı verilen bir sarıcı yazdı. Maalesef Python 3 ile uyumlu değil. Eğer denemek istiyorsanız, aşağıdaki gibi dağıtım paketini kurmak için easy_install'a ihtiyacınız olabilir:

Bu paketi pip kullanarak düzgün bir şekilde kuramıyorum. Ancak, bir kez kurulduktan sonra, pip kullanarak kayrak kurabilirsiniz:

En son sürümün 0.5.2 olduğunu ve pip'in bu sürümü alamayabileceğini unutmayın. Eğer alamıyorsanız, slate kurulumunu doğrudan GitHub'dan alabilirsiniz:

Şimdi PDF'den metin çıkarmak için biraz kod yazmaya hazırız:

Gördüğünüz gibi, slate'in bir PDF dosyasını analiz etmesine izin vermek için, yalnızca seçenek listesi içe aktarmanız ve PDF sınıfının bir örneğini oluşturmanız gerekir. PDF sınıfı aslında Python yerleşik sınıf listesinin bir alt sınıfıdır, bu nedenle yalnızca üzerinden geçilebilen metin sayfalarının bir listesini döndürür. PDF dosyasının bir parolası varsa, bir parola parametresi girebilirsiniz. Her neyse, dosya analiz edildikten sonra, sadece her sayfanın metnini yazdırıyoruz.

Arduvazını çok seviyorum, kullanımı daha kolay. Ne yazık ki, bu paket için neredeyse hiç belge yok. Kaynak koduna göz attıktan sonra, yalnızca düz metin çıkarmayı desteklediği görülüyor.

Verilerinizi dışa aktarın

Artık biraz metnimiz olduğuna göre, verileri çeşitli biçimlere nasıl aktaracağımızı öğrenmek için biraz zaman harcayacağız. Özellikle, aşağıdaki gibi metnin nasıl dışa aktarılacağını öğreneceğiz:

  • XML
  • JSON
  • CSV

Hadi başlayalım!

XML'e aktar

Genişletilebilir İşaretleme Dili (XML) formatı, en iyi bilinen giriş ve çıkış formatlarından biridir. İnternette birçok farklı şeyde yaygın olarak kullanılmaktadır. Bu yazıda gördüğümüz gibi, PDFMiner ayrıca çıktılarından biri olarak XML'i desteklemektedir.

Bununla birlikte, kendi XML oluşturma aracımızı oluşturalım. Aşağıdaki basit bir örnektir:

Bu kod, Python'un yerleşik XML kitaplığını kullanacak, minidom ile ElementTree. Ayrıca, her seferinde bir sayfa metin almak için PDFMiner jeneratör kodunu da sunuyoruz. Bu örnekte, en üst düzey öğemizi PDF'nin dosya adıyla oluşturduk. Ardından altına bir sayfa (Sayfalar) ekleyin öğesi. Bir sonraki adım, her sayfayı PDF'den çıkardığımız ve istediğimiz bilgileri kaydettiğimiz bir for döngüsüdür. Buraya, daha ilginç bilgileri analiz etmek için sayfayı cümlelere veya kelimelere ayırabileceğiniz belirli bir analiz programı ekleyebilirsiniz. Örneğin, yalnızca belirli bir ada veya tarih / zaman damgasına sahip cümleler isteyebilirsiniz. Bu tür şeyleri bulmak için Python'un normal ifadelerini kullanabilir veya cümlelerde alt dizelerin varlığını kontrol edebilirsiniz.

Bu örnek için, her sayfanın ilk 100 karakterini çıkardık ve bunları bir XML'de sakladık. SubElement içinde. Sonraki kod parçası, sadece bir XML dosyası yazmak için basitleştirilebilir. Ancak, ElementTree XML'i okunabilir hale getirmek için hiçbir şey yapmayacaktır. Sonunda dev bir sıkıştırılmış JavaScript parçası gibi görünmeye başladı. Bu yüzden, tüm metni diske yazmak yerine, dosyayı yazmadan önce XML'i boşluklarla "güzelleştirmek" için minidom kullanıyoruz. Şöyle görünüyor:

Yukarıdakiler güzel ve temiz bir XML'dir ve ayrıca okunması da kolaydır. Pasta üzerindeki krema, PyPDF2 bölümünde öğrendiklerinizi PDF'den meta verileri ayıklamak ve ardından bunu XML'e eklemek için kullanabilmenizdir.

JSON'a aktar

JavaScript nesne ek açıklamaları veya JSON, okuması ve yazması kolay olan hafif bir veri alışverişi biçimidir. Python, standart kitaplığında JSON'u programlı olarak okuyup yazmanıza olanak tanıyan bir json modülü içerir. XML yerine JSON çıktısı almak için bir dışa aktarıcı komut dosyası oluşturmak için önceki bölümde öğrendiklerimizi kullanalım:

Burada, PDFMiner modülü dahil olmak üzere ihtiyaç duyulan farklı kitaplıkları tanıtıyoruz. Ardından, PDF dosyasının giriş yolu ve JSON dosyasının çıktı yolu ile parametreler olarak bir işlev oluşturun. Python'daki JSON temelde bir sözlüktür, bu nedenle bir çift basit üst düzey anahtar oluşturuyoruz: Dosya adı ve Sayfalar. Sayfalar anahtarı boş bir forma karşılık gelir. Daha sonra, PDF'nin her sayfasında döngü yapıyoruz ve her sayfanın ilk 100 karakterini çıkarıyoruz. Daha sonra anahtar olarak sayfa numarası ve değer olarak 100 karakter içeren bir sözlük değişkeni oluşturun ve bunu üst sayfa formuna ekleyin. Son olarak, dosyaları oluşturmak için json modülünün dump komutunu kullanıyoruz.

Dosyanın içeriği nihayet şöyle görünür:

Yine okunabilir çıktı aldık. İsterseniz bu örneği PDF meta verileriyle de geliştirebilirsiniz. Her bir sayfadan veya belgeden hangi sonuçları analiz etmek istediğinize bağlı olarak çıktının değişeceğini lütfen unutmayın.

Şimdi CSV dosyalarının nasıl dışa aktarılacağına hızlı bir göz atalım.

CSVye aktar

CSV, ** virgülle ayrılmış değerlerin ** (virgülle ayrılmış değerler) kısaltmasıdır. Güzel bir standart formattır ve uzun süredir kullanılıyor. CSV'nin avantajı, hem Microsoft Excel'in hem de LibreOffice'in bunları otomatik olarak güzel elektronik tablolar olarak açabilmesidir. Orijinal değerini görmekten memnunsanız, CSV dosyasını bir metin düzenleyicide de açabilirsiniz.

Python'da yerleşik bir csv modülü vardır, bunu CSV dosyalarını okumak ve yazmak için kullanabilirsiniz. Burada, PDF'den çıkardığımız metinden bir CSV oluşturmak için kullanacağız. Koda bakalım:

Bu örnekte Python csv kitaplığını tanıttık. Aksi takdirde, içe aktarılan kitaplık önceki örnekle aynıdır. İşlevde, bir CSV dosya işlemcisi oluşturmak için CSV dosya yolunu kullanıyoruz. Ardından, tek parametre olarak dosya işlemcisiyle bir CSV yazıcı nesnesini başlatın. Ardından PDF sayfalarını daha önce olduğu gibi çaprazlayın. Buradaki tek fark, ilk 100 karakteri ayrı kelimelere ayırmamızdır. Bu, CSV'ye eklememiz için bazı gerçek verilere sahip olmamızı sağlayacaktır. Bunu yapmazsanız, her satırda gerçek bir CSV dosyası olmayan yalnızca bir öğe olacaktır. Son olarak, CSV dosyasına bir kelime listesi yazıyoruz.

Sonuç şu:

Sanırım bu örnek JSON veya XML örneğinden biraz daha zor, ama çok da zor değil. Şimdi resimleri PDF'den nasıl çıkaracağımıza bakalım.

PDF'den resimleri ayıklayın

Maalesef, görüntüleri PDF'den ayıklayabilecek bir Python paketi yok. Bulduğum en yakın şey, bir minecart Proje bunu yapabileceğini iddia ediyor, ancak sadece Python 2.7'de çalışıyor. PDF örneğimde çalıştıramıyorum. Ned Batchelder'ın blogunda, JPG resimlerinin PDF'den nasıl çıkarılacağından bahseden bir makale var. kod aşağıdaki gibi gösterilir:

Bu, kullandığım PDF dosyası için de geçersiz. Bazı insanlar yorumlarında kodun bazı PDF dosyaları için geçerli olduğunu iddia etti ve bazıları değiştirilen kod hakkında yorum yaptı. Stack Overflow web sitesinde bunun için çeşitli kodlar vardır ve bunlardan bazıları PyPDF2'yi şu veya bu şekilde kullanır. Ama hiçbiri benim için çalışmadı.

Benim önerim benzer bir Poppler Resimleri ayıklamak için bir araç. Poppler adlı bir araç var pdfimages, Python'un alt işlem modülü ile kullanabilirsiniz. İşte Python olmadan nasıl kullanabileceğiniz:

Görüntüler klasörünün (veya oluşturmak istediğiniz herhangi bir çıktı klasörünün) oluşturulduğundan emin olun, çünkü pdfimages onu sizin için oluşturmayacaktır.

Aynı komutu yürütmek için bir Python betiği yazalım, çıktı klasörünün zaten mevcut olduğundan emin olun:

Bu örnekte, alt işlem ve işletim sistemi modüllerini tanıttık. Çıktı yolu yoksa, onu oluşturmaya çalışacağız. Daha sonra pdfimages komutunu çalıştırmak için alt işlemin çağrı işlevini kullanırız. Call işlevi, geri dönmeden önce pdfimages komutunun tamamen yürütülmesini bekleyeceği için kullanılır. Bunun yerine Popen'i kullanabilirsiniz, ancak bu temelde komut işlemini arka planda çalıştıracaktır. Son olarak, tüm resimlerin çıkarıldığından emin olmak için çıktı yolunun ayrıntılarını yazdırıyoruz.

İnternette bir alıntı yapan başka makaleler de var. Değnek Kütüphane, deneyebilirsin. ImageMagick için bir sarmalayıcıdır. Dikkate değer başka bir şey de, Poppler ile bağlanan Python'un pypoppler Bununla birlikte, bu paketle ilgili herhangi bir resim çıkarma örneği bulamadım.

sonuç olarak

Bu makale pek çok bilgi içermektedir. PDFMiner veya Slate gibi PDF'den metin çıkarmak için kullanılabilecek bazı paketler öğrendik. Metni XML, JSON ve CSV'ye aktarmak için Python'un yerleşik kitaplıklarını nasıl kullanacağımızı da öğrendik. Son olarak, resimleri PDF'den dışa aktarmanın zor problemini inceledik. Python şu anda bu işi yapmak için mükemmel bir kitaplığa sahip olmasa da, Poppler'in pdfimage araç modülü gibi diğer araç geçici çözümlerini kullanabilirsiniz.

Orjinal başlık:

Python ile PDF'lerden Verileri Dışa Aktarma

Orijinal bağlantı:

https://dzone.com/articles/exporting-data-from-pdfs-with-python

Çevirmen Profili

Suzhou'daki bir BT şirketinin teknik direktörü olan Ji Yang, 20 yıldır faaliyet gösteriyor ve şu anda Java projelerinin planlanması ve yönetiminden sorumlu. Büyük veri, veri madenciliği ve analiz projelerini denemeye hevesliyim ancak fırsat ve veri eksikliğinden muzdaripim. Şu anda araştırıyorum ve öğreniyorum ve ayrıca veri modellemenin uygulama senaryolarını daha iyi anlamayı umarak bazı çevrimiçi kurslar da rapor ettim. Dev olamazsınız, umarım devlerin omuzlarında durabilir ve veri biliminin ilginç dünyasını anlayabilirsiniz.

- Bitiş -

Tsinghua-Qingdao Veri Bilimi Enstitüsü'nün resmi WeChat kamu platformunu takip edin " THU Veri Pastası "Ve kız kardeş numarası" Veri Pastası THU "Daha fazla ders avantajı ve kaliteli içerik elde edin.

Wolverine 3 sana ne söylemedi
önceki
GIF-Çinli Kadın Futbolu 2 dakika 2 gol! İki yedek oyuncu attı, Wang Shuang rastgele bir golü kaçırdı
Sonraki
Takviye öğrenmede strateji ağını ve sayısal ağı anlamanıza yardımcı olur (bağlantı)
MIT bilim adamları bir damlacık mikroskobu oluşturuyor
"Reform ve Açılmanın 40. Yılını Kutlamak için Büyük Değişim-Büyük Ölçekli Sergi" yolsuzlukla mücadele başarılarını sergiledi
Guazi ikinci el otomobil, yapay zeka yetkilendirmesi ile nasıl yeni perakende oynuyor (PPT indirme ile)
5G çağında el yapımı radyo testlerinden başlayarak
Yeni Yıl arifesi kavgası Mianyang'da büyük bir "rutin kredi" davasına yol açtı, polis Ekim ayında 29 kişiyi tutukladı
Saihan Mahallesi'ndeki bu ilkokul, koçluk fikirlerinin kampüs futboluna etkisini nasıl yansıtıyor?
Roma belediye başkanı 400 polis ve 600 itfaiyecinin 8 villayı yıkmasına yol açtı
"The Economist": Tsinghua Üniversitesi hızla küresel bir araştırma lideri haline gelebilir
Kalbi kırık! Anne maymun trafik kazasında öldü Küçük maymun annesine sarıldı ve ayrılmayı reddetti
Tableau'daki Z-Order'a göz atın!
2017'deki en güzel biyoloji resimleri yeni yayınlandı, Zhang Zhang güzel ve pitoresk
To Top