午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

PDFをjpegにするアプリ、jpegのZipにできるようにした

昨日の

gogowaten.hatenablog.com

続き

 

f:id:gogowaten:20200104124108p:plain

PDFファイルをjpegに変換したものを、1つのzipファイルにできるようにした

ダウンロード

PDFtoJPEG_1.3.zip

 

 

PDFファイルは

www.maff.go.jp

野菜の輸入動向(月間速報)
https://www.maff.go.jp/kanto/seisan/engei/yasai-yunyu/attach/pdf/index-19.pdf

こちらのを利用

 

ダウンロードしたPDFファイルをドラッグアンドドロップで開いて

f:id:gogowaten:20200104131134p:plain

zipボタン押すと元のPDFファイルと同じフォルダにzipファイルが作成される

 

f:id:gogowaten:20200104131231p:plain

zipファイルの中にjpegファイル

 

 

画像閲覧アプリのLeeyesで確認

f:id:gogowaten:20200104131608p:plain

できてる!

 

 

ファイルサイズ

f:id:gogowaten:20200104132406p:plain

元のPDFファイルより3倍も大きくなってしまったのは、元のPDFが文字とグラフばかりで画像がないものだったからだねえ。

 

 

 

zipファイル作成とその中にjpegを詰め込む部分

/// <summary>
/// PdfDocumentをjpegにして、1つのzipファイルにする
/// </summary>
/// <param name="pdfDocument">Windows.Data.Pdf</param>
/// <param name="dpi">PDFを画像にするときに使う</param>
/// <param name="directory">保存フォルダ</param>
/// <param name="fileName">zipファイル名とjpegファイル名に使う</param>
/// <param name="quality">jpeg品質</param>
/// <param name="keta">0埋め連番の桁数、jpegファイル名に使う</param>
/// <returns></returns>
private async Task SaveSub3(PdfDocument pdfDocument, double dpi, string directory, string fileName, int quality, int keta)
{
    string zipName = System.IO.Path.Combine(directory, fileName) + ".zip";
    using (var zipstream = File.Create(zipName))
    {
        using (ZipArchive archive = new ZipArchive(zipstream, ZipArchiveMode.Create))
        {

            for (int i = 0; i < MyPdfDocument.PageCount; i++)
            {
                int renban = i + 1;
                string jpegName = MyPdfName + "_" + renban.ToString("d" + keta) + ".jpg";

                using (PdfPage page = pdfDocument.GetPage((uint)i))
                {
                    var options = new PdfPageRenderOptions();
                    options.DestinationHeight = (uint)Math.Round(page.Size.Height * (dpi / 96.0), MidpointRounding.AwayFromZero);

                    using (var stream = new Windows.Storage.Streams.InMemoryRandomAccessStream())
                    {
                        await page.RenderToStreamAsync(stream, options);//画像に変換したのはstreamへ
                        JpegBitmapEncoder encoder = new JpegBitmapEncoder();
                        encoder.QualityLevel = quality;
                        encoder.Frames.Add(BitmapFrame.Create(stream.AsStream()));

                        var entry = archive.CreateEntry(jpegName);
                        //open
                        using (var entryStream = entry.Open())
                        {
                            using (var jpegStream = new MemoryStream())
                            {
                                encoder.Save(jpegStream);
                                jpegStream.Position = 0;
                                jpegStream.CopyTo(entryStream);
                            }
                        }
                    }
                }
            }//for
        }
    }
}

とても見づらい、今も無駄な処理を見つけて削除したくらいよくわかっていない、でも期待通りに動いている

 

 

zipファイル作成部分は

gogowaten.hatenablog.com

このときの105行目以降を見ながらコピペ改変

 

その前に

f:id:gogowaten:20200104135615p:plain

なぜかSystem.IO.Compressionを参照に追加する必要があった、これがないと

f:id:gogowaten:20200104135817p:plain

System.IO.Compression.ZipArchiveが使えなかった、なんで?

 

 

 関連記事

続きは3日後

gogowaten.hatenablog.com