为什么我的视图框渲染会被裁剪?

时间:2014-11-10 14:58:18

标签: c# wpf xaml pdf

这是我的代码。我希望视图框根据pdf画布大小的大小进行渲染(类似于750乘600)。但是,当图像保存为pdf时,图像会被严重裁剪。仅保存顶部/左侧详细信息。我知道就是这种情况,因为如果我将page.Canvas.DrawImage的尺寸参数设置为各种值,图像会改变尺寸,但它始终是相同的裁剪图像,因此RenderTargetBitmap不会正确地渲染视图框或编码器编码不正确或pdfimage.fromstream未正确转换。

        //.. set up the doc
        var doc = new PdfDocument();
        var page = doc.Pages.Add(PdfPageSize.Letter, new PdfMargins(30f), PdfPageRotateAngle.RotateAngle0, PdfPageOrientation.Landscape);

        //.. render the viewbox (must be done or its elements don't scale)
        vb.Measure(new System.Windows.Size(page.Canvas.ClientSize.Width, page.Canvas.ClientSize.Height));
        vb.Arrange(new Rect(0, 0, page.Canvas.ClientSize.Width, page.Canvas.ClientSize.Height));
        vb.UpdateLayout();
        RenderTargetBitmap render = new RenderTargetBitmap((int)vb.ActualWidth, (int)vb.ActualHeight, 150, 150, PixelFormats.Pbgra32);
        render.Render(vb);

        //.. save the render to memory
        var stream = new MemoryStream();
        BitmapEncoder encoder = new PngBitmapEncoder();
        var frame = BitmapFrame.Create(render);
        encoder.Frames.Add(frame);
        encoder.Save(stream);

        //.. use spire pdf to convert the stream to an image
        var img = PdfImage.FromStream(stream);
        float widthFitRate = img.PhysicalDimension.Width / page.Canvas.ClientSize.Width;
        float heightFitRate = img.PhysicalDimension.Height / page.Canvas.ClientSize.Height;
        float fitRate = Math.Max(widthFitRate, heightFitRate);
        float fitWidth = img.PhysicalDimension.Width / fitRate;
        float fitHeight = img.PhysicalDimension.Height / fitRate;
        page.Canvas.DrawImage(img, new PointF(0,0), new SizeF(img.PhysicalDimension.Width, img.PhysicalDimension.Height  ));
        doc.SaveToFile(@"C:\test.pdf");
        doc.Close();

0 个答案:

没有答案
相关问题