| /* |
| * 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 int ceil(double x) { return (int)System.Math.Ceiling(x); } |
| static void convert(double dpi, string path, string out_path) { |
| double scale = dpi / 96.0; |
| 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( |
| ceil(scale * width), ceil(scale * height), dpi, dpi, |
| 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)); |
| string filename = string.Format("{0}_{1}.png", out_path, index); |
| System.IO.FileStream pageOutStream = new System.IO.FileStream( |
| filename, System.IO.FileMode.Create, System.IO.FileAccess.Write); |
| encoder.Save(pageOutStream); |
| pageOutStream.Close(); |
| System.Console.WriteLine(filename); |
| ++index; |
| } |
| } |
| } |
| // Executes convert, catching thrown exceptions, and printing them |
| // to stdout, and exiting immediately. |
| static void try_convert(double dpi, string path, string out_path) { |
| try { |
| convert(dpi, 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) { |
| double dpi = 72.0; |
| if (args.Length == 0) { |
| System.Console.WriteLine("usage:\n\txps_to_png [-dDPI] [XPS_FILES]\n\n"); |
| System.Environment.Exit(1); |
| } |
| System.Collections.Generic.List<string> xpsFiles = |
| new System.Collections.Generic.List<string>(); |
| foreach (string arg in args) { |
| string flag = "-d"; |
| if (arg.StartsWith(flag)) { |
| dpi = System.Convert.ToDouble(arg.Remove(0, flag.Length)); |
| } else if (System.IO.File.Exists(arg)) { |
| xpsFiles.Add(arg); |
| } else { |
| System.Console.WriteLine("file missing: '" + arg + "'\n\n"); |
| System.Environment.Exit(1); |
| } |
| } |
| foreach (string file in xpsFiles) { |
| System.Threading.Thread t = new System.Threading.Thread( |
| () => try_convert(dpi, file, file)); |
| t.SetApartmentState(System.Threading.ApartmentState.STA); |
| t.Start(); |
| } |
| } |
| } |