Компонент Одна генерация PDF-файла с использованием отрисовки изображения приводит к сбою при печати более 40 страниц PDF-файла.

Я использую приведенный ниже код для создания pdf страницы со списком. И все это работает хорошо, пока у меня не будет очень маленького списка, как только я получил список с более чем 50 элементами, он падает с исключением памяти. Я думаю, что variable pdf занимает всю память. Я проверил с помощью профилирования, что оно превышает 180, а переменная pdf была сверху, когда я делал снимок профиля.

async PDFTest_Loaded(int a)
{
    try
    {
            pdf = new C1PdfDocument(PaperKind.Letter);
            pdf.Compression = CompressionLevel.NoCompression;
            WriteableBitmap writeableBmp = await initializeImage();
            List<WriteableBitmap> ListBitmaps = new List<WriteableBitmap>();
            pdfPage PageBitmaps = new pdfPage();

            FrameworkElement header = RTABlock as FrameworkElement;
            header.Arrange(pdf.PageRectangle);
            var headerImage = await CreateBitmap(header);


            FrameworkElement Pageheader = SalikPaymentReceipt as FrameworkElement;
            Pageheader.Arrange(pdf.PageRectangle);
            var PageHeaderImage = await CreateBitmap(Pageheader);

            double pdfImageWidth = 0;
            foreach (var item in EpayPreviewListView.Items)
            {
                List<WriteableBitmap> temp = new List<WriteableBitmap>();
                var obj = EpayPreviewListView.ContainerFromItem(item);
                List<FrameworkElement> controls = Children(obj);
                StackPanel ListItemStackPanel = controls.Where(x => x is StackPanel && x.Name == "ListItemStackPanel").First() as StackPanel;
                if (ListItemStackPanel is StackPanel)
                {
                    StackPanel itemui = ListItemStackPanel as StackPanel;
                    if (!(pdfImageWidth > 0))
                    {
                        pdfImageWidth = itemui.ActualWidth;
                    }
                    itemui.Arrange(new Rect(0, 0, pdfImageWidth, pdf.PageRectangle.Height));
                    temp.Add(await CreateBitmap(itemui));
                    PageBitmaps = new pdfPage() { bitmap = temp };
                    CreateDocumentText(pdf, headerImage, writeableBmp, PageHeaderImage, PageBitmaps);
                    PageBitmaps = null;
                    temp = new List<WriteableBitmap>();
                }
            }


            StorageFile Assets = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync("Salik Payment Receipts.pdf", CreationCollisionOption.GenerateUniqueName);

            PdfUtils.Save(pdf, Assets);

            EpayPreviewListView.InvalidateArrange();
            EpayPreviewListView.UpdateLayout();

            LoadingProgress.Visibility = Visibility.Collapsed;
            PrintButton.IsEnabled = true;
        }
        catch (Exception ex)
        {
            Debugger.Break();
        }

    }
        public List<FrameworkElement> Children(DependencyObject parent)
    {
        try
        {
            var list = new List<FrameworkElement>();
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
            {
                var child = VisualTreeHelper.GetChild(parent, i);
                if (child is StackPanel || child is TextBlock || child is ListView)
                    list.Add(child as FrameworkElement);
                list.AddRange(Children(child));
            }
            return list;
        }
        catch (Exception e)
        {

            Debug.WriteLine(e.ToString() + "\n\n" + e.StackTrace);
            Debugger.Break();
            return null;
        }
    }
        async public Task<WriteableBitmap> CreateBitmap(FrameworkElement element)
    {
        // render element to image (WinRT)
        try
        {
            var renderTargetBitmap = new RenderTargetBitmap();
            await renderTargetBitmap.RenderAsync(element);
            var wb = new WriteableBitmap(renderTargetBitmap.PixelWidth, renderTargetBitmap.PixelHeight);
            (await renderTargetBitmap.GetPixelsAsync()).CopyTo(wb.PixelBuffer);
            //var rect = new Rect(0, 0, renderTargetBitmap.PixelWidth, renderTargetBitmap.PixelHeight);
            if (!App.IsEnglishSelected)
            {
                wb = wb.Flip(WriteableBitmapExtensions.FlipMode.Vertical);
            }
            return wb;
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.ToString() + "\n\n" + ex.StackTrace);
            Debugger.Break();
            return new WriteableBitmap(0, 0);
        }
    }
        bool isFirst = true;
    void CreateDocumentText(C1PdfDocument pdf, WriteableBitmap headerImage, WriteableBitmap writeableBmp, WriteableBitmap pageHeading, pdfPage ListItem)
    {
        try
        {
            if (!isFirst)
            {
                pdf.NewPage();
            }
            isFirst = false;
            pdf.Landscape = false;
            double contentHeight = 0;
            double leftMargin = 0;
            string fontName = "Arial";

            // measure and show some text 
            var text = App.GetResource("RoadandTransportAuthority");
            var font = new Font(fontName, 36, PdfFontStyle.Bold);

            // create StringFormat used to set text alignment and line spacing
            var fmt = new StringFormat();
            fmt.Alignment = HorizontalAlignment.Center;

            var rc = new Rect(0, 0,
                pdf.PageRectangle.Width, headerImage.PixelHeight);
            pdf.DrawImage(headerImage, rc, ContentAlignment.MiddleCenter, Stretch.None);
            contentHeight += headerImage.PixelHeight + 2;

            rc = new Rect(0, contentHeight, pdf.PageRectangle.Width, writeableBmp.PixelHeight);
            pdf.DrawImage(writeableBmp, rc);
            contentHeight += writeableBmp.PixelHeight + 5;

            rc = new Rect(leftMargin, contentHeight,
                pdf.PageRectangle.Width,
                pageHeading.PixelHeight);
            pdf.DrawImage(pageHeading, rc, ContentAlignment.MiddleCenter, Stretch.None);

            contentHeight += pageHeading.PixelHeight + 2;


            Debug.WriteLine(ListItem.bitmap.Count.ToString());

            for (int i = 0; i < ListItem.bitmap.Count; i++)
            {
                rc = PdfUtils.Offset(rc, 0, rc.Height + 10);
                rc.Height = ListItem.bitmap.ElementAt(i).PixelHeight;
                pdf.DrawImage(ListItem.bitmap.ElementAt(i), rc, ContentAlignment.TopCenter, Stretch.None);
                ListItem.bitmap[i] = null;
            }
            ListItem = null;
        }
        catch (Exception e)
        {
              //...
        }
    }

person Yawar    schedule 23.07.2015    source источник


Ответы (1)


Это связано с конфликтом памяти, мне приходится снижать качество изображений, чтобы справиться с этим. Также требуется некоторое время для освобождения памяти.

person Yawar    schedule 17.12.2015