[PYTHON] IndirectObject 추출을위한 pyPdf
PYTHONIndirectObject 추출을위한 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.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.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.Jehiah의 방법은 사물을 사방에서 바라 보는 것이 좋습니다. 내 생각 엔 (PDF를 보면) 항상 같은 장소 ( 'MC0'속성의 첫 번째 페이지)에 있으므로 문자열을 찾는 훨씬 간단한 방법은 다음과 같습니다.
Jehiah의 방법은 사물을 사방에서 바라 보는 것이 좋습니다. 내 생각 엔 (PDF를 보면) 항상 같은 장소 ( 'MC0'속성의 첫 번째 페이지)에 있으므로 문자열을 찾는 훨씬 간단한 방법은 다음과 같습니다.
import pyPdf pdf = pyPdf.PdfFileReader(open("file.pdf")) pdf.getPage(0)['/Resources']['/Properties']['/MC0']['/MYOBJECT'].getData()
from https://stackoverflow.com/questions/436474/pypdf-for-indirectobject-extraction by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 영구적 인 파이썬 하위 프로세스 (0) | 2018.11.17 |
---|---|
[PYTHON] Python line_profiler 코드 예제 (0) | 2018.11.17 |
[PYTHON] matplotlib 플롯에서 저장 버튼이 작동하지 않는 이유는 무엇입니까? (0) | 2018.11.17 |
[PYTHON] is_authenticated ()가 TypeError를 발생시킵니다. TypeError : 'bool'객체를 호출 할 수 없습니다. [duplicate] (0) | 2018.11.17 |
[PYTHON] Python pandas, 여러 행의 플로팅 옵션 (0) | 2018.11.17 |