/* * Copyright 2016 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ /* Compile with: "...../csc" \ /lib:"....." \ /reference:"ReachFramework.dll" \ /reference:"WindowsBase.dll" \ /reference:"PresentationCore.dll" \ /reference:"PresentationFramework.dll" \ xps_to_png.cs */ // logic inspired by this example: https://goo.gl/nCxrjQ class Program { static void convert(string path, string out_path) { System.Windows.Xps.Packaging.XpsDocument xpsDoc = new System.Windows.Xps.Packaging.XpsDocument(path, System.IO.FileAccess.Read); if (xpsDoc == null) { throw new System.Exception("XpsDocumentfailed"); } System.Windows.Documents.FixedDocumentSequence docSeq = xpsDoc.GetFixedDocumentSequence(); if (docSeq == null) { throw new System.Exception("GetFixedDocumentSequence failed"); } System.Windows.Documents.DocumentReferenceCollection drc = docSeq.References; int index = 0; foreach (System.Windows.Documents.DocumentReference dr in drc) { System.Windows.Documents.FixedDocument dp = dr.GetDocument(false); foreach (System.Windows.Documents.PageContent pc in dp.Pages) { System.Windows.Documents.FixedPage fixedPage = pc.GetPageRoot(false); double width = fixedPage.Width; double height = fixedPage.Height; System.Windows.Size sz = new System.Windows.Size(width, height); fixedPage.Measure(sz); fixedPage.Arrange(new System.Windows.Rect(new System.Windows.Point(), sz)); fixedPage.UpdateLayout(); System.Windows.Media.Imaging.BitmapImage bitmap = new System.Windows.Media.Imaging.BitmapImage(); System.Windows.Media.Imaging.RenderTargetBitmap renderTarget = new System.Windows.Media.Imaging.RenderTargetBitmap((int)width, (int)height, 96, 96, System.Windows.Media.PixelFormats.Default); renderTarget.Render(fixedPage); System.Windows.Media.Imaging.BitmapEncoder encoder = new System.Windows.Media.Imaging.PngBitmapEncoder(); encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(renderTarget)); System.IO.FileStream pageOutStream = new System.IO.FileStream( string.Format("{0}_{1}.png", out_path, index), System.IO.FileMode.Create, System.IO.FileAccess.Write); encoder.Save(pageOutStream); pageOutStream.Close(); ++index; } } } // Executes convert, catching thrown exceptions, and printing them to stdout, and exiting immediately static void try_convert(string path, string out_path) { try { convert(path, out_path); } catch (System.Exception e) { System.Console.WriteLine(e); System.Environment.Exit(1); } } // For each command line argument, convert xps to sequence of pngs static void Main(string[] args) { foreach (string arg in args) { System.Threading.Thread t = new System.Threading.Thread(() => try_convert(arg, arg)); t.SetApartmentState(System.Threading.ApartmentState.STA); t.Start(); } } }