apache PDFboxをandroidで使えるかどうか試みた

apache PDFboxをandroidで使えるかどうか試みた。

[事前準備]

appのbuild.gradleのdependenciesに以下を追記した。

[結果]

以下の箇所でアプリが落ちる。

ログキャットには以下のエラーが表示される。

java.lang.NoClassDefFoundError: Failed resolution of: Ljava/awt/color/ColorSpace;

java/awt/color/ColorSpaceは、androidには含まれていないため発生する。

よって、現時点では、apache PDFBoxはandroidでは使用できないと思われる。

[解決策]

android向けのPDFboxがある。

ただし、開発が進行中のようです。

使用する場合

appのbuild.gradleのdependenciesに以下を追記する。

日本語の文字をPDFファイルに出力することができた。

画像の挿入を試みたが、やり方がわからなかったので、調べて試す必要がある。

 

androidのPDF関連のクラスでViewをPDFファイル出力ソース

androidのPDF関連のクラスを使ってViewをPDFファイル出力で使ったソースの一部です。
オプションメニューにボタンを追加して、それを押すと
バックグラウンドで、PDFファイルを作成します。
PDFファイル作成の負荷で、処理が時間がかかるためバックグラウンド(Thread)にしています。

 

   @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // TODO 自動生成されたメソッド・スタブ
        super.onCreateOptionsMenu(menu, inflater);
        MenuItem mitem0 = menu.add(Menu.NONE,0,0,"PDF出力");
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // TODO 自動生成されたメソッド・スタブ
        int id = item.getItemId();
        switch (id) {
            case 0:
                /*
                PDF出力 バックグランドで実行
                 */
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        outputPDF();
                    }
                }).start();
                break;
            case 1:
                break;
            default:
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    private void outputPDF() {
        final String FILENAME = "output.pdf";
        File fileMemo = null; //
        String sdPath;

        //外部ストレージの現在の状態をチェック
        String state = Environment.getExternalStorageState();
        //マウントされていて読み書きが可能かどうか確認
        if(Environment.MEDIA_MOUNTED.equals(state)){
            Log.v("読み書き","読み書き可能");
            //外部ストレージのパスを取得
            File extDir = Environment.getExternalStorageDirectory();
            sdPath = extDir.getPath();

            //保存先のパス
            String savePath = File.separator +"Download"+File.separator+
                    getActivity().getPackageName()+File.separator+
                    FILENAME;

            sdPath += savePath;
            Log.v("保存先",""+sdPath);

            //フォルダ作成
            fileMemo = new File(sdPath);
            fileMemo.getParentFile().mkdirs();
        }else{
            Log.v("エラー","エラー読み書き不可");
            return;
        }
        Log.v("START","STart Creating PDF File");
        FileOutputStream fileOutputStream=null;

        try {
            fileOutputStream = new FileOutputStream(fileMemo,true);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        PdfDocument document = new PdfDocument();
        PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(1080, 1920,1).create();
        PdfDocument.Page page = document.startPage(pageInfo);
        //View content = v.findViewById(R.id.scrolling_graph_1);
        v.draw((page.getCanvas()));
        document.finishPage(page);
        try {
            document.writeTo(fileOutputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // close the document
        document.close();
        Log.v("END","Finished Creating PDF File");
    }

 

androidのPDF関連のクラスを使ってViewをPDFファイル出力

androidのPDF関連のクラスについて。

API Level 19で追加された。(2013年)

▼android.graphics.pdf クラスは6つ

 

クラス名 説明
PdfDocument AndroidのコンテンツからPDFドキュメントを生成するクラス
PdfDocument.Page PDFドキュメントページを表すクラス
PdfDocument.PageInfo PdfDocument.Pageを記述するメターデータを表すクラス
PdfDocument.PageInfo.Builder PdfDocument.PageInfoを作るためのBuilder
PdfRenderer PDFドキュメントをレンダリングする
PdfRenderer.Page レンダリングのPDFドキュメントのページを表すクラス

 

Android developerのサイトのPdfDocumentクラスのページにのっていたサンプルをもとに

androidのアプリのViewからPDFファイルを作成してみました。

androidのViewからPDFを作成する場合には上記のクラスを使用する。

FragmentのonCreateView()で使っているViewからPDFを生成してみました。

ScrollViewを使用しています。

[画面]

Screenshot_20170319-193303
アプリの画面(View)をPDFファイルにできる。今回はFragmentの部分のViewをPDFファイルにした。 ただし、画面上に表示されている部分のみPDFファイルにすることができた。

 

 

 

PDF_Make
作成されたPDFの中身は、表示した部分のみとなった。ScrollViewで表示されていない部分はPDFファイル化されていない。ScrollViewを使わない場合で、一画面に収まる場合に使えそうです。

 

▼上記で使ったソースの一部

androidのPDF関連のクラスでViewをPDFファイル出力ソース

Ubuntu にNexus5をUSB接続してadbを実行

Ubuntuにadbをインストール


$ sudo apt-get install android-tools-adb

Nexus5をUSBでUbuntuPCと接続し”lsusb”コマンド実行

$ lsusb
Bus 002 Device 005: ID 18d1:4ee7 Google Inc.

Google Inc. の行を確認する。

$ cd /etc/udev/rules.d
$ sudo vi 51-android.rules

以下を追加する。

SUBSYSTEM==”usb”, ATTR{idVendor}==”18d1″,MODE=”0666″, GROUP=”plugdev”

nexus5をUSBケーブルに再度接続しなおす。

$ adb devices

接続できていることを確認する。

android 壁紙 wallpapermanager.setResourceした後あたりで 問題が発生したため システムUIが。。というメッセージが表示される

壁紙 wallpapermanager.setResourceした後あたりで 問題が発生したため システムUIが。。というメッセージが表示される。

 

wallpapermanager.setResourceして画像を壁紙にしているが

nexus5でアプリを実行してみたら

問題が発生したためシステムUIが終了しました

というアラートダイアログが表示される。

アプリはこちら。

紫陽花の壁紙です。

https://play.google.com/store/apps/details?id=com.jpn.oni.wallpaper.hydrangea.ajisai

 

インストール直後の1回目はでないことがあるようだが

2回目以降で壁紙設定時に

問題が発生したためシステムUIが終了しました

がでるようだ。

2連続とか壁紙を変更する場合は

間隔をあける必要があるのだろうか?

いちおう、レポートを送っておいた。

あとで見てみます。

 

いろいろ検索してみたが関連したサイトはなかった。

 

NASAのサイトにAstronomy Picture of the Dayというのがあり、

日替わりで素敵な画像を載せてくれている。

http://kurihara-n.hatenablog.com/entry/2013/10/24/222952

 

PHPでforで繰り返ししょり

PHPでforで繰り返し処理した。

for ($i = 0; $i <= 48; $i++) {
	echo $i."\n";
}

繰り替えししたいときはforです。

30分に一回実行したいときは以下のようにする。

for ($i = 0; $i <= 48; $i++) {
	echo $i."\n";

	//メインの処理
	mainToukou();

	//スリープ5秒
	//sleep(5);

	//スリープ30分 60*30=1800
	sleep(1800);

}

WireShirkでカラムを追加

WireShirkでカラムを追加できる。

画面上で右クリック
→colum preferenceを選択する

通常で表示されているカラムは以下の6つです。

No Number
Time Time
Source Source address
Protocol Source address
Length Packet length(bytes)
Info Infomation

カラム追加する方法
20150201_001

Field typeから選択
→Addボタンを押す