更改PdfImage类型(Syncfusion PDF)

时间:2015-10-14 21:03:42

标签: c# pdf jpeg uwp syncfusion

所以我正在为UWP XAML使用Syncfusion Controls,我正在尝试将JPEG插入到我正在创建的PDF中,但PdfImage似乎总是返回位图。或者至少是具有位图文件大小的图像。 有没有办法确保插入的图像是JPEG大小?我正在输入的图像是JPEG开头。 如果我不制作漫画(日本漫画书)的PDF,我就可以使用位图了,即现在每个漫画的大小在50-150MB之间。

这不是一个有效的样本,但这就是我现在正在使用的内容。

public async void SaveAsPdf(Stream fs, Manga manga)
    {
        var m = manga;
        var c = m.Content;

        if (fs.Length != 0) return;
        var pdf = new PdfDocument();
        var pages = await GetPages(m);
        pdf.PageSettings.SetMargins(0);


        pdf.FileStructure.IncrementalUpdate = true;
        pdf.EnableMemoryOptimization = true;
        pdf.Compression = PdfCompressionLevel.Best;


        for (var pi = 0; pi < c.ContentPages; pi++)
        {
            var section = pdf.Sections.Add();
            var mr = section.PageSettings.Margins = new PdfMargins();
            mr.All = 0;
            var page = section.Pages.Add();
            var g = page.Graphics;
            page.DefaultLayerIndex = 0;
            var pu = pages[pi];
            var client = new HttpClient();
            var im = await client.GetAsync(pu);
            var pdi = PdfImage.FromStream(im.Content.ReadAsStreamAsync().Result);

            g.DrawImage(pdi, new PointF(0, 0), g.ClientSize);
            await pdf.SaveAsync(fs);
        }
        await pdf.SaveAsync(fs);
        pdf.DocumentInformation.Title = c.ContentName;
        pdf.DocumentInformation.Author += string.Join(", ", c.ContentArtists.Select(x => x.Attribute));
        pdf.DocumentInformation.Keywords += string.Join(", ", c.ContentTags.Select(x => x.Attribute)).Replace("\"", string.Empty);
        pdf.Save(fs);
        pdf.Close(true);

        var toast = Notifications.NotifyMangaDownloaded(m);
        ToastNotificationManager.CreateToastNotifier().Show(toast);
        fs.Dispose();
    }

我会问内存泄漏,但如果我再发一篇文章可能是最好的。

提前致谢。

(我在Syncfusion论坛上发布了这个,但我觉得我可能会在这里得到更好的回复)

1 个答案:

答案 0 :(得分:0)

好吧,我重构了一些方法,内存泄漏最终导致了原因。获得的经验:使用陈述是你的朋友。

更具体一点,我刚创建了一个文件作为PDF的目的地,然后称为

using (Stream s = new FileStream(/*string*/>f.Path, FileMode.OpenOrCreate)) { await Task.Run(() => SaveAsPdf(/*StorageFile*/f, /*Manga*/m)); }

需要移动各种其他东西,但保持FileStream打开最终成为问题。