Bir XPS belgesindeki her sayfayı C# kullanarak programatik olarak görüntüye dönüştürmenin bir yolu var mı?Bir XPS dosyasındaki her sayfayı C# içindeki bir görüntüye nasıl dönüştürebilirim?
cevap
Bu blog yayınınında, istediğiniz şeyi yapmak için görünen Josh Twist ile karşılaştım.
net arıyor günü, bunu yapmak için iddia birçok ücretli/deneme programları vardır (ben onların hiçbirini denemedim, bu yüzden bunlardan herhangi listelemek/kefil olamaz). Kendi kodunuzu yazmayı istediniz.
Uri uri = new Uri(string.Format("memorystream://{0}", "file.xps"));
FixedDocumentSequence seq;
using (Package pack = Package.Open("file.xps", ...))
using (StorePackage(uri, pack)) // see method below
using (XpsDocument xps = new XpsDocument(pack, Normal, uri.ToString()))
{
seq = xps.GetFixedDocumentSequence();
}
DocumentPaginator paginator = seq.DocumentPaginator;
Visual visual = paginator.GetPage(0).Visual; // first page - loop for all
FrameworkElement fe = (FrameworkElement)visual;
RenderTargetBitmap bmp = new RenderTargetBitmap((int)fe.ActualWidth,
(int)fe.ActualHeight, 96d, 96d, PixelFormats.Default);
bmp.Render(fe);
PngBitmapEncoder png = new PngBitmapEncoder();
png.Frames.Add(BitmapFrame.Create(bmp));
using (Stream stream = File.Create("file.png"))
{
png.Save(stream);
}
public static IDisposable StorePackage(Uri uri, Package package)
{
PackageStore.AddPackage(uri, package);
return new Disposer(() => PackageStore.RemovePackage(uri));
}
kabul answer o (o da bana yardımcı oldu) .Ben sadece bazı çok notu istiyorum gerçekten yararlıdır bakınız: Burada
(özet) blog yayınının 'et' olduğu bu çözümde önemli bir nokta.sen uyguladıklarını eğer kendi DocumentPaginator (benim durumumda olduğu gibi) biz de kendi paginator bu Döküm açıklamada
DocumentPaginator paginator = seq.DocumentPaginator;
adresinin belirli paginator başvurusunu almazsınız çünkü o kod çalışmaz çalışmayacak.
Ayrıca, kendi Paginator
ürününüzün olması durumunda çözüm çok karmaşıktır.
Bu yüzden, bu sorunun kabul edilen çözümüne dayanan basitleştirilmiş bir çözüm geliştirdim ve bu tam olarak gerektiği gibi çalıştı.
// create your own paginator instead of this
// this is my specific own implementation for DocumentPaginator class
ReportPaginator paginator = new ReportPaginator(report);
Visual visual = paginator.GetPage(0).Visual; // first page - loop for all
RenderTargetBitmap bmp = new RenderTargetBitmap((int)paginator.PageSize.Width, (int)paginator.PageSize.Height, 96d, 96d, PixelFormats.Default);
bmp.Render(visual);
PngBitmapEncoder png = new PngBitmapEncoder();
png.Frames.Add(BitmapFrame.Create(bmp));
using (MemoryStream sm = new MemoryStream())
{
png.Save(sm);
return sm.ToArray();
}
Çok teşekkür ederim! Bu tam olarak istediğim şeydi; ve onu kullandım ve işe yarıyor! Tekrar teşekkürler! –
Mükemmel, yardım ettiğine sevindim. –
Bu çözüm için teşekkürler. Göreceli olarak basit bir operasyonun, bu oldukça yoğun koddan çok daha kolay olacağını düşünebilirsiniz. –