metin PDF dönüştürmek için Python modülü

oy
341

metne PDF dosyalarını dönüştürmek için en iyi Python modülleri hangileri?

Oluştur 25/08/2008 saat 03:44
kaynak kullanıcı
Diğer dillerde...                            


13 cevaplar

oy
116

PDFMiner deneyin. Bu HTML, SGML veya "Etiketli PDF" formatında PDF dosyalarını metin çıkarabilirsiniz.

http://www.unixuser.org/~euske/python/pdfminer/index.html

Etiketli PDF formatında en temiz görünüyor ve XML etiketlerini dışarı sıyırma sadece çıplak metni bırakır.

Bir Python 3 sürümü altında mevcuttur:

Cevap 25/08/2008 saat 04:21
kaynak kullanıcı

oy
0

PDFminer onunla çalıştı pdf dosyası her sayfasında belki bir satır [7 sayfa 1 ...] bana verdi.

Bugüne kadar sahip en iyi yanıtı pdftoipe, veya c ++ kod Xpdf dayanıyor.

bkz sorumu pdftoipe çıktısı nasıl göründüğünü için.

Cevap 26/08/2008 saat 01:04
kaynak kullanıcı

oy
39

Pdftotext sen (siz istedi ama faydalı olabilir değil) python diyebiliriz bir açık kaynak programı (Xpdf parçası). Ben herhangi bir sorun ile kullandım. Google google masaüstü kullanmak düşünüyorum.

Cevap 28/08/2008 saat 08:46
kaynak kullanıcı

oy
42

pyPdf (eğer iyi biçimlendirilmiş PDF çalışıyoruz varsayılarak) iyi çalışır. İstediğin (boşluklu) metin ise, tıpkı yapabilirsiniz:

import pyPdf
pdf = pyPdf.PdfFileReader(open(filename, "rb"))
for page in pdf.pages:
    print page.extractText()

Ayrıca kolayca benzeri meta veri, görüntü verilerine erişim alabilir ve.

extractText kodu notlarda bir yorum:

bunlar içerik akışında temin edilmektedir amacıyla, tüm metin çizim komutları bulun ve metin ekstrakte edin. Bu, kullanılan jeneratör bağlı olarak bazı PDF dosyaları için iyi çalışır, ancak kötü diğerleri için. Bu, gelecekte tasfiye edilecek. Bu fonksiyon daha sofistike yapılırsa o değişeceğinden, bu işlevin çıkan metnin düzenine güvenmeyin.

Olsun ya da olmasın bu bir sorun metin ile ne yaptığınızı bağlıdır (örneğin sırası önemli değilse, sorun değil, ya jeneratör çalnacaktr sırayla akışa metin eklerse, sorun değil) . Ben herhangi bir sorun olmadan, günlük kullanımda pyPdf çıkarma kodu var.

Cevap 07/09/2008 saat 03:47
kaynak kullanıcı

oy
1

Ayrıca orada PDFTextStream da Python kullanılabilecek bir ticari Java kütüphanesidir.

Cevap 12/11/2008 saat 16:08
kaynak kullanıcı

oy
21

Ayrıca oldukça kolay kitaplık olarak pdfminer kullanabilirsiniz. PDF içeriği modeline erişimi olan ve kendi metin çıkarma oluşturabilirsiniz. Aşağıdaki kod kullanılarak, yarı-kolon ayrılmış metin pdf içeriği dönüştürmek için yaptı.

fonksiyonu sadece kendi Y ve x, koordinatlara göre TextItem içerik nesneleri sıralar ve aynı y ile ürün ile aynı hat üzerinde nesneleri ayırmak, bir kısa çizgi olarak koordine verir ';' karakter.

Bu yaklaşımı kullanarak, başka hiçbir aracı ayrıca gelen ayrıştırma için uygun içerik çıkarabildiği bir pdf metin ayıklamak başardı. Denedim Diğer araçlar pdftotext, ps2ascii ve çevrimiçi araç pdftextonline.com sayılabilir.

pdfminer pdf kazıma için çok değerli bir araçtır.


def pdf_to_csv(filename):
    from pdflib.page import TextItem, TextConverter
    from pdflib.pdfparser import PDFDocument, PDFParser
    from pdflib.pdfinterp import PDFResourceManager, PDFPageInterpreter

    class CsvConverter(TextConverter):
        def __init__(self, *args, **kwargs):
            TextConverter.__init__(self, *args, **kwargs)

        def end_page(self, i):
            from collections import defaultdict
            lines = defaultdict(lambda : {})
            for child in self.cur_item.objs:
                if isinstance(child, TextItem):
                    (_,_,x,y) = child.bbox
                    line = lines[int(-y)]
                    line[x] = child.text

            for y in sorted(lines.keys()):
                line = lines[y]
                self.outfp.write(";".join(line[x] for x in sorted(line.keys())))
                self.outfp.write("\n")

    # ... the following part of the code is a remix of the 
    # convert() function in the pdfminer/tools/pdf2text module
    rsrc = PDFResourceManager()
    outfp = StringIO()
    device = CsvConverter(rsrc, outfp, "ascii")

    doc = PDFDocument()
    fp = open(filename, 'rb')
    parser = PDFParser(doc, fp)
    doc.initialize('')

    interpreter = PDFPageInterpreter(rsrc, device)

    for i, page in enumerate(doc.get_pages()):
        outfp.write("START PAGE %d\n" % i)
        interpreter.process_page(page)
        outfp.write("END PAGE %d\n" % i)

    device.close()
    fp.close()

    return outfp.getvalue()

GÜNCELLEME :

Yukarıdaki API eski bir sürümüyle karşı yazılır kod aşağıda benim yorumu görmek.

Cevap 24/11/2008 saat 13:20
kaynak kullanıcı

oy
130

PDFMiner beri paket değişti codeape yayınlanmıştır.

DÜZENLEME (tekrar):

PDFMiner sürümünde yeniden güncellendi 20100213

Eğer aşağıdaki yüklemiş sürümünü kontrol edebilirsiniz:

>>> import pdfminer
>>> pdfminer.__version__
'20100213'

İşte (G / eklenen değişti hakkında yorumlarla) güncellenmiş sürümü var:

def pdf_to_csv(filename):
    from cStringIO import StringIO  #<-- added so you can copy/paste this to try it
    from pdfminer.converter import LTTextItem, TextConverter
    from pdfminer.pdfparser import PDFDocument, PDFParser
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter

    class CsvConverter(TextConverter):
        def __init__(self, *args, **kwargs):
            TextConverter.__init__(self, *args, **kwargs)

        def end_page(self, i):
            from collections import defaultdict
            lines = defaultdict(lambda : {})
            for child in self.cur_item.objs:
                if isinstance(child, LTTextItem):
                    (_,_,x,y) = child.bbox                   #<-- changed
                    line = lines[int(-y)]
                    line[x] = child.text.encode(self.codec)  #<-- changed

            for y in sorted(lines.keys()):
                line = lines[y]
                self.outfp.write(";".join(line[x] for x in sorted(line.keys())))
                self.outfp.write("\n")

    # ... the following part of the code is a remix of the 
    # convert() function in the pdfminer/tools/pdf2text module
    rsrc = PDFResourceManager()
    outfp = StringIO()
    device = CsvConverter(rsrc, outfp, codec="utf-8")  #<-- changed 
        # becuase my test documents are utf-8 (note: utf-8 is the default codec)

    doc = PDFDocument()
    fp = open(filename, 'rb')
    parser = PDFParser(fp)       #<-- changed
    parser.set_document(doc)     #<-- added
    doc.set_parser(parser)       #<-- added
    doc.initialize('')

    interpreter = PDFPageInterpreter(rsrc, device)

    for i, page in enumerate(doc.get_pages()):
        outfp.write("START PAGE %d\n" % i)
        interpreter.process_page(page)
        outfp.write("END PAGE %d\n" % i)

    device.close()
    fp.close()

    return outfp.getvalue()

Düzen (yine):

İşte son sürümü için bir güncelleme olup pypi , 20100619p1. Kısacası ben değiştirilir LTTextItemile LTCharve CsvConverter yapıcısına LAParams bir örneğini geçti.

def pdf_to_csv(filename):
    from cStringIO import StringIO  
    from pdfminer.converter import LTChar, TextConverter    #<-- changed
    from pdfminer.layout import LAParams
    from pdfminer.pdfparser import PDFDocument, PDFParser
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter

    class CsvConverter(TextConverter):
        def __init__(self, *args, **kwargs):
            TextConverter.__init__(self, *args, **kwargs)

        def end_page(self, i):
            from collections import defaultdict
            lines = defaultdict(lambda : {})
            for child in self.cur_item.objs:
                if isinstance(child, LTChar):               #<-- changed
                    (_,_,x,y) = child.bbox                   
                    line = lines[int(-y)]
                    line[x] = child.text.encode(self.codec)

            for y in sorted(lines.keys()):
                line = lines[y]
                self.outfp.write(";".join(line[x] for x in sorted(line.keys())))
                self.outfp.write("\n")

    # ... the following part of the code is a remix of the 
    # convert() function in the pdfminer/tools/pdf2text module
    rsrc = PDFResourceManager()
    outfp = StringIO()
    device = CsvConverter(rsrc, outfp, codec="utf-8", laparams=LAParams())  #<-- changed
        # becuase my test documents are utf-8 (note: utf-8 is the default codec)

    doc = PDFDocument()
    fp = open(filename, 'rb')
    parser = PDFParser(fp)       
    parser.set_document(doc)     
    doc.set_parser(parser)       
    doc.initialize('')

    interpreter = PDFPageInterpreter(rsrc, device)

    for i, page in enumerate(doc.get_pages()):
        outfp.write("START PAGE %d\n" % i)
        if page is not None:
            interpreter.process_page(page)
        outfp.write("END PAGE %d\n" % i)

    device.close()
    fp.close()

    return outfp.getvalue()

DÜZENLEME (bir kez daha):

Sürümü için güncellenmiş 20110515(Oeufcoque Penteano sayesinde!):

def pdf_to_csv(filename):
    from cStringIO import StringIO  
    from pdfminer.converter import LTChar, TextConverter
    from pdfminer.layout import LAParams
    from pdfminer.pdfparser import PDFDocument, PDFParser
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter

    class CsvConverter(TextConverter):
        def __init__(self, *args, **kwargs):
            TextConverter.__init__(self, *args, **kwargs)

        def end_page(self, i):
            from collections import defaultdict
            lines = defaultdict(lambda : {})
            for child in self.cur_item._objs:                #<-- changed
                if isinstance(child, LTChar):
                    (_,_,x,y) = child.bbox                   
                    line = lines[int(-y)]
                    line[x] = child._text.encode(self.codec) #<-- changed

            for y in sorted(lines.keys()):
                line = lines[y]
                self.outfp.write(";".join(line[x] for x in sorted(line.keys())))
                self.outfp.write("\n")

    # ... the following part of the code is a remix of the 
    # convert() function in the pdfminer/tools/pdf2text module
    rsrc = PDFResourceManager()
    outfp = StringIO()
    device = CsvConverter(rsrc, outfp, codec="utf-8", laparams=LAParams())
        # becuase my test documents are utf-8 (note: utf-8 is the default codec)

    doc = PDFDocument()
    fp = open(filename, 'rb')
    parser = PDFParser(fp)       
    parser.set_document(doc)     
    doc.set_parser(parser)       
    doc.initialize('')

    interpreter = PDFPageInterpreter(rsrc, device)

    for i, page in enumerate(doc.get_pages()):
        outfp.write("START PAGE %d\n" % i)
        if page is not None:
            interpreter.process_page(page)
        outfp.write("END PAGE %d\n" % i)

    device.close()
    fp.close()

    return outfp.getvalue()
Cevap 10/08/2009 saat 19:47
kaynak kullanıcı

oy
5

pdfminer ile gelir pdf2txt.py kodunu repurposing; Eğer pdf yolunu alacak bir işlev yapabilir; isteğe bağlı olarak bir outtype (txt | html | xml | etiketi) ve komut PDF2TXT {: '/path/to/outfile.txt' ... '-o'} gibi seçmesi. Varsayılan olarak, arayabilirsiniz:

convert_pdf(path)

Bir metin dosyası orijinal pdf dosya sisteminde, bir kardeş oluşturulacaktır.

def convert_pdf(path, outtype='txt', opts={}):
    import sys
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter, process_pdf
    from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter, TagExtractor
    from pdfminer.layout import LAParams
    from pdfminer.pdfparser import PDFDocument, PDFParser
    from pdfminer.pdfdevice import PDFDevice
    from pdfminer.cmapdb import CMapDB

    outfile = path[:-3] + outtype
    outdir = '/'.join(path.split('/')[:-1])

    debug = 0
    # input option
    password = ''
    pagenos = set()
    maxpages = 0
    # output option
    codec = 'utf-8'
    pageno = 1
    scale = 1
    showpageno = True
    laparams = LAParams()
    for (k, v) in opts:
        if k == '-d': debug += 1
        elif k == '-p': pagenos.update( int(x)-1 for x in v.split(',') )
        elif k == '-m': maxpages = int(v)
        elif k == '-P': password = v
        elif k == '-o': outfile = v
        elif k == '-n': laparams = None
        elif k == '-A': laparams.all_texts = True
        elif k == '-D': laparams.writing_mode = v
        elif k == '-M': laparams.char_margin = float(v)
        elif k == '-L': laparams.line_margin = float(v)
        elif k == '-W': laparams.word_margin = float(v)
        elif k == '-O': outdir = v
        elif k == '-t': outtype = v
        elif k == '-c': codec = v
        elif k == '-s': scale = float(v)
    #
    CMapDB.debug = debug
    PDFResourceManager.debug = debug
    PDFDocument.debug = debug
    PDFParser.debug = debug
    PDFPageInterpreter.debug = debug
    PDFDevice.debug = debug
    #
    rsrcmgr = PDFResourceManager()
    if not outtype:
        outtype = 'txt'
        if outfile:
            if outfile.endswith('.htm') or outfile.endswith('.html'):
                outtype = 'html'
            elif outfile.endswith('.xml'):
                outtype = 'xml'
            elif outfile.endswith('.tag'):
                outtype = 'tag'
    if outfile:
        outfp = file(outfile, 'w')
    else:
        outfp = sys.stdout
    if outtype == 'txt':
        device = TextConverter(rsrcmgr, outfp, codec=codec, laparams=laparams)
    elif outtype == 'xml':
        device = XMLConverter(rsrcmgr, outfp, codec=codec, laparams=laparams, outdir=outdir)
    elif outtype == 'html':
        device = HTMLConverter(rsrcmgr, outfp, codec=codec, scale=scale, laparams=laparams, outdir=outdir)
    elif outtype == 'tag':
        device = TagExtractor(rsrcmgr, outfp, codec=codec)
    else:
        return usage()

    fp = file(path, 'rb')
    process_pdf(rsrcmgr, device, fp, pagenos, maxpages=maxpages, password=password)
    fp.close()
    device.close()

    outfp.close()
    return
Cevap 18/07/2010 saat 18:17
kaynak kullanıcı

oy
1

I '-xml' bağımsız değişken ile PDFTOHTML kullandık, pdf metinlerin her 'parçacığını' bölgesinin Koord, Y koordinatı, genişlik, yükseklik, ve yazı tipi X verecek subprocess.Popen () ile de sonucu okuyun. Bu aynı hata iletileri Kusmak çünkü 'evince' muhtemelen çok kullandığı olduğunu düşünüyorum.

Eğer sütunlu verileri işlemek gerekiyorsa size pdf dosyası uygun bir algoritma icat etmek zorunda olduğu, bu biraz daha karmaşıklaşıyor. Sorun PDF dosyalarını yapmak programlar gerçekten mutlaka herhangi mantıksal bir biçimde metni hazırlamak kalmamasıdır. Basit sıralama algoritmaları deneyebilir ve bazen çalışır, ancak biraz 'stragglers' ve 'cızırtı', sen onlar olur ... yani yaratıcı almak zorunda düşünce sıraya koymak alamadım metin parçaları olabilir.

Bu i üzerinde çalışıyordu pdf'deki için bir tane anlamaya bana 5 saat sürdü. Ama artık oldukça iyi çalışıyor. İyi şanslar.

Cevap 12/11/2010 saat 21:34
kaynak kullanıcı

oy
0

Bugün bu çözümü buldum. Benim için oldukça uygundur. Hatta PNG resimleri PDF sayfaların oluşturulması. http://www.swftools.org/gfx_tutorial.html

Cevap 30/01/2011 saat 23:22
kaynak kullanıcı

oy
16

slate Çok basit bir kütüphaneden PDFMiner kullanmak kılan bir projedir:

>>> with open('example.pdf') as f:
...    doc = slate.PDF(f)
...
>>> doc
[..., ..., ...]
>>> doc[1]
'Text from page 2...'   
Cevap 30/01/2011 saat 23:27
kaynak kullanıcı

oy
8

Bir piton modülü içinde düz metne belirli PDF dönüştürmek gerekiyordu. Ben kullanılan PDFMiner onların okuduktan sonra, 20110515 pdf2txt.py ben bu basit pasajı yazdığı aracı:

from cStringIO import StringIO
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams

def to_txt(pdf_path):
    input_ = file(pdf_path, 'rb')
    output = StringIO()

    manager = PDFResourceManager()
    converter = TextConverter(manager, output, laparams=LAParams())
    process_pdf(manager, converter, input_)

    return output.getvalue() 
Cevap 28/05/2013 saat 15:01
kaynak kullanıcı

oy
49

Bu çözümlerden için hiçbiri PDFMiner son sürümünü destekleyen beri PDFMiner kullanarak bir pdf metnini dönecektir basit bir çözüm yazdı. Bu ile ithalat hataları alıyorsanız olanlar için çalışacakprocess_pdf

import sys
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter
from pdfminer.layout import LAParams
from cStringIO import StringIO

def pdfparser(data):

    fp = file(data, 'rb')
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    # Create a PDF interpreter object.
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    # Process each page contained in the document.

    for page in PDFPage.get_pages(fp):
        interpreter.process_page(page)
        data =  retstr.getvalue()

    print data

if __name__ == '__main__':
    pdfparser(sys.argv[1])  

Python 3 için çalışıyor kod aşağıda verilmiştir:

import sys
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter
from pdfminer.layout import LAParams
import io

def pdfparser(data):

    fp = open(data, 'rb')
    rsrcmgr = PDFResourceManager()
    retstr = io.StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    # Create a PDF interpreter object.
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    # Process each page contained in the document.

    for page in PDFPage.get_pages(fp):
        interpreter.process_page(page)
        data =  retstr.getvalue()

    print(data)

if __name__ == '__main__':
    pdfparser(sys.argv[1])  
Cevap 04/02/2014 saat 20:16
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more