0

J'utilise le code ci-dessous pour générer le pdf d'une page ayant la liste. Et tout fonctionne bien jusqu'à ce que j'ai une très petite liste une fois que j'ai eu une liste avec plus de 50 éléments, il plante avec une exception de mémoire. Je pense que variable pdf prend toute la mémoire. J'ai vérifié en utilisant le profilage il va au-dessus de 180 et la variable pdf était sur le dessus quand j'ai pris l'instantané au profil.Compnent Une génération de pdf utilisant l'image de draw plantant si imprimant des pages de pdf plus de 40

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) 
     { 
       //... 
     } 
    } 

Répondre

0

C'est dû à la collision de mémoire que je dois diminuer la qualité des images pour le manipuler. En outre, il faut du temps pour libérer de la mémoire.