pdftoepub's Introduction
■ ビルド方法 # Debian wheezy でビルド・動作を確認しています # Packages apt-get install git pkg-config automake libtool bzip2 autoconf gettext make g++ zip unzip apt-get install libxext-dev libcurl4-openssl-dev imagemagick libmagickcore-dev zlib1g-dev libpng12-dev libfreetype6-dev libglib2.0-dev poppler-data pango-graphite libjpeg-dev libxrender-dev libfontconfig1-dev libopenjpeg-dev libxcb-render-util0-dev libxcb-render0-dev libpoppler-glib-dev libxml2-dev libgtk2.0-dev libgtk2.0 liblcms2-dev libhtml-html5-entities-perl libgconf2-4 libjpeg-progs apt-get install php php-mysql php-sybase php-imagick php-pear php-dev libssh2-1 libssh2-1-dev pear install Archive_Tar apt-get install libxi-dev freeglut3-dev apt-get install libossp-uuid-perl libarchive-zip-perl libxml-xpath-perl libimage-size-perl perlmagick uuid-dev cpan install Data::UUID XML::XPath Image::Size Archive::Zip File::Copy::Recursive HTML::HTML5::Entities apt-get install openjdk-7-jre apt-get install ruby1.9.1 bundler # 以下のコマンドでGitによりpoppler, freetype2, mupdf, pdftoepubのソースを取得します。 git clone https://github.com/miyabe/poppler.git git clone git://git.sv.nongnu.org/freetype/freetype2.git git clone https://github.com/ArtifexSoftware/mupdf git clone https://github.com/miyabe/pdftoepub.git # ビルドの準備のために、以下の環境変数を設定しておきます。 export POPPLER_DIR=[POPPLERのディレクトリのパス] export PDFTOEPUB_DIR=[PDFTOEPUBのディレクトリのパス] export FREETYPE_DIR=[FREETYPEのディレクトリのパス] export MUPDF_DIR=[FREETYPEのディレクトリのパス] # 例えばfooディレクトリにpixman, cairo, popplerを落とした場合は、fooディレクトリ内で以下を実行します。 export POPPLER_DIR=`pwd`/poppler export PDFTOEPUB_DIR=`pwd`/pdftoepub export FREETYPE_DIR=`pwd`/freetype2 export MUPDF_DIR=`pwd`/mupdf # pkg-configのための環境変数を設定。 export PKG_CONFIG_PATH=$POPPLER_DIR export PKG_CONFIG_TOP_BUILD_DIR= pkg-config --cflags cairo poppler-glib # 実行時のライブラリパスを設定。 export LD_LIBRARY_PATH=$POPPLER_DIR/glib/.libs:$FREETYPE_DIR/objs/.libs # freetypeをビルド cd $FREETYPE_DIR ./autogen.sh make clean ./configure make # popplerをビルド cd $POPPLER_DIR mkdir build cd build cmake .. make # mupdfをビルド cd $MUPDF_DIR git submodule update --init make clean make # pdftoepubをビルド cd $PDFTOEPUB_DIR make ■ パッケージツール 実行にはimagemagickが必要です。 あらかじめ、次のディレクトリ構成を準備しておいてください [ID]は書誌IDです。 [ID]/[ID].xml -書誌データXML [ID]/m_[ID].xml -サンプル属性XML [ID]/appendix -追加データ [ID]/textlinks.txt -リンクの設定 変換対象のPDFは次の2通りの配置方法があります。 全てのページを1つのPDFにまとめる場合: [ID]/[ID].pdf 1ページ1PDFに分割する場合: [ID]/magazine/00001.pdf [ID]/magazine/00002.pdf ... ・pdftoepub.pl ディレクトリ名 出力先 [-view-height ビュー高さ] [-dpi 解像度] [-aaVector yes|no] [-program poppler|mupdf [pages]] \ [-quality 画質] [-png] [-epub2] [-kobo] [-ibooks] [-kindle] [-imagespine] [-skipBlankPage] [-sample] [-no-initial-scale] \ [-thumbnail-height サムネイル高さ] [-extractcover] [-cover-in-toc] [-use-folders] PDFからEPUBを生成するPerlスクリプトです。 ディレクトリ名の最後に / を付けると、さらにディレクトリ中にある複数のディレクトリを処理します。 [ID]/appendix内にはPDFに追加で格納するファイルを入れてください。 サポートするファイルは音声(.mp3, .mp4)です。 appendix直下のデータがepubのアーカイブのルートの直下に格納されます。 [ID]/textlinks.txtは ページ番号,テキスト,URL という形式のUTF-8エンコーディングのCSVで記述してください。 指定したページの、テキストに一致する部分にURLに対するリンクを設定します。 ページ番号は、分割されていないPDFに対しては必ず1から開始します。 実行中に /tmp/pdftoepub-[プロセスID] というファイルが生成されます。正常終了した時点で、このファイルは削除されます。 エラーなど異常終了した場合はこのファイルは残り続けます。 -view-height, -aaVectorオプションはコマンドラインの最後に付けて下さい。 -view-heightは、画像の高さをピクセル数で指定します。デフォルトは2048です。画像の幅は常に1536までに制限されます。 -dpiは出力結果の解像度をdpi単位で指定します。 -view-heightと-dpiの両方を指定すると、後のほうが優先されます -aaVectorは、文字以外のオブジェクトをアンチエイリアスするかどうかを指定します。 デフォルトはyesでアンチエイリアスをしますが、noを指定するとアンチエイリアスをしません。 -programは、PDFから画像に変換するプログラムを指定します。 popplerまたはmupdfのいずれかを指定可能です。デフォルトはpopplerです。 [pages]に、カンマ区切りのページを指定することができます。ページを指定すると、そのページだけ指定したプログラムで処理されます。 0ページは表紙で、本文は1ページから開始します。 -qualityは、JPEG画像のデフォルト画質で、1から100の値を設定します。デフォルトは98です。PNGには無関係です。 -pngを付けるとPNG形式で出力します。 -epub2を付けるとEPUB2互換形式で出力します。各ページはXHTMLになります。 -koboを付けると画像の中寄せ位置調整をしません。 -ibooksを付けるとOPFに<meta property="ibooks:binding">false</meta>タグを加えます。XHTMLのviewportはwidth=device-widthとなります。 -kindleを付けるとXHTMLに<meta name="primary-writing-mode" content="horizontal-rl"/>タグを加えます(-epub2出力かnav.xhtmlのみ)。 -imagespineを付けると、各ページが画像になります。これはEPUBとしては不正なものになります。 -skipBlankPageを付けると、XMLよりブランク(PageKbn=3または99)とされたページを飛ばします(出力しません)。 -skipBlankPageを付けない場合、ブランクページを出力します。 BlankImage/blank.pdfがあれば、それをブランクページとして使います。それがない場合は直前のページを、さらにそれもない場合は直後のページを白塗したものをブランクページとします。 -sampleを付けると、表紙とサンプルページだけ出力します。 -no-initial-scaleを付けると、ビューポートにinitial-scaleを設定しません。 -thumbnail-heightは、表紙サムネイルの高さをピクセル数で指定します。デフォルトは480です。 -previewPageOrigin 0をつけると、XMLのPreviewPageが0ベースとなります。デフォルトでは1ベースです。 -forceintを付けると、SVGのrectタグの座標値を四捨五入して整数にします。 -extractcoverを付けると、PDFの最初のページをカバーとして扱い、PDFの2ページ目が本文の1ページとなります。 このオプションは全てのページを1つのPDFにまとめる場合だけ有効です。 -cover-in-tocを付けると、表紙を「表紙」という名前で目次の先頭に入れます。 書誌データXMLにStartPageが1の目次項目が既にある場合は何もしません。 -use-foldersを付けると画像等を別のディレクトリに格納します。各ページはXHTMLになります。 戻り値:単一ファイルを処理する場合 成功した場合 0 エラー発生時 -1 ディレクトリを指定した場合は常に 0 が戻ります ・epub-package.pl ディレクトリ名 ディレクトリをZIPにまとめてEPUBを生成します。 ・pdf-images.pl ディレクトリ名 PDF中の画像を抽出してサイズを調べます。 ディレクトリ名の最後に / を付けると、さらにディレクトリ中にある複数のディレクトリを処理します。 抽出した画像は各ディレクトリのwork/imagesに出力されます。 画像サイズは標準出力に出力されます。 ・generate-sample.pl ディレクトリ名 出力先 サンプル画像、サムネイルを生成します ディレクトリ名の最後に / を付けると、さらにディレクトリ中にある複数のディレクトリを処理します。 ・epubtojson.php [-xml 書誌情報XMLファイル] [-resolution 解像度] EPUBファイル 出力先ディレクトリ EPUBファイルから配信フォーマットを生成します。 実行には、PHP, Imagemagick. Archive_Tarが必要です。 Ubuntu/Debianでは php5-imagick パッケージをインストールして下さい。 また、以下のコマンドでPearからArchive_Tarをインストールしてください。 sudo pear install Archive_Tar meta.jsonのデータ ItemId -EPUBファイル名の XXXX_eEPUB3.epub の XXXX の部分 ISBN -EPUBのopfのdc:identifier JDCN -EPUBのopfのdc:identifier BookId -EPUBのopfのdc:identifier ItemNamedc -EPUBのopfの:title PublisherName -EPUBのopfのdc:publisher Authors -EPUBのopfのdc:publisherおよびdc:creator PageNumber -EPUBのopfのopf:spine内のopf:itemrefの数 SamplePageRange -書誌情報XMLのPreviewPageで最も範囲が広いもの UpdateDateTime -JSON出力時の時刻 TOC -EPUBのncxまたはnavファイル PageInfo -EPUBのopfのopf:meta(property属性が"rendition:spread"のもの)とopf:manifestおよびopf:spine内の情報。colorは画像の平均彩度から判定 PageFlipDirection -EPUBのopfのopf:spineのpage-progression-direction属性 Resolution - -resolutionオプションの値。-resolutionオプションを省略した場合は1600。-resolutionオプションに0を指定した場合は出力しない。 thumbnail.jpgファイル -EPUBのカバーページまたは最初のページの縮小画像 images -各ページの縮小画像 ■ patchesに含まれるパッチ epub-patch.pl EPUBファイル EPUBファイルのOPFのitemrefのproperties(ページの右左)が単純に互い違いになっていたものを、SVGのファイル名によるページ番号に合わせて修正します。 epub-patch2.pl EPUBファイル 各SVGに含まれる画像をlayout:viewportに合わせて拡大し、ページの**(のど)に寄せます。 epub-patch3.pl ディレクトリ ディレクトリに含まれるepubとopfの<meta property="layout:orientation">landscape</meta>を削除します。 epub-patch4.pl ディテクトリ ディレクトリに含まれるepubのopfの0ページを削除します。 epub-patch5.pl ディレクトリ ディレクトリに含まれるepubに<meta property="layout:orientation">~がなければ、<meta property="layout:orientation">auto</meta>を挿入します。 ■ popplerの修正内容 ビルドには以下が必要 https://packages.ubuntu.com/ja/bionic/amd64/libopenjp2-7-dev/download ・CairoOutputDev.css cairoが対応している場合は、常にshow_text_glyphを呼び出すようにした。 ・CairoFontEngine.cc cairo_font_face_tをキャッシュしているが、縦書き横書き(wmode)が違う場合でも同じフォントとして扱われ、縦書き横書きが混在した場合に縦書き部分に横書きフォントが使われてしまうバグがあったので、GtkFontのgetWModeが返す値もキャッシュのキーに加えた。 ・pdftocairo.cc ファイル名の形式をname_0000.jpgにした ・GfxFont.cc 縦書きフォントの**合わせでフォントの幅を考慮してなかった箇所を修正。 450のような100の倍数でないフォントウェイトがエラーとされていたので、柔軟に解釈するように修正。 ・pdftoppm.cc ファイル名の形式を00000.jpgにした -scale-to-x, -scale-to-yを指定したとき、アスペクト比をそのままで最小の解像度になるようにした ・Stream.cc 1ビット画像のPredictor = 2の処理にバグがあったため修正。 ・Splash.cc pipeSetXYでバッファ外に描画しないように修正 ・Annot.cc アノテーションの境界を描画しないように修正 ■ mupdfの修正内容 ・mudraw.c 指定したページの範囲外のページを描画しないように修正。 ・font.c 日本語のフォント数が多いファイルを扱えるようにMAX_BBOX_TABLE_SIZEを4096から65536に拡大。 ■ 使用するXMLタグ /Content/PublisherInfo/Name /Content/PublisherInfo/Kana /Content/MagazineInfo/Name /Content/MagazineInfo/Kana /Content/CoverDate /Content/SalesDate /Content/IntroduceScript /Content/SalesDate /Content/ContentInfo/PageOpenWay /Content/ContentInfo/Orientation /Content/DataType /Content/ContentInfo/IndexList/Index /Content/ContentInfo/IndexList/Index/Title /Content/ContentInfo/IndexList/Index/StartPage /Content/PageContentList/PageContent /Content/PageContentList/PageContent/PageNo /Content/PageContentList/PageContent/PageKbn /Content/PageContentList/PageContent/ViewHeight /Content/PageContentList/PageContent/Resolution /Content/PageContentList/PageContent/Quality /Content/PageContentList/PageContent/ImageFormat /Content/ContentInfo/PreviewPageList/PreviewPage /Content/ContentInfo/PreviewPageList/PreviewPage/StartPage /Content/ContentInfo/PreviewPageList/PreviewPage/EndPage
pdftoepub's People
pdftoepub's Issues
Viewport設定
Fixed formatを利用する際にいくつか問題が出ましたので、viewportというプロパティに、例のようにwidthとheight
にイメージのサイズを書いていただきたいと思います。
例)
width=600, height=800
ラスターイメージの変換方法改善
いま、多くのラスターイメージが、patternとして登録されておりますが、この方法ですと拡大したときにイメージの再描画を行わないようで、きれいに表示されません。そこで、ラスター画像を参照する際は、patternを経由することなく、直接画像を指定していただくように変更お願いできますでしょうか?
具体的に、AERAの4.svgを利用して説明すると、いただいたファイルでは、defで:
<image id="image33" width="1185" height="1583" xlink:href="4.svg-1.png"/>
<pattern id="pattern0" patternUnits="userSpaceOnUse" width="1185" height="1583" x="282.89" y="-14.72">
<use xlink:href="#image33" transform="matrix(0.29,0,0,0.29,0,0)"/>
</pattern>
というような指定をしています。これを:
<g clip-path="url(#clip2)" clip-rule="nonzero">
<path style="stroke:none;" class="f2" d="M 282.89 441.29 L 624.18 441.29 L 624.18 -14.72 L 282.89 -14.72 Z "/>
</g>
という形で呼び出して描画をしています。なお、'f2'のクラスにpattern0のURLが指定されています。
これをdefには:
<image id="image33" width="1185" height="1583" xlink:href="4.svg-1.png"/>
だけを記述し:
<g clip-path="url(#clip2)" clip-rule="nonzero">
<use xlink:href="#image33" transform="matrix(0.29,0,0,0.29,282.89,-14.72)"/>
</g>
と呼び出していただくと、拡大時に文字も画像もきれいに表示されるようです。メモリを食うオブジェクトを一つ減らすこともできますので、安定化にもつながると考えております。
RodyKidsの31ページなどで文字が重なる
「ベガスに行かずんば 富を得ず」
の「富を」と「得ず」の文字の位置がPDFと異なります。
NationalGeographicでフォントが反映されない
Chromeで見ると5ページなどでフォントが反映されずに代替フォントが使われます。
7ページはXMLの解析エラーになります。
AERAの変換結果をアプリで表示すると、真ん中に余白が出ている
AERAの変換結果をアプリで表示すると、真ん中に余白が出ているので、それをなくすために:
SVGを表示するHTMLのスタイルシートに以下の記述をお願いで
きますでしょうか。
svg{
margin:0;
padding:0;
}
body, html{
margin:0;
font-size:0;
padding:0;
}
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.