Re: Mer C# och WPF frågor
Postat: 26 januari 2017, 03:13:19
Fungerar ypperligt, tack.
Svenskt forum för elektroniksnack.
https://elektronikforumet.com/forum/
Kod: Markera allt
public static void writePDFimageFromStream(MemoryStream chartStream, int plotNum)
{
XGraphics gfx;
double x = 0, y = 0;
var img = new System.Windows.Media.Imaging.BitmapImage();
img.BeginInit();
img.StreamSource = chartStream;
img.EndInit();
PdfDocument document = PdfReader.Open(finalfilename, PdfDocumentOpenMode.Modify);
if (document.AcroForm.Elements.ContainsKey("/NeedAppearances") == false)
{
document.AcroForm.Elements.Add("/NeedAppearances", new PdfBoolean(true));
}
else
{
document.AcroForm.Elements["/NeedAppearances"] = new PdfBoolean(true);
}
int numPages = document.PageCount;
XImage image = XImage.FromBitmapSource(img);
double width = image.PixelWidth;
double hrez = image.HorizontalResolution;
double height = image.PixelWidth;
double vrez = image.VerticalResolution;
switch (plotNum)
{
case 0:
gfx = XGraphics.FromPdfPage(document.Pages[2]);
x = 60;
y = 200;
gfx.DrawImage(image, x, y,250d,250d);
gfx = null;
//gfx.Dispose();
break;
case 1:
gfx = XGraphics.FromPdfPage(document.Pages[2]);
x = 325;
y = 200;
gfx.DrawImage(image, x, y, 250d, 250d);
gfx.Dispose();
break;
case 2:
gfx = XGraphics.FromPdfPage(document.Pages[2]);
x = 60;
y = 500;
gfx.DrawImage(image, x, y, 250d, 250d);
gfx.Dispose();
break;
case 3:
gfx = XGraphics.FromPdfPage(document.Pages[2]);
x = 325;
y = 500;
gfx.DrawImage(image, x, y, 250d, 250d);
gfx.Dispose();
break;
case 4:
gfx = XGraphics.FromPdfPage(document.Pages[3]);
x = 60;
y = 200;
gfx.DrawImage(image, x, y, 250d, 250d);
// gfx = null;
gfx.Dispose();
break;
case 5:
gfx = XGraphics.FromPdfPage(document.Pages[3]);
x = 325;
y = 200;
gfx.DrawImage(image, x, y, 250d, 250d);
gfx = null;
// gfx.Dispose(); gfx = null;
gfx.Dispose();
break;
case 6:
gfx = XGraphics.FromPdfPage(document.Pages[3]);
x = 60;
y = 500;
gfx.DrawImage(image, x, y, 250d, 250d);
gfx.Dispose();
break;
case 7:
gfx = XGraphics.FromPdfPage(document.Pages[3]);
x = 325;
y = 500;
gfx.DrawImage(image, x, y, 250d, 250d);
gfx.Dispose();
break;
default:
break;
}
document.Save(finalfilename);
chartStream = null;
image.Dispose();
document.Close();
document.Dispose();
GC.Collect();
}
Kod: Markera allt
BitmapSource render = plotRender(pltEvapDuty1, pltEvapDuty1.ActualWidth, pltEvapDuty1.ActualWidth);
using (MemoryStream EvapDuty1Stream = new MemoryStream())
{
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(render));
encoder.Save(EvapDuty1Stream);
CalcPdfOutput.writePDFimageFromStream(EvapDuty1Stream, 0);
}
Kod: Markera allt
private BitmapSource plotRender(Visual target, double dpiX, double dpiY)
{
if (target == null)
{
return null;
}
Rect bounds = VisualTreeHelper.GetDescendantBounds(target);
RenderTargetBitmap rtb = new RenderTargetBitmap((int)(bounds.Width * dpiX / 96.0),
(int)(bounds.Height * dpiY / 96.0),
dpiX,
dpiY,
PixelFormats.Pbgra32);
DrawingVisual dv = new DrawingVisual();
using (DrawingContext ctx = dv.RenderOpen())
{
VisualBrush vb = new VisualBrush(target);
ctx.DrawRectangle(vb, null, new Rect(new Point(), bounds.Size));
}
rtb.Render(dv);
return rtb;
}
Kod: Markera allt
using (MemoryStream COP2Stream = new MemoryStream())
{
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(render));
encoder.Save(COP2Stream);
CalcPdfOutput.writePDFimageFromStream(COP2Stream, 7);
}
Kod: Markera allt
BitmapImage img = new BitmapImage();
img.BeginInit();
img.StreamSource = chartStream;
img.EndInit();
Så nått fel gör jag uppenbarligen, frågan är vad.An unhandled exception of type 'System.IO.FileFormatException' occurred in PresentationCore.dll