2017-03-14 1 views
0

우리는 매일 PDF 파일을 우리에게 제공하고 이미지를 가져와야합니다. 예를 들어, 내가하고 싶은 것은 this PDF file I have의 이미지를 파이썬으로 되 돌린다. 우리가 얻는 대부분의 pdf 파일은 여러 페이지이며 각 임베디드 이미지를 별도의 파일로 내보내려고합니다. 대부분 jpeg 파일이 있지만 그 중 하나는 그렇지 않습니다.파이썬으로 압축을 풀고 zlib 데이터를 PDF 파일로 저장하십시오.

개체 5는 zlib 압축 스트림으로 포함됩니다. FltDecode로 표시되고 스트림 시작 부분이 zlib에서 전형적으로 사용되는 \ x78 \ x9c이기 때문에 압축 된 zlib입니다. 당신은 (일부)를 볼 수 있습니다 the hex dump here

질문은 어떻게 그것을 '수축'하고 결과 파일을 저장합니까?

지혜를 공유해 주셔서 감사합니다.

+0

예, 우리는 적어도 4 페이지 이상으로 하루에 수십 개의 pdf 파일을 제공합니다. 추출을 자동화하고 나를 믿어야합니다. –

+0

[this] (http://stackoverflow.com/questions/2693820/extract-images-from-pdf-without-resampling-in-python)을 확인하셨습니까? 그리고 인터넷 검색 (http://mikelynchgames.com/software-development/using-wand-to-extract-pngs-from-pdfs/)이 나를 주었다. –

+0

예, 지팡이를 사용하려고 할 때 (가장 쉬운 방법) 이유없이 내 전체 맥북이 충돌합니다. 또한 어쨌든 배포 할 서버에 라이브러리를 추가로 설치할 수 없습니다. 그래서, 지금은 [이 코드를 사용하고 있습니다.] (https://gist.github.com/DDecoene/4e91449572a473b278ec887ce61238b5)는 jpg 파일을 추출하지만 "\ x78 \ x9c"이미지는 무엇을해야할지 모르겠습니다. –

답변

0

나는 여러 곳에서 수색을 시도했지만 작동하지 못했습니다. 나는이 같은 데이터 압축을 관리 :

import zlib 
with open("MDL1703140088.pdf", "rb") as f: 
    pdf = f.read() 

image = zlib.decompress(pdf[640:69307]) 

640 ZLIB 헤더 (b'x\x9c') 위치이고 69307은 PDF 사양의 바닥 글과 같은 위치입니다. b'\nendstream\n'이 있습니다. 세부 정보는 the spec이고 유용한 Q & A는 here입니다. 그러나이 경우에는 decompress()이 압축되지 않은 데이터를 무시하는 것처럼 보이기 때문에 끝 위치를 생략 할 수 있습니다. 다음을 통해 확인할 수 있습니다.

decomp = zlib.decompressobj() 
image = decomp.decompress(pdf[640:]) 
print(decomp.unused_data) # starts from b'\nendstream\n 

지금까지는 그렇게 좋았습니다. 그러나 image을 PNG 파일에 쓸 때 이미지 뷰어에서 읽을 수 없습니다. 실제로 압축 해제 된 데이터는 매우 비어있는 것처럼 보입니다. 나는 PNG 헤더를 붙 였지만 행운은 없었다. 이봐, 너무 많아 ...

이전에 말했듯이 (이상하게도 내 의견은 누군가에 의해 삭제되었습니다), 기존의 다른 도구를 사용하는 것이 좋습니다. Acrobat을 사용할 수없는 경우 pdftopng (part of Xpdf)은 무엇입니까? pdftopng MDL1703140088.pdf .은 나에게 유효한 PNG 파일을 완벽하게 제공했습니다. 당연히 명령 줄 도구는 파이썬에서 실행될 수 있습니다.

+0

pdftopng를 사용하는 것이 좋습니다.하지만 (항상 존재하지만 거기에 있지는 않습니다.) D 실행할 서버에 라이브러리 나 도구를 추가 할 수 없습니다. 서버가 우리가 아닌 :( –

관련 문제