diff options
-rw-r--r-- | experimental/xps_to_png/.gitignore | 1 | ||||
-rw-r--r-- | experimental/xps_to_png/compile_xps_to_png.bat | 28 | ||||
-rw-r--r-- | experimental/xps_to_png/xps_to_png.cs | 171 |
3 files changed, 109 insertions, 91 deletions
diff --git a/experimental/xps_to_png/.gitignore b/experimental/xps_to_png/.gitignore new file mode 100644 index 0000000000..335ad177dc --- /dev/null +++ b/experimental/xps_to_png/.gitignore @@ -0,0 +1 @@ +xps_to_png.exe diff --git a/experimental/xps_to_png/compile_xps_to_png.bat b/experimental/xps_to_png/compile_xps_to_png.bat index 4c34293f35..b4140d4246 100644 --- a/experimental/xps_to_png/compile_xps_to_png.bat +++ b/experimental/xps_to_png/compile_xps_to_png.bat @@ -1,14 +1,14 @@ -@rem Copyright 2016 Google Inc.
-@rem
-@rem Use of this source code is governed by a BSD-style license that can be
-@rem found in the LICENSE file.
-
-"C:\PROGRA~2\MSBUILD\14.0\BIN\AMD64\CSC.EXE" ^
-/lib:"\PROGRA~2\REFERE~1\MICROS~1\FRAMEW~1\NETFRA~1\V4.5.2" ^
-/reference:"ReachFramework.dll" ^
-/reference:"WindowsBase.dll" ^
-/reference:"PresentationCore.dll" ^
-/reference:"PresentationFramework.dll" ^
-"%~dp0%xps_to_png.cs"
-
-
+@rem Copyright 2016 Google Inc. +@rem +@rem Use of this source code is governed by a BSD-style license that can be +@rem found in the LICENSE file. + +@set CSC="C:\Program Files (x86)\MSBuild\14.0\Bin\amd64\csc.exe" +@set LIB="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2" + +%CSC% /lib:%LIB% ^ +/reference:"PresentationCore.dll" ^ +/reference:"PresentationFramework.dll" ^ +/reference:"ReachFramework.dll" ^ +/reference:"WindowsBase.dll" ^ +"%~dp0%xps_to_png.cs" diff --git a/experimental/xps_to_png/xps_to_png.cs b/experimental/xps_to_png/xps_to_png.cs index 951d4d79a2..34b913246d 100644 --- a/experimental/xps_to_png/xps_to_png.cs +++ b/experimental/xps_to_png/xps_to_png.cs @@ -1,77 +1,94 @@ -/*
- * 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();
- }
- }
-}
+/* + * 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) { + const double dpi = 72.0; + if (args.Length == 0) { + System.Console.WriteLine("usage:\n\txps_to_png [XPS_FILES]\n\n"); + System.Environment.Exit(1); + } + foreach (string arg in args) { + System.Threading.Thread t = new System.Threading.Thread( + () => try_convert(dpi, arg, arg)); + t.SetApartmentState(System.Threading.ApartmentState.STA); + t.Start(); + } + } +} |