private IEnumerable <Encoding> GetEncodingByMode(ReadFileEncodingType encodingMode) { var encList = new List <Encoding>(); if (encodingMode == ReadFileEncodingType.S_JIS) { encList.Add(Encoding.GetEncoding("shift-jis")); } else if (encodingMode == ReadFileEncodingType.UTF_8) { encList.Add(new UTF8Encoding(false)); } else if (encodingMode == ReadFileEncodingType.UTF_8AndS_JIS) { encList.Add(new UTF8Encoding(false)); encList.Add(Encoding.GetEncoding("shift-jis")); } return(encList); }
private IEnumerable <ArchiveEncoding> GetEncodingByMode(ReadFileEncodingType encodingMode) { var encList = new List <ArchiveEncoding>(); if (encodingMode == ReadFileEncodingType.S_JIS) { var tEnc = new ArchiveEncoding() { Default = Encoding.GetEncoding("shift-jis") }; encList.Add(tEnc); } else if (encodingMode == ReadFileEncodingType.UTF_8) { var tEnc = new ArchiveEncoding() { Default = new UTF8Encoding(false) }; encList.Add(tEnc); } else if (encodingMode == ReadFileEncodingType.UTF_8AndS_JIS) { var tEnc = new ArchiveEncoding() { Default = new UTF8Encoding(false) }; encList.Add(tEnc); tEnc = new ArchiveEncoding() { Default = Encoding.GetEncoding("shift-jis") }; encList.Add(tEnc); } return(encList); }
public void ExtractJpg(string file, string outputPath, PageMode mode, int pageCount, ReadFileEncodingType encodingMode) { Info(string.Format("RAR解凍開始 file={0},outputPath={1}, mode={2}, pageCount={3}, encodingMode={4}", file, outputPath, mode, pageCount, encodingMode)); //モードに応じたエンコーディング var encList = GetEncodingByMode(encodingMode); foreach (var enc in encList) { Info(string.Format("enc={0}", enc)); var option = new ReaderOptions(); option.ArchiveEncoding = enc; //解凍 using (var archive = RarArchive.Open(file, option)) { var entries = archive.Entries.Where(x => !x.IsDirectory && ImageUtil.IsImageFile(x.Key)).OrderBy(x => x.Key); //画像ファイル数=ページ数と換算する var count = entries.Count(); if (count > 0) { //開始終了ページの取得 var targetPair = PageUtil.GetPagePair(mode, count, pageCount); //取得したページから画像取り出す foreach (var pair in targetPair.Select((x, i) => new { x = x, i = i })) { //対象のファイルを解凍する foreach (var img in entries.Skip((pair.x.StartPage - 1)).Take((pair.x.EndPage - (pair.x.StartPage - 1)))) { img.WriteToDirectory(outputPath, new ExtractionOptions() { ExtractFullPath = false, Overwrite = true }); } } //一度読み込めれば次のエンコードは実施しない break; } else { Error(string.Format("圧縮ファイル内数が0以下 {0}", count)); } } } }
public BookInfo GetBookInfo(string outputPathRoot, string pdfPath, PageMode mode, int pageCount, ReadFileEncodingType encodingMode) { //作業フォルダの生成 var tempDir = Path.Combine(outputPathRoot, DateTime.Now.ToString("yyyyMMddHHmmssfff")); if (Directory.Exists(tempDir)) { try { Directory.Delete(tempDir); } catch (Exception) { throw new ArgumentException("一時フォルダの削除に失敗。"); } } //作業フォルダの生成 try { Directory.CreateDirectory(tempDir); } catch (Exception) { throw new ArgumentException("一時フォルダの削除に失敗。"); } try { //解凍してJPG画像を生成 _extractImageService.ExtractJpg(pdfPath, tempDir, mode, pageCount, encodingMode); var jpgs = Directory.GetFiles(tempDir, "*.*", SearchOption.AllDirectories).Where(x => ImageUtil.IsImageFile(x)); if (!jpgs.Any()) { throw new ArgumentException("画像検出に失敗しました。エンコーディング設定を変更してみてください。"); } //画像からisbnを探索 var isbn = string.Empty; foreach (var jpg in jpgs) { isbn = _isbnGetService.GetIsbn(jpg); if (!string.IsNullOrWhiteSpace(isbn)) { return(_bookInfoGetService.GetBookInfo(isbn)); } } throw new ArgumentException("画像からISBNを取得できませんでした。"); } catch (Exception e) { throw e; } finally { Directory.Delete(tempDir, true); } }
public void ExtractJpg(string file, string outputPath, PageMode mode, int pageCount, ReadFileEncodingType encodingMode) { Info(string.Format("ZIP解凍開始 file={0},outputPath={1}, mode={2}, pageCount={3}, encodingMode={4}", file, outputPath, mode, pageCount, encodingMode)); //モードに応じたエンコーディング var encList = GetEncodingByMode(encodingMode); foreach (var enc in encList) { Info(string.Format("enc={0}", enc)); var option = new ReadOptions(); option.Encoding = enc; //読み込み using (var zip = ZipFile.Read(file, option)) { var entries = zip.Entries.Where(x => ImageUtil.IsImageFile(x.FileName)); //var entries = zip.Where(x => x.FileName.ToLower().EndsWith(".jpg") || x.FileName.ToLower().EndsWith(".jpeg")); //画像ファイル数=ページ数と換算する var count = entries.Count(); if (count > 0) { //開始終了ページの取得 var targetPair = PageUtil.GetPagePair(mode, count, pageCount); //取得したページから画像取り出す foreach (var pair in targetPair.Select((x, i) => new { x = x, i = i })) { //対象のファイルを解凍する foreach (var img in entries.Skip(pair.x.StartPage - 1).Take((pair.x.EndPage - (pair.x.StartPage - 1)))) { img.Extract(outputPath, ExtractExistingFileAction.OverwriteSilently); } } //一度読み込めれば次のエンコードは実施しない break; } else { Error(string.Format("圧縮ファイル内数が0以下 {0}", count)); } } } }
/// <summary> /// ファイルから書籍情報を取得します /// </summary> /// <param name="outputPathRoot"></param> /// <param name="filePath"></param> /// <param name="mode"></param> /// <param name="pageCount"></param> /// <param name="encodingMode"></param> /// <returns></returns> public BookInfo GetBookInfo(string outputPathRoot, string filePath, PageMode mode, int pageCount, ReadFileEncodingType encodingMode) { var extractAndInfoGetService = GetExtractLogicByFile(filePath); return(extractAndInfoGetService.GetBookInfo(outputPathRoot, filePath, mode, pageCount, encodingMode)); }
public void ExtractJpg(string file, string outputPath, PageMode mode, int pageCount, ReadFileEncodingType encodingMode) { Info(string.Format("PDF解凍開始 file={0},outputPath={1}, mode={2}, pageCount={3}, encodingMode={4}", file, outputPath, mode, pageCount, encodingMode)); //ページ数の取得 var page = GetPageCount(file); if (page > 0) { //開始終了ページの取得 var targetPair = PageUtil.GetPagePair(mode, page, pageCount); //取得したページから画像変換処理 foreach (var pair in targetPair.Select((x, i) => new { x = x, i = i })) { var convResult = ConvertJpg(file, outputPath, pair.x.StartPage, pair.x.EndPage, pair.i.ToString()); if (convResult != 0) { Error(string.Format("画像変換結果で異常 Code={0}", convResult)); } } } else { Error(string.Format("取得ページが0以下。{0}", file)); } }