무거운 PDF를 Pythonista로 가볍고 분할한 이야기

이 기사는 Pythonista Advent Calendar 2017의 9 일째 기사입니다.

Pythonista에서 라이프 해킹을위한 작은 재료를 소개합니다.

개요





iPhone과 Pythonista를 사용하면 언제 어디서나 프로그래밍할 수 있습니다.
하지만 프릭 입력으로 Python Syntax를 계속 치는 것은, 에디터 지원이 있어도 유석에 힘들기 때문에,
  • Bluetooth 키보드
  • 벙커링

  • 라는 최소한의 기어를 조합하여 라이프 해킹하고 있습니다.

    📱 실제로 해보면?



    iPhone에서 프로그래밍해 보는 느낌은
  • 검색 할 때 iPhone을 손에 넣으면 블루투스 페어링 상태에서 소프트웨어 키보드가 숨어 어려워집니다
  • 화면 크기에 한계가있는 iPhone에서 문서를 보면서 앱을 오거나 내리는 것은 어렵습니다.

    이었다. iPad Pro와 SplitView를 사용하면 위의 문제를 해결할 수 있지만 iPad Pro는 외부로 가져 오지 않습니다 ...

    여러가지 시행착오하여 눈을 통하고 싶은 페이지나 문서를 PDF로 하여 종이의 자료로 하면,
    해결할 수 있는 것은? 라고 생각했습니다.

    📃 종이 자료에 인쇄



    iPhone에서 PDF를 인쇄하는 몇 가지 앱이 있지만,
    나는 집에 프린터를 가지고 있지 않기 때문에 편의점에서 인쇄 할 수있는 응용 프로그램을 자주 사용하고 있습니다.

    다만, 그 앱에 송신할 수 있는 PDF의 파일 사이즈가 6MB까지라는 제약이 있어, 대처에 곤란했습니다.
    따라서 PDF 분할 앱을 다운로드하거나 Mac에서 크기를 조정하고 다시 iPhone으로 되돌리는 것은
    덜 똑똑하지 않습니다.

    ...

    전치가 길어졌습니다.
    이 문제를 해결하기 위해 Pythonista를 사용하여 PDF 파일 크기를 6MB로 줄여서 분할합니다.

    🐍 Python으로 해결


    # -*- coding: utf-8 -*-
    
    import os
    import appex
    
    from PIL import Image
    from PyPDF2 import PdfFileWriter, PdfFileReader
    
    div = 6
    
    def imageWriter(page0):
        xObject = page0['/Resources']['/XObject'].getObject()
        for obj in xObject:
            if xObject[obj]['/Subtype'] == '/Image':
                size = (xObject[obj]['/Width'], xObject[obj]['/Height'])
                data = xObject[obj].getData()
                if xObject[obj]['/ColorSpace'] == '/DeviceRGB':
                    mode = "RGB"
                else:
                    mode = "P"
                if xObject[obj]['/Filter'] == '/FlateDecode':
                    img = Image.frombytes(mode, size, data)
                    img.save(obj[1:] + ".png")
                elif xObject[obj]['/Filter'] == '/DCTDecode':
                    with open(obj[1:] + ".jpg", "wb") as img:
                        img.write(data)
                elif xObject[obj]['/Filter'] == '/JPXDecode':
                    with open(obj[1:] + ".jp2", "wb") as img:
                        img.write(data)
    
    def main():
        src = appex.get_file_path() 
        src = PdfFileReader(src, 'rb')
        items = [range(i, min(i + div, src.numPages)) for i in range(0, src.numPages, div)]
    
        if not os.path.exists('pdf'): 
            os.mkdir('pdf')
    
        for i, lst in enumerate(items):
            dst = PdfFileWriter()
            for j in lst:
                dst.addPage(src.getPage(j))
                with open('pdf/%03d.pdf' % i, 'wb') as out:
                    dst.removeLinks()
                    dst.write(out)
    
    if __name__ == '__main__':
        main()
    

    PyPDF2 내에서 불필요한 메타데이터 삭제 페이지 수를 분할하여 파일당 크기를 6MB까지
    경량화하고 있습니다. Pythonista Documents의 pdf 폴더에 내보내집니다.

    PIL과 PyPDF2는 Pythonista built-in 모듈이므로 별도의 pip 설치
    필요가 없습니다. appex 모듈은 Pythonista 용 모듈이므로 다른 환경에서는
    os.path 모듈 등으로 읽어야 합니다.

    요약



    포켓에 들어가는 사이즈감으로 모바일 해킹 할 수 있는 것이 Pythonista 최대의 메리트이므로,
    궁리에 따라 무엇이든 할 수 있을 것 같습니다. 카페의 작은 테이블에서도 방해가 되지 않는 사이즈감입니다☕

    일상적인 작은 문제를 해결하는 수단으로서 Python의 작은 재료의 소개였습니다.
  • 좋은 웹페이지 즐겨찾기