EPUB出力機能の部分だけを取り出して動くかを試した。テンプレートの読み込みに失敗した。原因はassetsの指定方法が違うからアンドロイドの読み込み方に書き換え。文字コード自動判別化手動の切替。
プロパティーの読み込み。ここはandroid Preferenceに書き換えてもいい。presetをどうするかという問題。
import java.util.Properties; private Properties props; props = new Properties(); InputStream isini; try { isini = this.getAssets().open("AozoraEpub3.ini"); props.load(isini); } catch (IOException e) { e.printStackTrace(); }
EPUB出力設定の読み込み。
/** ePub3出力クラス */ Epub3Writer epub3Writer; /** ePub3画像出力クラス */ Epub3ImageWriter epub3ImageWriter; /** 出力先パス */ File dstPath = null; //ePub出力クラス初期化 epub3Writer = new Epub3Writer(this); epub3ImageWriter = new Epub3ImageWriter(this); int titleIndex = 0; //try { titleIndex = Integer.parseInt(props.getProperty("TitleType")); } catch (Exception e) {}//表題 //コマンドラインオプション以外 boolean coverPage = "1".equals(props.getProperty("CoverPage"));//表紙追加 int titlePage = BookInfo.TITLE_NONE; if ("1".equals(props.getProperty("TitlePageWrite"))) { try { titlePage =Integer.parseInt(props.getProperty("TitlePage")); } catch (Exception e) {} } boolean withMarkId = "1".equals(props.getProperty("MarkId")); //boolean gaiji32 = "1".equals(props.getProperty("Gaiji32")); boolean commentPrint = "1".equals(props.getProperty("CommentPrint")); boolean commentConvert = "1".equals(props.getProperty("CommentConvert")); boolean autoYoko = "1".equals(props.getProperty("AutoYoko")); boolean autoYokoNum1 = "1".equals(props.getProperty("AutoYokoNum1")); boolean autoYokoNum3 = "1".equals(props.getProperty("AutoYokoNum3")); boolean autoYokoEQ1 = "1".equals(props.getProperty("AutoYokoEQ1")); int spaceHyp = 0; try { spaceHyp = Integer.parseInt(props.getProperty("SpaceHyphenation")); } catch (Exception e) {} boolean tocPage = "1".equals(props.getProperty("TocPage"));//目次追加 boolean tocVertical = "1".equals(props.getProperty("TocVertical"));//目次縦書き boolean coverPageToc = "1".equals(props.getProperty("CoverPageToc")); int removeEmptyLine = 0; try { removeEmptyLine = Integer.parseInt(props.getProperty("RemoveEmptyLine")); } catch (Exception e) {} int maxEmptyLine = 0; try { maxEmptyLine = Integer.parseInt(props.getProperty("MaxEmptyLine")); } catch (Exception e) {} //画面サイズと画像リサイズ int dispW = 600; try { dispW =Integer.parseInt(props.getProperty("DispW")); } catch (Exception e) {} int dispH = 800; try { dispH =Integer.parseInt(props.getProperty("DispH")); } catch (Exception e) {} int coverW = 600; try { coverW = Integer.parseInt(props.getProperty("CoverW")); } catch (Exception e) {} int coverH = 800; try { coverH = Integer.parseInt(props.getProperty("CoverH")); } catch (Exception e) {} int resizeW = 0; if ("1".equals(props.getProperty("ResizeW"))) try { resizeW = Integer.parseInt(props.getProperty("ResizeNumW")); } catch (Exception e) {} int resizeH = 0; if ("1".equals(props.getProperty("ResizeH"))) try { resizeH = Integer.parseInt(props.getProperty("ResizeNumH")); } catch (Exception e) {} int singlePageSizeW = 480; try { singlePageSizeW = Integer.parseInt(props.getProperty("SinglePageSizeW")); } catch (Exception e) {} int singlePageSizeH = 640; try { singlePageSizeH = Integer.parseInt(props.getProperty("SinglePageSizeH")); } catch (Exception e) {} int singlePageWidth = 600; try { singlePageWidth = Integer.parseInt(props.getProperty("SinglePageWidth")); } catch (Exception e) {} float imageScale = 1; try { imageScale = Float.parseFloat(props.getProperty("ImageScale")); } catch (Exception e) {} int imageFloatType = 0; try { imageFloatType = Integer.parseInt(props.getProperty("ImageFloatType")); } catch (Exception e) {} int imageFloatW = 0; try { imageFloatW = Integer.parseInt(props.getProperty("ImageFloatW")); } catch (Exception e) {} int imageFloatH = 0; try { imageFloatH = Integer.parseInt(props.getProperty("ImageFloatH")); } catch (Exception e) {} int imageSizeType = SectionInfo.IMAGE_SIZE_TYPE_HEIGHT; try { imageSizeType = Integer.parseInt(props.getProperty("ImageSizeType")); } catch (Exception e) {} boolean fitImage = "1".equals(props.getProperty("FitImage")); boolean svgImage = "1".equals(props.getProperty("SvgImage")); int rotateImage = 0; if ("1".equals(props.getProperty("RotateImage"))) rotateImage = 90; else if ("2".equals(props.getProperty("RotateImage"))) rotateImage = -90; float jpegQualty = 0.8f; try { jpegQualty = Integer.parseInt(props.getProperty("JpegQuality"))/100f; } catch (Exception e) {} float gamma = 1.0f; if ( "1".equals(props.getProperty("Gamma"))) try { gamma = Float.parseFloat(props.getProperty("GammaValue")); } catch (Exception e) {} int autoMarginLimitH = 0; int autoMarginLimitV = 0; int autoMarginWhiteLevel = 80; float autoMarginPadding = 0; int autoMarginNombre = 0; float nobreSize = 0.03f; if ("1".equals(props.getProperty("AutoMargin"))) { try { autoMarginLimitH = Integer.parseInt(props.getProperty("AutoMarginLimitH")); } catch (Exception e) {} try { autoMarginLimitV = Integer.parseInt(props.getProperty("AutoMarginLimitV")); } catch (Exception e) {} try { autoMarginWhiteLevel = Integer.parseInt(props.getProperty("AutoMarginWhiteLevel")); } catch (Exception e) {} try { autoMarginPadding = Float.parseFloat(props.getProperty("AutoMarginPadding")); } catch (Exception e) {} try { autoMarginNombre = Integer.parseInt(props.getProperty("AutoMarginNombre")); } catch (Exception e) {} try { autoMarginPadding = Float.parseFloat(props.getProperty("AutoMarginNombreSize")); } catch (Exception e) {} } epub3Writer.setImageParam(dispW, dispH, coverW, coverH, resizeW, resizeH, singlePageSizeW, singlePageSizeH, singlePageWidth, imageSizeType, fitImage, svgImage, rotateImage, imageScale, imageFloatType, imageFloatW, imageFloatH, jpegQualty, gamma, autoMarginLimitH, autoMarginLimitV, autoMarginWhiteLevel, autoMarginPadding, autoMarginNombre, nobreSize); epub3ImageWriter.setImageParam(dispW, dispH, coverW, coverH, resizeW, resizeH, singlePageSizeW, singlePageSizeH, singlePageWidth, imageSizeType, fitImage, svgImage, rotateImage, imageScale, imageFloatType, imageFloatW, imageFloatH, jpegQualty, gamma, autoMarginLimitH, autoMarginLimitV, autoMarginWhiteLevel, autoMarginPadding, autoMarginNombre, nobreSize); //目次階層化設定 epub3Writer.setTocParam("1".equals(props.getProperty("NavNest")), "1".equals(props.getProperty("NcxNest"))); //スタイル設定 String[] pageMargin = {}; try { pageMargin = props.getProperty("PageMargin").split(","); } catch (Exception e) {} if (pageMargin.length != 4) pageMargin = new String[]{"0", "0", "0", "0"}; else { String pageMarginUnit = props.getProperty("PageMarginUnit"); for (int i=0; i<4; i++) { pageMargin[i] += pageMarginUnit; } } String[] bodyMargin = {}; try { bodyMargin = props.getProperty("BodyMargin").split(","); } catch (Exception e) {} if (bodyMargin.length != 4) bodyMargin = new String[]{"0", "0", "0", "0"}; else { String bodyMarginUnit = props.getProperty("BodyMarginUnit"); for (int i=0; i<4; i++) { bodyMargin[i] += bodyMarginUnit; } } float lineHeight = 1.8f; try { lineHeight = Float.parseFloat(props.getProperty("LineHeight")); } catch (Exception e) {} int fontSize = 100; try { fontSize = Integer.parseInt(props.getProperty("FontSize")); } catch (Exception e) {} boolean boldUseGothic = "1".equals(props.getProperty("BoldUseGothic")); boolean gothicUseBold = "1".equals(props.getProperty("gothicUseBold")); epub3Writer.setStyles(pageMargin, bodyMargin, lineHeight, fontSize, boldUseGothic, gothicUseBold); //自動改ページ int forcePageBreakSize = 0; int forcePageBreakEmpty = 0; int forcePageBreakEmptySize = 0; int forcePageBreakChapter = 0; int forcePageBreakChapterSize = 0; if ("1".equals(props.getProperty("PageBreak"))) { try { try { forcePageBreakSize = Integer.parseInt(props.getProperty("PageBreakSize")) * 1024; } catch (Exception e) {} if ("1".equals(props.getProperty("PageBreakEmpty"))) { try { forcePageBreakEmpty = Integer.parseInt(props.getProperty("PageBreakEmptyLine")); } catch (Exception e) {} try { forcePageBreakEmptySize = Integer.parseInt(props.getProperty("PageBreakEmptySize")) * 1024; } catch (Exception e) {} } if ("1".equals(props.getProperty("PageBreakChapter"))) { forcePageBreakChapter = 1; try { forcePageBreakChapterSize = Integer.parseInt(props.getProperty("PageBreakChapterSize")) * 1024; } catch (Exception e) {} } } catch (Exception e) {} } int maxLength = 64; try { maxLength = Integer.parseInt((props.getProperty("ChapterNameLength"))); } catch (Exception e) {} boolean insertTitleToc = "1".equals(props.getProperty("TitleToc")); boolean chapterExclude = "1".equals(props.getProperty("ChapterExclude")); boolean chapterUseNextLine = "1".equals(props.getProperty("ChapterUseNextLine")); boolean chapterSection = !props.containsKey("ChapterSection")||"1".equals(props.getProperty("ChapterSection")); boolean chapterH = "1".equals(props.getProperty("ChapterH")); boolean chapterH1 = "1".equals(props.getProperty("ChapterH1")); boolean chapterH2 = "1".equals(props.getProperty("ChapterH2")); boolean chapterH3 = "1".equals(props.getProperty("ChapterH3")); boolean sameLineChapter = "1".equals(props.getProperty("SameLineChapter")); boolean chapterName = "1".equals(props.getProperty("ChapterName")); boolean chapterNumOnly = "1".equals(props.getProperty("ChapterNumOnly")); boolean chapterNumTitle = "1".equals(props.getProperty("ChapterNumTitle")); boolean chapterNumParen = "1".equals(props.getProperty("ChapterNumParen")); boolean chapterNumParenTitle = "1".equals(props.getProperty("hapterNumParenTitle")); String chapterPattern = ""; if ("1".equals(props.getProperty("ChapterPattern"))) chapterPattern = props.getProperty("ChapterPatternText"); //オプション指定を反映 boolean useFileName = false;//表題に入力ファイル名利用 String coverFileName = null; String encType = "AUTO";//文字コードの初期設定を空に String outExt = ".epub"; boolean autoFileName = true; //ファイル名を表題に利用 boolean vertical = true; String targetDevice = null; //変換クラス生成とパラメータ設定 AozoraEpub3Converter aozoraConverter = null; try { aozoraConverter = new AozoraEpub3Converter(epub3Writer, this); } catch (IOException e) { e.printStackTrace(); } //挿絵なし aozoraConverter.setNoIllust("1".equals(props.getProperty("NoIllust"))); //栞用span出力 aozoraConverter.setWithMarkId(withMarkId); //変換オプション設定 aozoraConverter.setAutoYoko(autoYoko, autoYokoNum1, autoYokoNum3, autoYokoEQ1); //文字出力設定 int dakutenType = 0; try { dakutenType = Integer.parseInt(props.getProperty("DakutenType")); } catch (Exception e) {} boolean printIvsBMP = "1".equals(props.getProperty("IvsBMP")); boolean printIvsSSP = "1".equals(props.getProperty("IvsSSP")); aozoraConverter.setCharOutput(dakutenType, printIvsBMP, printIvsSSP); //全角スペースの禁則 aozoraConverter.setSpaceHyphenation(spaceHyp); //コメント aozoraConverter.setCommentPrint(commentPrint, commentConvert); aozoraConverter.setRemoveEmptyLine(removeEmptyLine, maxEmptyLine); //強制改ページ aozoraConverter.setForcePageBreak(forcePageBreakSize, forcePageBreakEmpty, forcePageBreakEmptySize, forcePageBreakChapter, forcePageBreakChapterSize); //目次設定 aozoraConverter.setChapterLevel(maxLength, chapterExclude, chapterUseNextLine, chapterSection, chapterH, chapterH1, chapterH2, chapterH3, sameLineChapter, chapterName, chapterNumOnly, chapterNumTitle, chapterNumParen, chapterNumParenTitle, chapterPattern);
ファイルの変換部分
//////////////////////////////// //各ファイルを変換処理 //////////////////////////////// // for (String fileName : fileNames) { LogAppender.println("--------"); File srcFile = new File(fileName); if (srcFile == null || !srcFile.isFile()) { LogAppender.error("file not exist. "+srcFile.getAbsolutePath()); // continue; } String ext = srcFile.getName(); ext = ext.substring(ext.lastIndexOf('.')+1).toLowerCase(); ext="txt";//テストコード int coverImageIndex = -1; if (coverFileName != null) { if ("0".equals(coverFileName)) { coverImageIndex = 0; coverFileName = ""; } else if ("1".equals(coverFileName)) { coverFileName = AozoraEpub3.getSameCoverFileName(srcFile); //入力ファイルと同じ名前+.jpg/.png } } //zipならzip内のテキストを検索 int txtCount = 1; boolean imageOnly = false; boolean isFile = "txt".equals(ext); if("zip".equals(ext) || "txtz".equals(ext)) { try { txtCount = AozoraEpub3.countZipText(srcFile); } catch (IOException e) { e.printStackTrace(); } if (txtCount == 0) { txtCount = 1; imageOnly = true; } } else if("rar".equals(ext)) { try { txtCount = AozoraEpub3.countRarText(srcFile); } catch (IOException | RarException e) { e.printStackTrace(); } if (txtCount == 0) { txtCount = 1; imageOnly = true; } } else if ("cbz".equals(ext)) { imageOnly = true; } for (int txtIdx=0; txtIdx<txtCount; txtIdx++) { ImageInfoReader imageInfoReader = new ImageInfoReader(isFile, srcFile); BookInfo bookInfo = null; if (!imageOnly) { bookInfo = AozoraEpub3.getBookInfo(srcFile, ext, txtIdx, imageInfoReader, aozoraConverter, encType, BookInfo.TitleType.indexOf(titleIndex), false); bookInfo.vertical = vertical; bookInfo.insertTocPage = tocPage; bookInfo.setTocVertical(tocVertical); bookInfo.insertTitleToc = insertTitleToc; aozoraConverter.vertical = vertical; //表題ページ bookInfo.titlePageType = titlePage; } //表題の見出しが非表示で行が追加されていたら削除 if (!bookInfo.insertTitleToc && bookInfo.titleLine >= 0) { bookInfo.removeChapterLineInfo(bookInfo.titleLine); } Epub3Writer writer = epub3Writer; if (!isFile) { if (imageOnly) { LogAppender.println("画像のみのePubファイルを生成します"); //画像出力用のBookInfo生成 bookInfo = new BookInfo(srcFile); bookInfo.imageOnly = true; //Writerを画像出力用派生クラスに入れ替え writer = epub3ImageWriter; } //先頭からの場合で指定行数以降なら表紙無し if ("".equals(coverFileName)) { try { int maxCoverLine = Integer.parseInt(props.getProperty("MaxCoverLine")); if (maxCoverLine > 0 && bookInfo.firstImageLineNum >= maxCoverLine) { coverImageIndex = -1; coverFileName = null; } } catch (Exception e) {} } //表紙設定 bookInfo.insertCoverPageToc = coverPageToc; bookInfo.insertCoverPage = coverPage; bookInfo.coverImageIndex = coverImageIndex; if (coverFileName != null && !coverFileName.startsWith("http")) { File coverFile = new File(coverFileName); if (!coverFile.exists()) { coverFileName = srcFile.getParent()+"/"+coverFileName; if (!new File(coverFileName).exists()) { coverFileName = null; LogAppender.println("[WARN] 表紙画像ファイルが見つかりません : "+coverFile.getAbsolutePath()); } } } bookInfo.coverFileName = coverFileName; String[] titleCreator = BookInfo.getFileTitleCreator(srcFile.getName()); if (titleCreator != null) { if (useFileName) { if (titleCreator[0] != null && titleCreator[0].trim().length() >0) bookInfo.title = titleCreator[0]; if (titleCreator[1] != null && titleCreator[1].trim().length() >0) bookInfo.creator = titleCreator[1]; } else { //テキストから取得できていない場合 if (bookInfo.title == null || bookInfo.title.length() == 0) bookInfo.title = titleCreator[0]==null?"":titleCreator[0]; if (bookInfo.creator == null || bookInfo.creator.length() == 0) bookInfo.creator = titleCreator[1]==null?"":titleCreator[1]; } } File outFile = getOutFile(srcFile, dstPath, bookInfo, autoFileName, outExt); AozoraEpub3.convertFile( srcFile, ext, outFile, aozoraConverter, writer, encType, bookInfo, imageInfoReader, txtIdx); } } }catch (IOException e) { e.printStackTrace(); }
出力ファイル
/** 出力ファイルを生成 */ static File getOutFile(File srcFile, File dstPath, BookInfo bookInfo, boolean autoFileName, String outExt) { //出力ファイル if (dstPath == null) dstPath = srcFile.getAbsoluteFile().getParentFile(); String outFileName = ""; if (autoFileName && (bookInfo.creator != null || bookInfo.title != null)) { outFileName = dstPath.getAbsolutePath()+"/"; if (bookInfo.creator != null && bookInfo.creator.length() > 0) { String str = bookInfo.creator.replaceAll("[\\\\|\\/|\\:|\\*|\\?|\\<|\\>|\\||\\\"|\t]", ""); if (str.length() > 64) str = str.substring(0, 64); outFileName += "["+str+"] "; } if (bookInfo.title != null) { outFileName += bookInfo.title.replaceAll("[\\\\|\\/|\\:|\\*|\\!|\\?|\\<|\\>|\\||\\\"|\t]", ""); } if (outFileName.length() > 250) outFileName = outFileName.substring(0, 250); } else { outFileName = dstPath.getAbsolutePath()+"/"+srcFile.getName().replaceFirst("\\.[^\\.]+$", ""); } if (outExt.length() == 0) outExt = ".epub"; File outFile = new File(outFileName + outExt); //書き込み許可設定 outFile.setWritable(true); return outFile; }
mimetypeのファイルが見つからない。原因はassetsフォルダーへのアクセスの仕方が違うから。
ZipArchiveEntry mimeTypeEntry = new ZipArchiveEntry(MIMETYPE_PATH); FileInputStream fis = new FileInputStream(templatePath+MIMETYPE_PATH); java.io.FileNotFoundException: nullmimetype: open failed: ENOENT (No such file or directory)
stringからバイト配列の長さを取得
ZipArchiveEntry mimeTypeEntry = new ZipArchiveEntry(MIMETYPE_PATH); String mime = inputStreemToString(context.getAssets().open(templatePath+MIMETYPE_PATH), StandardCharsets.UTF_8); //FileInputStream fis = (FileInputStream) context.getAssets().open(templatePath+MIMETYPE_PATH); FileInputStream fis; // "application/epub+zip" をバイト配列に変換 byte[] b = mime.getBytes(StandardCharsets.UTF_8); int len = b.length; // バイト配列の長さを取得 //fis.close();