Linux(Ubuntsu)でDTMを始める手順

イントロダクション

最近、ノートパソコンのスペックが高くなって、気がついたら、自分のデスクトップPCよりもノートのほうがスペックが高くなり。。。
デスクっトプPCをUbutsuにしたところです。折角LinuxにしたのだからDTM用のPCにすることにしました。

Libux用LMMSの設定へ
でも、LMMSはLinuxでもWindowsでも動かせるということで、Googleとかクラウドもあるので、Windowsにインストールしようと思いました。

Windows用LMMSの設定へ

DTMの環境構築(Linux用)

Ubuntsuの画面がこんな感じです。

まずは音を出すための環境セットアップ

Linuxなので、はじめからインストールされているOSにデフォルトでセットされているアプリケーションをインストールすれば問題ないのでしょうが、スペック的な問題で必要最低限でインストールしたため
追加でインストールするものがあります。

スピーカーの設定と音確認

まずは下のアプリをインストールします。インストール済みの場合は飛ばして良いです。
ちなみに、インストールできていない場合は、設定アプリを開いたときに「サウンド」がありません。

PulxAudioをインストール

下のコマンドを叩きます。そして、コントローラも別個にインストールが必要です。

sudo apt install pulseaudio

PulseAudio Volume Controlをインストール

sudo apt install pavucontrol

これらがインストールできたら設定を行います。

スピーカーのセット

サウンドの設定画面で使用するデバイス(スピーカー)を選択して、テストして音が出ることを確認します。

LMMSの使い方を学ぶ

こちらのサイトでLMMSの使い方 を学習します。

LMMSのダウンロード

こちらのURLよりダウンロードサイトに移動できます。ダウンロードすると下のようなファイルができます。

AppImageファイルの展開

他のサイトを見るとダブルクリックでインストールできるようですが、自分のところはうまく行きませんでした。

なので下のように行いました。

  1. ダウンロードフォルダにAppImageをダウンロードする。

  2. ターミナルを開き以下を実行

    ./lmms-1.2.2-linux-x86_64.AppImage --appimage-extract
  3. 作成されたフォルダへ移動して「./AppRun」を実行

とりあえずはこんな感じです。

Windows用LMMSの設定

Windowsは簡単です。インストーラーをダウンロードして、インストールウィザードでサクッと行けます。

  1. ダウンロードページを開くLMMSの日本語サイトへ行きます

  2. インストーラーを起動する

  3. ウィンドウを進める

  4. インストール場所を指定する。初期設定は「C:\ProgramFiles」になる

  5. 最後にショートカットを作成するかを指定してインストール

  6. 今回は、ショートカットを作成しなかったので直接ショートカットを作成「C:\ProgramFiles」を開いて右クリック

  7. 実効時に初期設定の画面が表示されるが後で再設定可能

  8. 初期画面の表示

とりあえずはここまでです。

OpenOfficeでCSV出力するマクロを作る

イントロダクション

こちらの記事で、DBを作成しようとしていますが、尾¥登録するデータをどうするかで悩んだ結果。

依然作成した「地域情報一覧ページのデータ」を登録しようという結論に至りました。

CSVファイルを作る

地域情報一覧ページを作成しました、このページを作成するのにJSで表示するデータを作りましいた。これは、スプレッドシートになっているのですが、これからCSVファイルを作りたいと思います。

その前に、作成したマクロを実行するボタンの作り方を残しておきます。

ボタンの作成方法

マクロのためにJREを設定する

OpenOffice(Calc)

オープンオフィスを使用して、VBA的なプログラムが使えるのでそれを使用してデータを出力します。まずはOpenOfficeのセットアップです。

Java32bitをインストール

OpenOfficeは、32ビットで動いているようです。なので64ビット版ではなく32ビット版のJREが必要になります。
こちらのリンクから、ダウンロードおよびインストールできます。

インストールしたら、ProgramFiles(x86)野は以下にJavaフォルダができるので、その中のJREを選択します。
メニューの「ツール」→「オプション」→「OpenOffice」→「セキュリティ」を選択します。

マクロの作成

「マクロ」というのは、短髪で動く処理のことを指します。C言語でも「マクロ」がありますが、これもすぐに呼び出すことができる便利なものです。

マクロは、下のように複数の言語を使用できるようです。

マクロ起動用のボタンを作る

上部のメニュー、「表示」→「ツールバー」→「フォームコントロール」でコントロールを開きます。
ボタンを追加して、マクロを登録します。

マクロを作る

とりあえずは、こんなところです。次は、CSVファイルを出力するマクロを作りたいと思います。

ここで、はじめに作成したコードをベースにCSVファイルを出力するコードを作成したいと思います。


Sub Main

MsgBox "Hello"

End Sub

現状では、「Hello」とポップアップで文言を表示するだけのプログラムです。上記の動画で使用しているものです。

OpenOffice Calc1のコード

エクセルVBAのように、コードを書くにはどのように書いたら良いか、まとめます。

まずは、変数定義から必要になります。

Dim oSheet AS Object
Dim oCell AS Object
Dim oCell2 AS Object

今回取得したいのは、シートとセルです。なので、それぞれの変数を用意します。

シートを取得する

ズバリ下のコードです。引数にあるのは、シート名です。

oSheet = ThisComponent.Sheets.getByName("pref_mst")

「pref_mst」シートを取得します。

セルを取得する

同様に、「C2」のセルを取得する。

oCell = oSheet.getCellrangeByName("C2")

このセルに値をセットしたいので、下のように書きます。

oCell.String = "aaA"
oCell2.Value = 12

シート名を取得する

シート名を「oSheet.Name」で取得、「oCell.String = 」で値をセットする。

oCell.String = oSheet.Name

現状のコード

とりあえずは、ここまでコードを書きました。こんな感じでCSVファイルを出力する予定です。

Sub Main

Dim oSheet AS Object
Dim oCell AS Object
Dim oCell2 AS Object

' ****************
' 練習用のコード
' ****************

oSheet = ThisComponent.Sheets.getByName("pref_mst")
'oCell = oSheet.getCellrangeByName("C2")
'oCell.String = "aaA" ' 文字列をセット
'
'oCell2 = oSheet.getCellrangeByName("C3")
'oCell2.String = oSheet.Name

' シート数だけシートを取得する
Dim oEnum As Object
oEnum = oSheet.createEnumeration()

While(oEnum.hasMoreElements())
    '' シート取得
    'セルを取得
End While
End Sub

シートの内容を取得

ここまで来たら、あとはシートの中身を取得してデータ(カンマ区切り)をCSVファイルに出力するだけです。

変更点

いきなりですが、シートを取得するのに「Enumeration」がうまく使えなかったので、FOR文に切り替えて処理を行うことにしました。
ファイル内にある、シートの数を取得するのに下のようなコードを使用しました。

' ファイルの取得
doc = ThisComponent
' シート数の取得
count = doc.getSheets().count
' 全シートの取得
shList = doc.getSheets()

<変更前>

ループをするのにWhile文を使用していました。

While(oEnum.hasMoreElements())
    '' シート取得
    'セルを取得
End While

<変更後>

For i = 0 to count
    ・
    ・
    ・
Next i

コードの実装

ファイル内の全シートを取得までは実装できたので、次は取得したシートからデータの取得を行います。

シートの取得とファイルオープン

下のように書きました。シートの取得はインデックス指定で行います。これはシート数までループする形で実装しました。
そして、出力するファイル名はシート名+".csv"で定義、ファイルを開き、「Print #fileNum, line」で行を追加していきます。「#fileNum」はファイルを開いた時の番号です。これを基準にしてファイルオープンしているオブジェクトを管理するのかな?

    ' シートの取得
    sheet = shList.getByIndex(i)
    ' 出力ファイル名
    fileName = root + sheet.Name + ".csv"
    ' ファイルを開く
    Open fileName For Output As #fileNum

1行のデータを取得する

ズバリ下のようなコードで書きました。

    ' 1行分のデータを取得してファイル出力
    tmp = sheet.getCellByPosition(cellRow, cellColumn).getString

「cellRow」はシートの行番号を示し。「cellColumn」は列番号を示します。
つまりループの1回目はそれぞれの値が(0, 0)の状態から処理を開始します。

繰り返しの条件

1シートにつき、データのある分だけループするので、「セルの中身が空だったら・・・」という条件でループしました。
結局は変数「tmp」をうまく使ってやるところです。ここが一番苦労しました。

While(tmp <> "")

最終的なコード

REM  *****  BASIC  *****

Sub Main

dim doc as object
dim count as Integer
dim shList as object
dim sheet as object

doc = ThisComponent
count = doc.getSheets().count
shList = doc.getSheets()

' シートを順に取得する
dim root as String
root = "C:\Users\tak45\OneDrive\ドキュメント\sampleCode\Gotochi\data\"
dim fileName as String

' セルのポジション
Dim cellRpw as Integer
Dim cellColumn as integer

Dim line as String
Dim tmp as String

cellRow = 0
cellColumn = 0

Dim fileNum as Integer
fileNum = Freefile()

for i = 0 to count
    ' シートの取得
    sheet = shList.getByIndex(i)
    ' 出力ファイル名
    fileName = root + sheet.Name + ".csv"
    ' ファイルを開く
    Open fileName For Output As #fileNum

    tmp = ""
    line = ""

    ' 1行分のデータを取得してファイル出力
    tmp = sheet.getCellByPosition(cellRow, cellColumn).getString
    if tmp <> "" then
        line = tmp + ", "
    else
        exit for
    end if

    cellColumn = cellColumn + 1
    While(tmp <> "")
        tmp = sheet.getCellByPosition(cellColumn, cellRow).getString 
        if tmp <> "" then
            line = line + tmp + ", "
            cellColumn = cellColumn + 1
        else
            Dim resCount as Integer
            resCount = len(line) - 2
            line = Left(line, resCount)
            cellRow = cellRow + 1
            cellColumn = 0
            Print #fileNum, line
            tmp = sheet.getCellByPosition(cellColumn, cellRow).getString 
            line = ""
        end if

    WEnd
    cellRow = 0
    'ファイルを閉じる
    Close #fileNum

    if i = 2 then
        exit for
    end if

next i

End Sub

でわでわ。。。

SQL*Plusの使い方~基本からCSVファイルからデータをインポートするまで~

イントロダクション

OracleDBが無料でインストールしました。次は、ユーザーなどを作成し、そこからSQLを使って色々とやりたいので、データをインポートしたいと思います。今回は、その手順を書くことにしました。

Sql*Plusを使用する

現状としては、OracleDBをインストールして、SqlDeveloperをインストールして操作を行おうと思ったのですが、結局はSqlPlusを使うのが一番手っ取り早いということになりました。

SQL*Plusの使い方

オラクルのDBをインストールしたら、付随してくるのがこの*SqlPlus**です。コマンドで実行できるので、GUIでの操作よりも簡単に操作できます。
どのように簡単化というと、権限(ロール)による操作の可能不可能で惑わされないということです。

では早速学習を始めましょう。

まずは、ログイン

DBサーバーにアクセスして操作する」というのが基本的なスタンスになります。なので、前提としてアクセスするサーバーの情報を以下のように設定します。

ユーザー名:takunoji
パスワード:passwd

次のコマンドが使えるようです。しかし、パスワードが丸見えなので。。。

sqlplus ユーザー名/パスワード

次のコマンドを使用します。

sqlplus ユーザー名

ログイン後のコマンド

これを実行したらパスワードの入力を促されるのでそこで入力

そして、現在の使用しているDBを確認するのに「show con_name」で表示されるのがDB名で、「CDB or PDB」を見分けられる。

SQL> show con_name

そして、ログアウト

SQL> exit

環境変数について

Linuxの場合は下のような環境変数が必要になりますが、Windowsの場合は、レジストリにある値が使用されます。レジストリの値はインストール時にセットされます。

  1. ORACLE_BASE: OracleDBのインストールした場所
  2. ORACLE_HOME: セットアップファイル(setup.exe)を展開したディレクトリ(フォルダ)
  3. ORACLE_SID: データベースの名前(orclなど)
    ※Linuxの場合は、PATHに「${ORACLE_HOME}/bin」を追加しましょう。

ユーザー、サーバー、DBを指定するログイン

ログインするときのコマンド

sqlplus ユーザー名@サーバーURL:ポート番号/対象のデータベース

これを実行するときは下のような感じです。

sqplus system@localhost:1521/xepdb1

プラガブルデータベースの「XEPDB1」は自動で作成されるPDB(プラガブルデータベース)です。

動画を作成しました。こんな感じです。

プラガブルデータベースにアクセス

一度DBを切断して、再度アクセスします。

sqlplus system@localhost:1521/xepdb1

ユーザーの確認

下のSQLで一覧できます。

select username from all_users;

上のSQLでユーザーを確認したところ、作成したテストユーザーがいないので改めて作成します。

ユーザーの作成

ユーザー作成のSQL構文は以下の通りです。

CREATE USER ユーザー名 IDENTIFIED パスワード

それでは、実際に作成してみます。

ユーザ―に権限を付与します

各種権限がないと何も操作ができません。。。

  1. SESSION権限
    CREATE SESSION権限は、データベースに接続を許可するシステム権限です。

    grant create session to test;
  2. RESOURCE権限

    そのユーザーに関連付けられたスキーマで特定タイプのスキーマ・オブジェクトの作成、変更および削除を可能にします。このロールは開発者やスキーマ・オブジェクトの作成が必要なその他のユーザーにのみ付与されます。このロールにより、オブジェクト・システムの作成権限のサブセットが付与されます。たとえば、CREATE TABLEシステム権限は付与されますが、CREATE VIEW権限は付与されません。付与できる権限は、CREATE CLUSTER、CREATE INDEXTYPE、CREATE OPERATOR、CREATE PROCEDURE、CREATE SEQUENCE、CREATE TABLE、CREATE TRIGGER、CREATE TYPEのみです。

    grant resource to test;
  3. UNLIMITED TABLESPACE権限
    全ての表領域に対するサイズ無制限の表領域割当制限を付与する

    grant unlimited tablespace to test;

Sql*Plus起動後にDB接続

connect ユーザー名/パスワード as ロール

これを実行すると下のようになります。

connect sys/パスワード as sysdba

動画では下のようになります。

OracleDBの起動とシャットダウン

シャットダウンするコマンド

shutdown immediate

起動するコマンド

startup

動画では下のようになります。

プラガブルデータベースのみを停止

プラガブルデータベース(PDB)のみを停止する方法です。次のようなコマンドで実行します。

alter pluggable database <PDB名> close immediate

パスワードを忘れたとき

まずは、管理者権限でログインします。管理者のパスワードを忘れているとできません。。。

  1. sqlplusを起動する
    sqlplux /nolog
  2. SYSDBAでDBにアクセス
    connect sys as sysdba
  3. ユーザー一覧を確認する
    <全ユーザー>

    select username from all_users;
    select username from dba_users;
ALTER USER account IDENTIFIED BY password ACCOUNT UNLOCK;

SQL*Loaderを使う

この部分は、まだ作成中です。

コマンドの実行

それで、CSVデータをインポートするのに、SQLLoderが使える事を知りました。SqlPlusと一緒にインストールされているようです。
次のコマンドが使用できます。

sqlldr control=ファイル名(パス)

インポート用のコマンド

そして、DBにデータをインポートするのには、下のようなコマンドを使用します。

sqlldr (ユーザー名)/(パスワード)@(接続識別子) CONTROL=(制御ファイルへのパス) LOG=(ログファイルへのパス) BAD=(エラーファイルへのパス) skip=(読み飛ばすヘッダー行数)」

CSVファイルを作る

詳細に関しては、こちらの記事を参照ください。OpenOfficeを使用して、マクロを作成しました。作成方法に関しても記述しています。

OracleDBにインポート

使用するクライアント・アプリケーションは「Sqpl*Plus」です。コマンドで実行するので、GUIみたいな煩わしさがなく、シンプルに実行できます。
この部分は、現在作成中ですので少々お待ちください。

でわでわ。。。

EPUBファイルを解剖してみる~楽天工房のファイルを解剖する~

EPUBファイルとは

電子書籍用のファイルのことです。詳細は、こちらのサイトにあります。

電子書籍を執筆することも可能です。それを作るのに、HTMLとCSSの知識(というか存在していること)を持っていればいけそうです。

【EPUBファイルとは】

EPUB3とは、電子書籍のファイルフォーマット規格の1つEPUBの最新メジャーバージョンである。別項「EPUB」でも説明しているように、EPUBはIDPF(International Digital Publishing Forum:国際電子出版フォーラム)と言う電子出版・電子書籍に関わる国際的な標準化団体が仕様を策定し、普及促進をしているもので、EPUB3は2011年にリリースされた。
その後、EPUBでの解説にも書いたとおり、策定団体がIDPFからW3Cへ統合され、開発が進められている。
前回のebookpedia記事公開(2015年12月)以降、次のマイナーバージョンとなる3.1(2017年1月)がリリース、現在の最新は2019年5月にリリースされた3.2となる。

とあります。まぁ電子書籍を出版するのに使用するファイル形式だということです。

筆者の持っている電子書籍リーダー(Kindle(アマゾン), KOBO(楽天)etc ...)ではPDFとEPUBの両方を読むことができる。その中でEPUB形式の書籍は英語のものは対象の単語を長押しすることで意味を検索してくる機能がついている。すげー重宝します。

EPUBファイルを解剖してみる

なんでそんなことをするのか?というところですが、EPUBファイルを作成したいけど「どう作ればよいのか?」が知りたいのでこの記事を書くことにしました。つまり調べてそれをまとめるということです。

参照するのはGitbookのEPUB仕様ですがまともに日本語訳していませんでした。。。Google翻訳で読んだ方が全然いい感じでした。。。

結局こちらのページを参照します。W3Recommendation Reading Systems 3.3

概要

【概要】

EPUB® 3 は、デジタル出版物およびドキュメントの配布および交換フォーマットを定義します。EPUB 形式は、HTML、CSS、SVG、その他のリソースを含む、構造化されセマンティックに拡張された Web コンテンツを単一ファイル コンテナで配布するために表現、パッケージ化、エンコードする手段を提供します。
この仕様は、EPUB 3 読み取りシステム (EPUB 出版物をレンダリングするユーザー エージェント) の適合要件を定義します。

とりあえず、EPUBはZIPファイルで、mimetypeファイルは非圧縮でZIPファイルに追加する必要があるということがわかっています。

mimetypeに関して、「非圧縮で・・・」というのは次のコマンドでZIPファイルに追加するという意味でした。

zip -0X '○○.epub' mimetype
zip -0X '○○.epub' META-INF/container.xml * -x mimetype

楽天工房でアップロードするとエラーになりました。コマンドは下のものが正しいようです。

zip -0X '○○.epub' mimetype
zip -r '○○.epub' * -x mimetype

意味としては、以下の通りです。
1行目:「mimeypeファイルは非圧縮で○○.epubに追加」
2行目:「○○.epubにこのディレクトリ以下にあるものすべてを追加、ただしmimetypeを除く」

zip -0は無圧縮のゼロレベルを意味します。

「-X」というオプションを指定しないとエクストラ フィールドという余計な物がmimetypeなどに追加されて電子書籍のチェッカーはエラーと判定してしまいます。
「zip -0X ○○.epub META-INF/container.xml * -x mimetype」はmimetype以外のファイルを全てzip圧縮します。

解剖開始

参考にするEPUBファイルをダウンロードしてきます。
そのファイルをコピーして、拡張子を「zip」に変更します。展開して開くと下のようになります。

キーポイントとしては「META-INF/container.xml」ファイルです。
まずはこれを見てみます。

container.xml

「container.xml」は名称固定のファイルです。META-INFフォルダ配下に配置することがルール付けされています。

<?xml version='1.0' encoding='utf-8'?>
<container xmlns="urn:oasis:names:tc:opendocument:xmlns:container" version="1.0">
  <rootfiles>
    <rootfile media-type="application/oebps-package+xml" full-path="OEBPS/content.opf"/>
  </rootfiles>
</container>

どうやら、「full-path="OEBPS/content.opf"」を指定しているようです。でわこちらを見てみましょう。

content.opf

書籍の情報について書いてある設定ファイル。こちらに仕様が書いてある。

オープン・パッケージング・フォーマット(OPF)というらしい、そして「電子出版物のコンテンツを表現するための標準を記述しており、コンテンツの普及に対する障壁を軽減させることを目的としています。」とある。

<?xml version='1.0' encoding='UTF-8'?>

<package xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:opf="http://www.idpf.org/2007/opf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.idpf.org/2007/opf" unique-identifier="id" version="2.0">
  <metadata>
    <dc:rights>Copyrighted. Read the copyright notice inside this book for details.</dc:rights>
    <dc:identifier id="id" opf:scheme="URI">http://www.gutenberg.org/ebooks/16</dc:identifier>
    <dc:creator opf:file-as="Barrie, J. M. (James Matthew)">J. M. Barrie</dc:creator>
    <dc:title>Peter Pan</dc:title>
    <dc:language xsi:type="dcterms:RFC4646">en</dc:language>
    <dc:subject>Fantasy literature</dc:subject>
    <dc:subject>Peter Pan (Fictitious character) -- Fiction</dc:subject>
    <dc:subject>Never-Never Land (Imaginary place) -- Fiction</dc:subject>
    <dc:subject>Pirates -- Fiction</dc:subject>
    <dc:subject>Fairies -- Fiction</dc:subject>
    <dc:date opf:event="publication">2008-06-25</dc:date>
    <dc:date opf:event="conversion">2018-03-18T13:47:20.319743+00:00</dc:date>
    <dc:source>http://www.gutenberg.org/files/16/16-h/16-h.htm</dc:source>
  </metadata>
  <manifest>
    <item media-type="text/css" id="item1" href="pgepub.css"/>
    <item media-type="text/css" id="item2" href="0.css"/>
    <item media-type="text/css" id="item3" href="1.css"/>
    <!--Chunk: size=80460 Split on div-->
    <item media-type="application/xhtml+xml" id="item4" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-0.htm.html"/>
    <!--Chunk: size=63172 Split on div-->
    <item media-type="application/xhtml+xml" id="item5" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-1.htm.html"/>
    <!--Chunk: size=51622 Split on div-->
    <item media-type="application/xhtml+xml" id="item6" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-2.htm.html"/>
    <!--Chunk: size=55127 Split on div-->
    <item media-type="application/xhtml+xml" id="item7" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-3.htm.html"/>
    <!--Chunk: size=59859 Split on div-->
    <item media-type="application/xhtml+xml" id="item8" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-4.htm.html"/>
    <!--Chunk: size=71914-->
    <item media-type="application/xhtml+xml" id="item9" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-5.htm.html"/>
    <item media-type="application/x-dtbncx+xml" id="ncx" href="toc.ncx"/>
  </manifest>
  <spine toc="ncx">
    <itemref linear="yes" idref="item4"/>
    <itemref linear="yes" idref="item5"/>
    <itemref linear="yes" idref="item6"/>
    <itemref linear="yes" idref="item7"/>
    <itemref linear="yes" idref="item8"/>
    <itemref linear="yes" idref="item9"/>
  </spine>
</package>

各タグの調査

こちらのサイトにある内容で学習しました。

metadataタグ

    <dc:rights>Copyrighted. Read the copyright notice inside this book for details.</dc:rights>
    <dc:identifier id="id" opf:scheme="URI">http://www.gutenberg.org/ebooks/16</dc:identifier>
    <dc:creator opf:file-as="Barrie, J. M. (James Matthew)">J. M. Barrie</dc:creator>
    <dc:title>Peter Pan</dc:title>
    <dc:language xsi:type="dcterms:RFC4646">en</dc:language>
    <dc:subject>Fantasy literature</dc:subject>
    <dc:subject>Peter Pan (Fictitious character) -- Fiction</dc:subject>
    <dc:subject>Never-Never Land (Imaginary place) -- Fiction</dc:subject>
    <dc:subject>Pirates -- Fiction</dc:subject>
    <dc:subject>Fairies -- Fiction</dc:subject>
    <dc:date opf:event="publication">2008-06-25</dc:date>
    <dc:date opf:event="conversion">2018-03-18T13:47:20.319743+00:00</dc:date>
    <dc:source>http://www.gutenberg.org/files/16/16-h/16-h.htm</dc:source>
タグ名 意味 サンプル
dc:rights コピーライトを書く。 <dc:rights xml:lang="ja">ⓒ 2019, 保毛 </dc:rights>
dc:creator 作成者を書く。 <dc:creator opf:file-as="Barrie, J. M. (James Matthew)">J. M. Barrie</dc:creator>
dc:identifier 曖昧さのないものが必要とされる。URIやISBNなどが相当する。 <dc:identifier id="id" opf:scheme="URI">http://www.gutenberg.org/ebooks/16</dc:identifier>;
dc:title タイトルを書く。 <dc:title>Peter Pan</dc:title>
dc:language 資源がどの言語で書かれているのかを、RFC 3066の言語コード書式で書くのが望ましい。 <dc:language rdf:datatype="&dct;ISO639-2">jpn</dc:language>
dc:subject 資源の内容の話題。まとめられた語彙の中から使うことが望ましい。 <dc:subject rdf:datatype="&dcndl;NIISubject">情報学</dc:subject>
dc:date 資源に関する主要な出来事が起こった日付(更新日、作成日など)を記述する。ISO 8601(又はJIS X 0301)の書式に則ることが推奨される。 <dc:date rdf:datatype="&xs;#dateTime">2019-08-29T06:42+09:00</dc:date>
dc:source 資源が参照しているもの。公式な識別システムに従っている文字列や番号が望ましい。 <dc:source rdf:resource="URN:ISBN:978-4-10-353423-5"/>

manifestタグ

【引用】


manifestは必須(required)で、出版物を構成する全ファイルのリスト(例えば、コンテンツ・ドキュメント、スタイルシート、画像ファイル、組み込みフォント・ファイル、包含するスキーム)を提供しなければなりません(must)。manifest要素には、1つ以上のitem要素を含まなければなりません(must)。itemには、出版物の一部と見なされるドキュメント、画像ファイル、スタイルシートやその他の構成要素をそれぞれ記述します。manifestには、OPFパッケージ・ドキュメントの構成ファイルを参照するitem要素を含んではなりません(must not)。

itemタグで参照するドキュメントの内容を定義しているようです。

  • CSSファイルの指定
  • HTMLファイルの指定
  <manifest>
    <item media-type="text/css" id="item1" href="pgepub.css"/>
    <item media-type="text/css" id="item2" href="0.css"/>
    <item media-type="text/css" id="item3" href="1.css"/>
    <!--Chunk: size=80460 Split on div-->
    <item media-type="application/xhtml+xml" id="item4" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-0.htm.html"/>
    <!--Chunk: size=63172 Split on div-->
    <item media-type="application/xhtml+xml" id="item5" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-1.htm.html"/>
    <!--Chunk: size=51622 Split on div-->
    <item media-type="application/xhtml+xml" id="item6" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-2.htm.html"/>
    <!--Chunk: size=55127 Split on div-->
    <item media-type="application/xhtml+xml" id="item7" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-3.htm.html"/>
    <!--Chunk: size=59859 Split on div-->
    <item media-type="application/xhtml+xml" id="item8" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-4.htm.html"/>
    <!--Chunk: size=71914-->
    <item media-type="application/xhtml+xml" id="item9" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-5.htm.html"/>
    <item media-type="application/x-dtbncx+xml" id="ncx" href="toc.ncx"/>
  </manifest>

spineタグ

【引用】


manifestの後には、spine素が1つだけなければならず(must)、これには1つ以上のitemref要素が含まれます。個々のitemrefは、manifestで指定されているOPSコンテンツ・ドキュメントを参照します。itemref要素の順序は、出版物で読まれる順序で関連するOPSコンテンツ・ドキュメントを編成します。

  <spine toc="ncx">
    <itemref linear="yes" idref="item4"/>
    <itemref linear="yes" idref="item5"/>
    <itemref linear="yes" idref="item6"/>
    <itemref linear="yes" idref="item7"/>
    <itemref linear="yes" idref="item8"/>
    <itemref linear="yes" idref="item9"/>
  </spine>

spineタグのtoc属性のncxは「宣言型目次」を示しているようだ。
linearは「linear="no"を設定し、これらのコンテンツのドキュメントが補助的であると指定」のようにnoなら補助的になるようだ。

JavaでPDFを作成するライブラリ~ASPOSEを使ってみる~

イントロダクション

電子書籍を作成するのにも普通に資料を作成するのにも使用できる。PDFを作成するプログラムを組みたいと思いAspose.PDFを見つけました。

つまるところは、作成したドキュメントをPDFにするプログラムを作ろうと思った次第です。

Aspose.PDF API

まずは使い方を学ぶとして、このチュートリアルをやってみようと思います。

下のコードはこちらにある内容です。細かいところが違いますが、シンプルにPDFファイルを出力しています。出力結果としては、下のようなものが出ました。

    public static void main(String[] args) {
        Document doc = new Document();
        Page page = doc.getPages().add();
        page.getParagraphs().add(new TextFragment(
                "Hello This is a test"));
        doc.save("Hello.pdf");
    }

出力した後に赤い文字があるのでそれが、不要です。なので別なものを使用することにしました。

ポールジーグマン

こちらのサイトのEpublibというライブラリがあるので使ってみることにします。
そして、このページにあるコードを実行してみたら、このような出力が得られました。
まともな、物ができたのでよしとしました。実行したコードは下のようなものです。

   public static void main(String[] args) {
        try {
            // Create new Book
            Book book = new Book();
            Metadata metadata = book.getMetadata();

            // Set the title
            metadata.addTitle("EPUB4J test book 1");

            // Add an Author
            metadata.addAuthor(new Author("Joe", "Tester"));

            final String ROOT = "src/main/resources";
            // Set cover image
            book.setCoverImage(
                    getResource(ROOT + "/book1/test_cover.png", "cover.png"));

            // Add Chapter 1
            book.addSection("Introduction",
                    getResource(ROOT + "/book1/chapter1.html", "chapter1.html"));

            // Add css file
            book.getResources().add(
                    getResource(ROOT + "/book1/book1.css", "book1.css"));

            // Add Chapter 2
            TOCReference chapter2 = book.addSection( "Second Chapter",
                    getResource(ROOT + "/book1/chapter2.html", "chapter2.html"));

            // Add image used by Chapter 2
            book.getResources().add(
                    getResource(ROOT + "/book1/flowers_320x240.png", "img/gardening.png"));

            // Add Chapter2, Section 1
            book.addSection(chapter2, "Chapter 2, section 1",
                    getResource(ROOT + "/book1/chapter2_1.html", "chapter2_1.html"));

            // Add Chapter 3
            book.addSection("Conclusion",
                    getResource(ROOT + "/book1/chapter3.html", "chapter3.html"));

            // Create EpubWriter
            EpubWriter epubWriter = new EpubWriter();

            // Write the Book as Epub
            epubWriter.write(book, new FileOutputStream("test1_book1.epub"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

PDFファイルを出力する

しかし、PDFファイルの出力には、文字コードの設定が必要なのかわかりませんが、ちゃんと出力されませんでした。
実行したコードは下のようなものです。

    public static void main(String[] args) throws IOException {
        File html = new File(ROOT + "chapter3.html");
        org.jsoup.nodes.Document document = Jsoup.parse(html, "UTF-8");
        document.outputSettings().syntax(Document.OutputSettings.Syntax.xml);

        File outputPdf = new File("testPdf.pdf");
        try (OutputStream outputStream = new FileOutputStream(outputPdf)) {
            ITextRenderer renderer = new ITextRenderer();
            SharedContext sharedContext = renderer.getSharedContext();
            sharedContext.setPrint(true);
            sharedContext.setInteractive(false);
            renderer.setDocumentFromString(document.html());
            renderer.layout();
            renderer.createPDF(outputStream);
        }
    }

半角の文字のみが出力されていました。これはもう少し学習する必要があります。

調査をします。

最終的には、テキストファイルから、PDFにする事ができると良いと思ってます。