読者です 読者をやめる 読者になる 読者になる

MyEnigma

とあるエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

スキャンpdf本の端末間共有ツールとしてGoogle Play Booksを使うと無料で便利という話

富士通 FUJITSU ScanSnap iX500 (A4/両面/Wi-Fi対応) FI-IX500A

富士通 FUJITSU ScanSnap iX500 (A4/両面/Wi-Fi対応) FI-IX500A

目次

 

はじめに

最近は

技術書や、一度読んだ小説などを

自炊(スキャン)してpdfにすることが多いです。

 

しかし、

データ量がかなり多くなってしまって、

データのバックアップ方法や、

iPadやiPhone, PCですぐにpdfを参照したい時などの

データの共有方法に悩んでいました。

(自分の場合は136冊のpdfで14GBほどデータがありました。)

 

おそらく、有料版のDropbox 1TBに加入していれば、

簡単にpdfファイルをバックアップし、

すべての端末でデータにアクセスすることができるので、

それが最も簡単で便利だと思います。

 

しかし、1TBも自分は使わないので、

Dropboxの有料版はもったいないなと考えると、

別の方法が必要でした。

 

そこで、最近#Rebuildfmで知った

Google Play Booksというサービスを使うと、

簡単に目的を達成できたので紹介したいと思います。

 

Google Play books

Google Play booksは、Googleが実施している

電子書籍サービスで、

マンガや本を購入することができますが、

実は自分のpdfファイルをアップロードして、

Googleのサーバにデータを保存し、

ブラウザやiOSのアプリ上から、pdfを閲覧することができます。

play.google.com

 

pdfをアップロードする方法は簡単で、

マイブックスのページの右上の

"ファイルをアップロード"ボタンを押して、

pdfファイルを選択するだけです。

 

閲覧用のiOSのアプリはこちらからダウンロードできます。

Google Play ブックス

Google Play ブックス

  • Google, Inc.
  • ブック
  • 無料

PC上からアップロードしたpdfも下記のように本棚に並び、

iPad上からダウンロードして見ることができます。

f:id:meison_amsl:20160206174729p:plain

 

ちなみに試していないですが、Android版では

pdfだけでなく、epubも読めるようです。

 

Google Play booksはかなり使いやすいですが、

下記のリンク先の情報のように注意点もあります。

ドキュメントをアップロードして読む(PDF、ePub) - Google Play ヘルプ

一つ目は、最大1000個のpdfしかアップロードできません。

二つ目は、一つのファイルは100MByte以下である必要があります。

 

一つ目はあまり問題ないかもしれませんが、

二つ目の100MBのサイズ制限は、

ページ数が多くて、読みやすい解像度のファイルの場合、

問題になることがあるので注意しましょう。

ちなみに自分の場合、200MBのファイルをアップロードした所、

エラーは出ませんでしたが、本の一覧に表示されませんでした。

 

大きなPDFファイルを自動分割するPythonスクリプト

上記のように、

サイズの大きいpdfファイルはアップロードできないですが、

pdfの画質を落とすと本が読みづらくなってしまいます。

 

そこで、

サイズの大きいpdfファイルを自動的に検知して、

そのpdfファイルを自動分割するpythonスクリプトを作りました。

コードはこちらです。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import glob
import math
import subprocess
import re

#==-User Parameter====
MAX_PDF_SIZE_MB=80

class PdfSplit:
    def __init__(self, fileName, resultpath):
        print("Split file name is "+fileName)

        #FileSizeCheck
        fsizeMB=float(os.path.getsize(fileName))/1000000 
        print("file size is "+str(fsizeMB)+" MB")

        if fsizeMB<=MAX_PDF_SIZE_MB:
            print("Not need split")
            return;

        nSplit=int(math.ceil(fsizeMB/MAX_PDF_SIZE_MB))
        print("nSplit:"+str(nSplit))

        nPage=self.GetPdfPageNumber(fileName)
        #  nPage=888
        print("nPage:"+str(nPage))
        if nPage==0:
            print("Error: cannot read page:"+fileName)
            return

        onePage=int(math.ceil(nPage/nSplit))
        print("onePage:"+str(onePage))

        #result path
        finalpath=resultpath+"/"+fileName[2:-4]
        print("finalpath:"+finalpath)

        #Page split
        startpage=1
        for i in range(nSplit):
            endpage=(i+1)*onePage
            if i==nSplit-1:
                endpage=nPage
            print "start page:"+str(startpage)+",endpage:"+str(endpage)

            cmd="pdftk "+fileName+" cat "+str(startpage)+"-"+str(endpage)+" output "+finalpath+"_"+str(i+1)+".pdf"
            #  pdftk 元ファイル名.pdf cat 開始ページ-終了ページ output 出力ファイル名.pdf
            p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            p.wait()
            stdout_data, stderr_data = p.communicate()
            print stderr_data

            startpage=endpage+1

    def GetPdfPageNumber(self,fileName):
        cmd="pdftk "+fileName+" data_dump"
        print cmd
        p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        #  p.wait()
        stdout_data, stderr_data = p.communicate()

        extracted=0

        count=0
        for strline in stdout_data.split("\n"):
            #  print strline
            #sample NumberOfPages: 344
            if "NumberOfPages" in strline:
                number = re.search("\d+",strline)
                extracted = number.group()
                break
            count+=1
            if count>=100:
                break
        return int(extracted)

class SplitManager():
    def __init__(self):
        print "init"

    def Main(self):
        #Create Result dir
        RESULT_DIR='results'
        if not os.path.isdir(RESULT_DIR):
            os.mkdir(RESULT_DIR)
 
        files = glob.glob('./*.pdf')
        for file in files:
            PdfSplit(file,RESULT_DIR)

if __name__ == '__main__':
    print __file__+" start!!"
    manager=SplitManager()
    manager.Main()

使い方としては、

まずはじめにpdftkをインストールして、

あとは、上記のスクリプトを

pdfファイルが集まったディレクトリ内にコピーして、

実行すればOKです。

 

サイズが大きいpdfファイルを自動検索して、

大きいファイルを分割して、

元のファイル名の末尾に連番がついたファイルを自動生成してくれます。

f:id:meison_amsl:20160206185010p:plain

ちなみに分割するサイズはパラメータとして、

プログラムの頭の方で設定しているので、

そちらを調整すると、より細かくpdfを分けることもできます。

 

Google Play Booksの改善してほしい所

以上のように、

手軽につかえて便利ですが、

いくつか残念な所もあります。

1. アップロードしたpdfをダウンロードできない

色々調べましたが、アップロードしたpdfを

再度ダウンロードする方法が見つかりませんでした。

これができるとpdfファイルのバックアップ置き場としても

使えるのですが。。

 

2. ページめくりの方向を設定できない

日本小説などの本は、

ページの方向が右から左ですが、

Google Play booksのiOSアプリは、

左から右めくりのUIになっているので、

日本語の本を読むとかなり違和感があります。

設定でページめくりの方向を設定させてほしいです。

 

3. 一個のpdfのデータのサイズが最大100MBしかアップロードできない

これは求めすぎかもしれませんが、

Google Photosでは無制限にデータをアップロードできるので、

Google Play Booksでも無制限に

アップロードできるようにしてもらえると嬉しいです。

 

4. pdf本の削除を複数選択できるようにしてもらいたい

現在はpdfファイルの削除は一つ一つしかできないので、

複数ファイルを選択して削除できると便利ですね。

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

富士通 FUJITSU ScanSnap iX500 (A4/両面/Wi-Fi対応) FI-IX500A

富士通 FUJITSU ScanSnap iX500 (A4/両面/Wi-Fi対応) FI-IX500A