2010-09-25 13 views
7

क्या कोई पृष्ठ XPS दस्तावेज़ में प्रत्येक पृष्ठ को प्रोग्रामिंग रूप से C# का उपयोग करके परिवर्तित करने का कोई तरीका है?प्रत्येक पृष्ठ को एक एक्सपीएस फ़ाइल में सी # में एक छवि में कैसे परिवर्तित करें?

उत्तर

9

मैं इस ब्लॉग पोस्ट में Josh Twist से भाग गया जो आपको लगता है कि ऐसा करने के लिए प्रतीत होता है।

Cracking an XPS in WPF

शुद्ध खोज, कई भुगतान किया/परीक्षण कार्यक्रमों ऐसा करने के लिए दावा है कि देखते हैं (मैं उनमें से किसी प्रयास नहीं किया है, तो मैं पुष्टि नहीं कर सकते/उनमें से किसी को सूचीबद्ध करें)। मुझे लगता है कि आप अपना कोड लिखना चाहते हैं।

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

बहुत बहुत धन्यवाद! यह वही है जो मैं चाहता था; और मैंने इसका इस्तेमाल किया है और यह काम करता है! एक बार फिर धन्यवाद! –

+0

बढ़िया, खुशी हुई इससे मदद मिली। –

+0

इस समाधान के लिए धन्यवाद। आपको लगता है कि अपेक्षाकृत सरल ऑपरेशन इस काफी घने कोड से बहुत आसान होगा ... यह बिल्कुल स्पष्ट नहीं है। –

1

कृपया स्वीकार कर लिया answer यह वास्तव में उपयोगी है (यह मुझे भी मदद की) मैं बस कुछ बहुत ही करने के लिए ध्यान दें करने के लिए चाहते का संदर्भ लें:

यहाँ ब्लॉग पोस्ट के 'मांस' (गाढ़ा) है उस समाधान में महत्वपूर्ण बिंदु।

अगर आप कार्यान्वित कर रहे हैं अपनी खुद की DocumentPaginator (मेरे मामले में) तो है कि कोड काम नहीं करेगा क्योंकि हम बयान

DocumentPaginator paginator = seq.DocumentPaginator; 

भी अपने स्वयं के paginator को यह कास्टिंग से अपने विशिष्ट paginator के संदर्भ में नहीं मिलेगा काम नहीं करेगा।

यह भी कि आपके पास Paginator है तो समाधान बहुत जटिल है।
इसलिए मैंने एक सरल समाधान विकसित किया, जो इस प्रश्न के स्वीकृत समाधान के आधार पर विकसित हुआ और यह बिल्कुल आवश्यकतानुसार काम करता था।

// 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(); 
}