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