2010-09-25 36 views

Trả lời

9

Tôi đã chạy qua bài đăng trên blog này từ Josh Twist dường như làm những gì bạn muốn.

Cracking an XPS in WPF

On tìm kiếm trên mạng, có rất nhiều các chương trình/thử nghiệm trả tiền yêu cầu bồi thường để làm điều này (tôi đã không cố gắng nào của họ, vì vậy tôi không thể xác/liệt kê bất kỳ trong số họ). Tôi cho rằng bạn muốn viết mã của riêng bạn.

Đây là 'thịt' của bài đăng blog (đặc):

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)); 
} 
+0

Thankyou rất nhiều! Đây chính xác là những gì tôi muốn; và tôi đã sử dụng nó và nó hoạt động! Cảm ơn một lần nữa! –

+0

Tuyệt vời, vui vì nó đã giúp. –

+0

Cảm ơn giải pháp này. Bạn sẽ nghĩ rằng một hoạt động tương đối đơn giản sẽ dễ dàng hơn nhiều so với mã khá dày đặc này ... nó không chính xác rõ ràng. –

1

Vui lòng tham khảo chấp nhận answer nó là thực sự hữu ích (nó đã giúp tôi cũng) .Tôi chỉ muốn lưu ý đến một số rất điểm quan trọng trong giải pháp đó.

nếu bạn đang thực hiện của riêng DocumentPaginator (như trong trường hợp của tôi) sau đó mã mà sẽ không làm việc bởi vì chúng tôi sẽ không có được tham chiếu đến Paginator cụ thể của bạn từ báo cáo kết quả

DocumentPaginator paginator = seq.DocumentPaginator; 

Đúc này để paginator của riêng bạn cũng sẽ không làm việc.

cũng là giải pháp rất phức tạp trong trường hợp bạn có Paginator của riêng mình.
Vì vậy, tôi đã phát triển một giải pháp đơn giản, dựa trên giải pháp được chấp nhận của câu hỏi này và điều này làm việc chính xác khi cần thiế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(); 
} 
Các vấn đề liên quan