组件一pdf生成使用绘图图像崩溃如果打印pdf页超过40

时间:2015-07-23 07:55:47

标签: pdf windows-runtime pdf-generation winrt-xaml componentone

我使用下面的代码生成包含listview的页面的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)
        {
              //...
        }
    }

1 个答案:

答案 0 :(得分:0)

这是由于内存冲突我必须降低图像的质量来处理它。释放内存也需要一些时间。