복붙노트

[PYTHON] IndirectObject 추출을위한 pyPdf

PYTHON

IndirectObject 추출을위한 pyPdf

이 예제에 따라 모든 요소를 ​​pdf 파일에 나열 할 수 있습니다.

import pyPdf
pdf = pyPdf.PdfFileReader(open("pdffile.pdf"))
list(pdf.pages) # Process all the objects.
print pdf.resolvedObjects

지금, 나는 비표준 객체를 pdf 파일에서 추출해야한다.

내 개체는 MYOBJECT라는 문자열이고 문자열입니다.

나를 염려하는 python 스크립트에 의해 인쇄 된 부분은 다음과 같습니다.

{'/MYOBJECT': IndirectObject(584, 0)}

pdf 파일은 다음과 같습니다.

558 0 obj
<</Contents 583 0 R/CropBox[0 0 595.22 842]/MediaBox[0 0 595.22 842]/Parent 29 0 R/Resources
  <</ColorSpace <</CS0 563 0 R>>
    /ExtGState <</GS0 568 0 R>>
    /Font<</TT0 559 0 R/TT1 560 0 R/TT2 561 0 R/TT3 562 0 R>>
    /ProcSet[/PDF/Text/ImageC]
    /Properties<</MC0<</MYOBJECT 584 0 R>>/MC1<</SubKey 582 0 R>> >>
    /XObject<</Im0 578 0 R>>>>
  /Rotate 0/StructParents 0/Type/Page>>
endobj
...
...
...
584 0 obj
<</Length 8>>stream

1_22_4_1     --->>>>  this is the string I need to extract from the object

endstream
endobj

내 문자열 (물론 pyPdf 아래)을 참조하기 위해 584 값을 따를 수 있습니까?

해결법

  1. ==============================

    1.pdf.pages의 각 요소는 사전이므로 페이지 1에 있다고 가정하면 pdf.pages [0] [ '/ MYOBJECT']가 원하는 요소 여야합니다.

    pdf.pages의 각 요소는 사전이므로 페이지 1에 있다고 가정하면 pdf.pages [0] [ '/ MYOBJECT']가 원하는 요소 여야합니다.

    개별적으로 인쇄하거나 도움말 및 dir을 사용하여 원하는 문자열을 얻는 방법에 대한 자세한 내용은 파이썬 프롬프트에서 직접 시도 할 수 있습니다.

    편집하다:

    pdf 사본을받은 후 pdf.resolvedObjects [0] [558] [ '/ Resources'] [ '/ Properties'] [ '/ MC0'] [ '/ MYOBJECT']에서 개체를 찾았습니다. getData ()를 통해 검색 할 수 있습니다.

    다음 함수는 문제의 키를 반복적으로 찾는 것으로 이것을 해결하는보다 일반적인 방법을 제공합니다

    import types
    import pyPdf
    pdf = pyPdf.PdfFileReader(open('file.pdf'))
    pages = list(pdf.pages)
    
    def findInDict(needle,haystack):
        for key in haystack.keys():
            try:
                value = haystack[key]
            except:
                continue
            if key == needle:
                return value
            if type(value) == types.DictType or isinstance(value,pyPdf.generic.DictionaryObject):  
                x = findInDict(needle,value)
                if x is not None:
                    return x
    
    answer = findInDict('/MYOBJECT',pdf.resolvedObjects).getData()
    
  2. ==============================

    2.IndirectObject는 동일한 객체가 여러 위치에 나타날 때 PDF의 전체 크기가 줄어들 수 있도록 링크 또는 별칭과 같은 실제 객체를 나타냅니다. getObject 메소드는 실제 객체를 제공합니다.

    IndirectObject는 동일한 객체가 여러 위치에 나타날 때 PDF의 전체 크기가 줄어들 수 있도록 링크 또는 별칭과 같은 실제 객체를 나타냅니다. getObject 메소드는 실제 객체를 제공합니다.

    객체가 텍스트 객체 인 경우 객체에 str () 또는 unicode ()를 수행하면 객체 내부의 데이터를 가져와야합니다.

    또는 pyPdf는 resolvedObjects 특성에 개체를 저장합니다. 예를 들어이 객체가 포함 된 PDF는 다음과 같습니다.

    13 0 obj
    << /Type /Catalog /Pages 3 0 R >>
    endobj
    

    이것으로 읽을 수 있습니다 :

    >>> import pyPdf
    >>> pdf = pyPdf.PdfFileReader(open("pdffile.pdf"))
    >>> pages = list(pdf.pages)
    >>> pdf.resolvedObjects
    {0: {2: {'/Parent': IndirectObject(3, 0), '/Contents': IndirectObject(4, 0), '/Type': '/Page', '/Resources': IndirectObject(6, 0), '/MediaBox': [0, 0, 595.2756, 841.8898]}, 3: {'/Kids': [IndirectObject(2, 0)], '/Count': 1, '/Type': '/Pages', '/MediaBox': [0, 0, 595.2756, 841.8898]}, 4: {'/Filter': '/FlateDecode'}, 5: 147, 6: {'/ColorSpace': {'/Cs1': IndirectObject(7, 0)}, '/ExtGState': {'/Gs2': IndirectObject(9, 0), '/Gs1': IndirectObject(10, 0)}, '/ProcSet': ['/PDF', '/Text'], '/Font': {'/F1.0': IndirectObject(8, 0)}}, 13: {'/Type': '/Catalog', '/Pages': IndirectObject(3, 0)}}}
    >>> pdf.resolvedObjects[0][13]
    {'/Type': '/Catalog', '/Pages': IndirectObject(3, 0)}
    
  3. ==============================

    3.Jehiah의 방법은 사물을 사방에서 바라 보는 것이 좋습니다. 내 생각 엔 (PDF를 보면) 항상 같은 장소 ( 'MC0'속성의 첫 번째 페이지)에 있으므로 문자열을 찾는 훨씬 간단한 방법은 다음과 같습니다.

    Jehiah의 방법은 사물을 사방에서 바라 보는 것이 좋습니다. 내 생각 엔 (PDF를 보면) 항상 같은 장소 ( 'MC0'속성의 첫 번째 페이지)에 있으므로 문자열을 찾는 훨씬 간단한 방법은 다음과 같습니다.

    import pyPdf
    pdf = pyPdf.PdfFileReader(open("file.pdf"))
    pdf.getPage(0)['/Resources']['/Properties']['/MC0']['/MYOBJECT'].getData()
    
  4. from https://stackoverflow.com/questions/436474/pypdf-for-indirectobject-extraction by cc-by-sa and MIT license