Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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));
                    }
                }
            }
        }
Beispiel #4
0
        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);
            }
        }
Beispiel #5
0
        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));
            }
        }