KDP(電子出版)のメモ 急急如律令

Amazon Kindleダイレクト・パブリッシングでの電子出版や電子書籍の作成販売について、文章やイラストの作成や編集方法について書いています。

AozoraEpub3で表紙がない場合に適当に表紙を作る

AozoraEpub3では表紙をSVGラッピングで作っているのでいっそのことSVGでタイトルと著者名を入れてSVG出力すればいいのでは。

表紙の設定は4項目ある

  • 何行目までの先頭の挿絵
  • 入力ファイル名と同じ画像
  • 表紙なし
  • http:/

ここに、表紙の自動生成を追加する。 AozoraEpub3Applet.java jTextMaxCoverLineが何行目かという数字 jComboCoverが項目の選択

     //先頭からの場合で指定行数以降なら表紙無し
        if ("".equals(coverFileName) && !imageOnly) {
            try {
                int maxCoverLine = Integer.parseInt(this.jTextMaxCoverLine.getText());
                if (maxCoverLine > 0 && (bookInfo.firstImageLineNum == -1 || bookInfo.firstImageLineNum >= maxCoverLine)) {
                    coverImageIndex = -1;
                    coverFileName = null;
                } else {
                    coverImageIndex = bookInfo.firstImageIdx;
                }
            } catch (Exception e) {
            }
        }

設定の保存と読み出し

     //有効行数
        setPropsIntText(jTextMaxCoverLine, props, "MaxCoverLine");

        props.setProperty("MaxCoverLine", this.jTextMaxCoverLine.getText());
     //表紙にする挿絵の位置-1なら挿絵は使わない
        int coverImageIndex = -1;
        //表紙情報追加
        String coverFileName = this.jComboCover.getEditor().getItem().toString();
        if (coverFileName.equals(this.jComboCover.getItemAt(0))) {
            coverFileName = ""; //先頭の挿絵
            coverImageIndex = 0;
        } else if (coverFileName.equals(this.jComboCover.getItemAt(1))) {
            coverFileName = AozoraEpub3.getSameCoverFileName(srcFile); //入力ファイルと同じ名前+.jpg/.png
        } else if (coverFileName.equals(this.jComboCover.getItemAt(2))) {
            coverFileName = null; //表紙無し
        }


                //表紙画像はconverted.pngで保存される 指定がない場合はそれを利用する
                Object coverItem = jComboCover.getSelectedItem();
                //入力ファイルと同じ表紙の指定の場合 ショートカットファイルのパスにファイルがあればファイルパスを指定に変更
                if (jComboCover.getSelectedIndex() == 1 && urSrcFile != null) {
                    String coverFileName = AozoraEpub3.getSameCoverFileName(urSrcFile);
                    jComboCover.setSelectedItem(coverFileName);
                }
                //同名のファイルが無い場合はconverted.pngを利用する設定に変更
                if (jComboCover.getSelectedIndex() == 0 || jComboCover.getSelectedIndex() == 1) jComboCover.setSelectedIndex(1);


        if (props.getProperty("Cover")==null|| props.getProperty("Cover").isEmpty()) jComboCover.setSelectedIndex(0);
        else jComboCover.setSelectedItem(props.getProperty("Cover"));

//先頭の挿絵と表紙無しのみ記憶
        if (this.jComboCover.getSelectedIndex() == 0) props.setProperty("Cover","");
        else if (this.jComboCover.getSelectedIndex() == 1) props.setProperty("Cover", this.jComboCover.getEditor().getItem().toString().trim());

表紙のSVG案

<svg width="800" height="1200" xmlns="http://www.w3.org/2000/svg">
    <!-- ドロップシャドウ -->
<filter id="dropshadow" height="130%">
      <feGaussianBlur in="SourceAlpha" stdDeviation="3"/>
      <feOffset dx="2" dy="2" result="offsetblur"/>
      <feComponentTransfer>
        <feFuncA type="linear" slope="0.5"/>
      </feComponentTransfer>
      <feMerge> 
        <feMergeNode/>
        <feMergeNode in="SourceGraphic"/>
      </feMerge>
    </filter>
    <!-- 背景の四角形 -->
    <rect width="100%" height="100%" fill="#f4f4f4" />
    <rect x="80" y="80" width="80%" height="85%" fill="#1858DB" filter="url(#dropshadow)" rx="10" ry="10"/>
    <!-- タイトル (縦書き) -->
    <text x="400" y="160" font-family="serif" font-size="48" fill="#fff" writing-mode="tb" glyph-orientation-vertical="0" filter="url(#dropshadow)">
        書籍のタイトル
    </text>

    <!-- 著者名 (縦書き) -->
    <text x="600" y="160" font-family="serif" font-size="36" fill="#fff" writing-mode="tb" glyph-orientation-vertical="0" filter="url(#dropshadow)">
        著者名
    </text>
</svg>

raccoonico.com

epubwriter.java 表紙画像のファイル名が固定されているのでこれを変えるだけでいいのかテンプレートも変える必要があるのか。

         if (isKindle || ext.equals("jpeg")) ext = "jpg";
            coverImageInfo = ImageInfo.getImageInfo(ext, bookInfo.coverImage);
            coverImageInfo.setId("0000");
            coverImageInfo.setOutFileName("0000."+ext);
            coverImageInfo.setIsCover(true);
            this.imageInfos.addFirst(coverImageInfo);

表紙画像出力ロジック部分。bookInfo.insertCoverPageがtrueなら表紙あり。

     //表紙ページ出力 先頭画像表示時は画像出力時にカバー指定するので出力しない
        if (bookInfo.insertCoverPage) {
            //追加用の情報取得にのみ使う
            ImageInfo insertCoverInfo = coverImageInfo;
            if (insertCoverInfo == null && bookInfo.coverImageIndex > -1) {
                //本文中の挿絵の場合
                insertCoverInfo = imageInfoReader.getImageInfo(bookInfo.coverImageIndex);
                if (insertCoverInfo != null) {
                    insertCoverInfo.setIsCover(true);
                    if (!bookInfo.imageOnly && insertCoverInfo.getId() == null) {
                        //zip内の画像で追加処理されていない
                        this.imageIndex++;
                        String imageId = decimalFormat.format(this.imageIndex);
                        insertCoverInfo.setId(imageId);
                        String ext = insertCoverInfo.getExt();
                        if (isKindle) ext = "jpg";
                        insertCoverInfo.setOutFileName(imageId+"."+ext);
                    }
                }
            }
            if (insertCoverInfo != null) {
                SectionInfo sectionInfo = new SectionInfo("cover-page");
                if (this.imageSizeType != SectionInfo.IMAGE_SIZE_TYPE_AUTO) {
                    //画像が横長なら幅100% それ以外は高さ100%
                    if ((double)insertCoverInfo.getWidth()/insertCoverInfo.getHeight() >= (double)this.coverW/this.coverH) sectionInfo.setImageFitW(true);
                    else sectionInfo.setImageFitH(true);
                } else {
                    sectionInfo.setImageFitW(false);
                    sectionInfo.setImageFitH(false);
                }
                this.velocityContext.put("sectionInfo", sectionInfo);
                this.velocityContext.put("coverImage", insertCoverInfo);
                zos.putArchiveEntry(new ZipArchiveEntry(OPS_PATH+XHTML_PATH+COVER_FILE));
                bw = new BufferedWriter(new OutputStreamWriter(zos, StandardCharsets.UTF_8));
                Velocity.mergeTemplate(templatePath+OPS_PATH+XHTML_PATH+COVER_VM, "UTF-8", velocityContext, bw);
                bw.flush();
                zos.closeArchiveEntry();
            } else {
                //画像がなかったら表紙ページ無し
                bookInfo.insertCoverPage = false;
            }
        }