更改 PdfImage 类型 (Syncfusion PDF)
Change PdfImage type (Syncfusion PDF)
所以我正在为 UWP XAML 使用 Syncfusion Controls,并且我正在尝试将 JPEG 插入到我正在创建的 PDF 中,但 PdfImage 似乎总是 return 位图。或者至少是具有类似位图文件大小的图像。
有什么方法可以确保插入的图像是 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();
}
我会询问内存泄漏,但如果我为此再做一个 post 可能最好。
提前致谢。
(我在 Syncfusion 论坛上 post 编辑了这个,但我觉得我可能会在这里得到更好的回应)
嗯,我重构了一些方法,内存泄漏最终成为原因。经验教训:使用语句是你的朋友。
更具体一点,我刚刚创建了一个文件作为 PDF 的目标,然后调用了
using (Stream s = new FileStream(/*string*/>f.Path, FileMode.OpenOrCreate))
{
await Task.Run(() => SaveAsPdf(/*StorageFile*/f, /*Manga*/m));
}
需要移动各种其他东西,但让 FileStream 打开最终成为问题。
所以我正在为 UWP XAML 使用 Syncfusion Controls,并且我正在尝试将 JPEG 插入到我正在创建的 PDF 中,但 PdfImage 似乎总是 return 位图。或者至少是具有类似位图文件大小的图像。 有什么方法可以确保插入的图像是 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();
}
我会询问内存泄漏,但如果我为此再做一个 post 可能最好。
提前致谢。
(我在 Syncfusion 论坛上 post 编辑了这个,但我觉得我可能会在这里得到更好的回应)
嗯,我重构了一些方法,内存泄漏最终成为原因。经验教训:使用语句是你的朋友。
更具体一点,我刚刚创建了一个文件作为 PDF 的目标,然后调用了
using (Stream s = new FileStream(/*string*/>f.Path, FileMode.OpenOrCreate))
{
await Task.Run(() => SaveAsPdf(/*StorageFile*/f, /*Manga*/m));
}
需要移动各种其他东西,但让 FileStream 打开最终成为问题。