这是我的代码。我希望视图框根据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();