none
C#: Извлечение координат из XPS RRS feed

  • Вопрос

  • Здравствуйте!
    Подскажите, пожалуйста, как с помощью C# найти и извлечь из файла XPS координаты (OriginX, OriginY) определенного слова "m1" (20 строка)?


    <?xml version="1.0" encoding="utf-8" standalone="yes"?> 
    <FixedPage xmlns="http://schemas.microsoft.com/xps/2005/06" xmlns:x="http://schemas.microsoft.com/xps/2005/06/resourcedictionary-.." xml:lang="en-us" Width="793.733317057" Height="1122.533365885" Name="Page1"> 
    <Canvas RenderTransform="1.333333373,0,0,1.333333373,0,0"> 
    <Canvas RenderTransform="0.75069356,0,0,0.750356555,0,0" Clip="M0,0 L793,0 L793,1122 L0,1122 Z"> 
    <Canvas> 
    <Canvas RenderTransform="1.333333373,0,0,1.333333373,0,0"> 
    <Path Data="M0,0 L595,0 L595,841 L0,841 Z"> 
    <Path.Fill> 
    <SolidColorBrush Color="#FFFFFFFF" /> 
    </Path.Fill> 
    </Path> 
    </Canvas> 
    </Canvas> 
    <Canvas> 
    <Canvas RenderTransform="1.333333373,0,0,1.333333373,0,0"> 
    <Canvas RenderTransform="1,0,0,1,0,0"> 
    <Canvas> 
    <Canvas RenderTransform="1,0,0,1,85.054504395,67.183319092">
    <Canvas RenderTransform="1,0,0,1,0,0"> 
    <Glyphs OriginX="0" OriginY="0" UnicodeString="m1" Fill="#FF000000" FontRenderingEmSize="11.010172844" FontUri="/Resources/f923428d-d71a-4021-8c4c-bf0f711f3743.odttf" /> 
    </Canvas> 
    </Canvas> 
    </Canvas> 
    </Canvas> 
    </Canvas> 
    </Canvas> 
    </Canvas> 
    </Canvas> 
    </FixedPage>


    • Изменено Ivan Mys 18 августа 2017 г. 12:01
    18 августа 2017 г. 12:01

Ответы

  • Добрый день.

    XMS файл, это обычный XML, т.е. вы можете загрузить его в программу при помощи, например, класса XmlDocument:

    static void Main(string[] args)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load("1.xps");
        var glyphs = doc.GetElementsByTagName("Glyphs");
        Console.WriteLine($"{glyphs.Item(0).Attributes["OriginX"].Value} {glyphs.Item(0).Attributes["OriginY"].Value}");
        Console.ReadKey();
    }

    • Помечено в качестве ответа Ivan Mys 23 августа 2017 г. 7:02
    18 августа 2017 г. 13:14
    Отвечающий
  • XPS файл - сам по себе не XML. Он как документы Office 2007+, ZIP-архив, состоящий из XML-файлов. Вам нужно его распаковать и взять файл 1.fpage (переименуйте XPS в ZIP, сами все поймете).
    • Помечено в качестве ответа Ivan Mys 23 августа 2017 г. 7:02
    22 августа 2017 г. 8:13
  • Смотря под какую версию NET Framework вы планируете компилировать. Если 4.5 или более новые, то используйте класс System.IO.Compression.ZipArchive. Через GetEntry получаете файл, потом Open и работаете с потоком. 

    Если под более старые версии, то либо сторонние библиотеки, либо COM-объект Shell (переименовать в расширение *.zip и работать с архивом как с папкой).

    • Помечено в качестве ответа Ivan Mys 23 августа 2017 г. 8:38
    23 августа 2017 г. 8:16

Все ответы

  • Добрый день.

    XMS файл, это обычный XML, т.е. вы можете загрузить его в программу при помощи, например, класса XmlDocument:

    static void Main(string[] args)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load("1.xps");
        var glyphs = doc.GetElementsByTagName("Glyphs");
        Console.WriteLine($"{glyphs.Item(0).Attributes["OriginX"].Value} {glyphs.Item(0).Attributes["OriginY"].Value}");
        Console.ReadKey();
    }

    • Помечено в качестве ответа Ivan Mys 23 августа 2017 г. 7:02
    18 августа 2017 г. 13:14
    Отвечающий
  • В чем может быть ошибка?

    Выводит сообщение для строки doc.Load("1.xps");

    Исключение не обработано

    System.Xml.XmlException: "Недопустимые данные на корневом уровне., строка 1, позиция 1."

    Подробности:

    System.Xml.XmlException произошло
      HResult=0x80131940
      Сообщение = Недопустимые данные на корневом уровне., строка 1, позиция 1.
      Источник = System.Xml
      Трассировка стека:
       в System.Xml.XmlTextReaderImpl.Throw(Exception e)
       в System.Xml.XmlTextReaderImpl.Throw(String res, String arg)
       в System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace()
       в System.Xml.XmlTextReaderImpl.ParseDocumentContent()
       в System.Xml.XmlTextReaderImpl.Read()
       в System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)
       в System.Xml.XmlDocument.Load(XmlReader reader)
       в System.Xml.XmlDocument.Load(String filename)
       в _20._08prim.Program.Main(String[] args) в c:\users\иван\documents\visual studio 2017\Projects\20.08prim\20.08prim\Program.cs:строка 15


    • Изменено Ivan Mys 20 августа 2017 г. 6:42
    20 августа 2017 г. 6:42
  • Причин может быть много. Например, в начале файла находится UTF8 Byte Order Mark, а парсер ожидает текст без нее. Возмите текстовый редактор с функцией выбора кодировки (типа Notepad++) и сохраните в "UTF8 без Byte Order Mark".
    20 августа 2017 г. 7:53
  • Попробовал. К сожалению, не помогло

    Впервые столкнулся с xml и xps. 
    На другом форуме подсказывают, что координаты определяются по 
    RenderTransform.

    Нужны координаты UnicodeString="m1", чтобы потом по этим координатам размещать картинку на PDF.

    • Изменено Ivan Mys 20 августа 2017 г. 9:34
    20 августа 2017 г. 9:11
  • Скиньте файл на файлообменник, посмотрю. Не знаю, из-за чего еще может быть такая ошибка.
    20 августа 2017 г. 14:28
  • https://yadi.sk/d/8d0x7xCY3MBRrn
    21 августа 2017 г. 4:33
  • Нужен XPS файл, а не проект. У меня нормально работает, если ваш XPS с первого сообщения скопировать в файл. У вас видимо с файлом что-то не так.
    21 августа 2017 г. 5:51
  • https://yadi.sk/d/uPeaS-0e3MDegT
    22 августа 2017 г. 6:26
  • Я полностью согласен с XmlDocument, в файле отсутствуют нужные символы:

    Это не XML-ка представленная вами в вопросе, а бинарный файл...


    22 августа 2017 г. 6:53
    Отвечающий
  • XPS файл - сам по себе не XML. Он как документы Office 2007+, ZIP-архив, состоящий из XML-файлов. Вам нужно его распаковать и взять файл 1.fpage (переименуйте XPS в ZIP, сами все поймете).
    • Помечено в качестве ответа Ivan Mys 23 августа 2017 г. 7:02
    22 августа 2017 г. 8:13
  • Прошу прощения. Не правильно вопрос поставил. XML, который скинул, я и взял из архива *.xps\Documents\1\ Pages\1.fpage
    В вопросе не уточнил, что нужно с помощью C# открыть архив *.xps и перейти в файл 
    1.fpage, из которого извлечь координаты.
    23 августа 2017 г. 7:15
  • Смотря под какую версию NET Framework вы планируете компилировать. Если 4.5 или более новые, то используйте класс System.IO.Compression.ZipArchive. Через GetEntry получаете файл, потом Open и работаете с потоком. 

    Если под более старые версии, то либо сторонние библиотеки, либо COM-объект Shell (переименовать в расширение *.zip и работать с архивом как с папкой).

    • Помечено в качестве ответа Ivan Mys 23 августа 2017 г. 8:38
    23 августа 2017 г. 8:16
  • Спасибо. Использую Compression.

    Поэкспериментировал с расположением созданной мною меткой и заметил, что Glypgs OriginX и OriginY не меняются (0; 0).

    Подскажите, пожалуйста, где хранятся координаты? Может в RenderTransform (там значения меняются)? Не понятно, что это за формат и как с ним работать.

    Нужны координаты строки m1.

    Ссылка на файл .docx: https://yadi.sk/i/gosWS5eY3MFgHe 

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <FixedPage xmlns="http://schemas.microsoft.com/xps/2005/06" xmlns:x="http://schemas.microsoft.com/xps/2005/06/resourcedictionary-key" xml:lang="en-us" Width="793.733317057" Height="1122.533365885" Name="Page1">
    	<Canvas RenderTransform="1.333333373,0,0,1.333333373,0,0">
    		<Canvas RenderTransform="0.75069356,0,0,0.750356555,0,0" Clip="M0,0 L793,0 L793,1122 L0,1122 Z">
    			<Canvas>
    				<Canvas RenderTransform="1.333333373,0,0,1.333333373,0,0">
    					<Path Data="M0,0 L595,0 L595,841 L0,841 Z">
    						<Path.Fill>
    							<SolidColorBrush Color="#FFFFFFFF" />
    						</Path.Fill>
    					</Path>
    				</Canvas>
    			</Canvas>
    			<Canvas>
    				<Canvas RenderTransform="1.333333373,0,0,1.333333373,0,0">
    					<Canvas RenderTransform="1,0,0,1,0,0">
    						<Canvas>
    							<Canvas RenderTransform="1,0,0,1,85.050003052,67.183319092">
    								<Canvas RenderTransform="1,0,0,1,0,0">
    									<Glyphs OriginX="0" OriginY="0" UnicodeString="M2" Fill="#FF000000" FontRenderingEmSize="11.010172844" FontUri="/Resources/56fd26c4-bd6c-42bb-bad7-8ed44dc73f60.odttf" />
    								</Canvas>
    							</Canvas>
    						</Canvas>
    					</Canvas>
    				</Canvas>
    			</Canvas>
    			<Canvas>
    				<Canvas RenderTransform="1.333333373,0,0,1.333333373,0,0">
    					<Canvas RenderTransform="1,0,0,1,0,0">
    						<Canvas>
    							<Canvas RenderTransform="1,0,0,1,85.050003052,168.950897217">
    								<Canvas RenderTransform="1,0,0,1,0,0">
    									<Glyphs OriginX="0" OriginY="0" UnicodeString="M3" Fill="#FF000000" FontRenderingEmSize="11.010172844" FontUri="/Resources/56fd26c4-bd6c-42bb-bad7-8ed44dc73f60.odttf" />
    								</Canvas>
    							</Canvas>
    						</Canvas>
    					</Canvas>
    				</Canvas>
    			</Canvas>
    			<Canvas>
    				<Canvas RenderTransform="1.333333373,0,0,1.333333373,0,0">
    					<Canvas RenderTransform="1,0,0,1,0,0">
    						<Canvas>
    							<Canvas RenderTransform="1,0,0,1,85.050003052,550.579345703" />
    						</Canvas>
    					</Canvas>
    				</Canvas>
    			</Canvas>
    			<Canvas>
    				<Canvas RenderTransform="1.333333373,0,0,1.333333373,0,0">
    					<Canvas RenderTransform="1,0,0,1,0,0">
    						<Canvas>
    							<Canvas RenderTransform="1,0,0,1,219.342590332,550.579345703" />
    						</Canvas>
    					</Canvas>
    				</Canvas>
    			</Canvas>
    			<Canvas>
    				<Canvas RenderTransform="1.333333373,0,0,1.333333373,0,0">
    					<Canvas RenderTransform="1,0,0,1,0,0">
    						<Canvas>
    							<Canvas RenderTransform="1,0,0,1,291.460266113,550.579345703">
    								<Canvas RenderTransform="1,0,0,1,0,0">
    									<Glyphs OriginX="0" OriginY="0" UnicodeString=" " Fill="#FF000000" FontRenderingEmSize="11.010172844" FontUri="/Resources/56fd26c4-bd6c-42bb-bad7-8ed44dc73f60.odttf" />
    								</Canvas>
    								<Canvas RenderTransform="1,0,0,1,2.489116192,0">
    									<Glyphs OriginX="0" OriginY="0" UnicodeString="m1" Fill="#FF000000" FontRenderingEmSize="11.010172844" FontUri="/Resources/56fd26c4-bd6c-42bb-bad7-8ed44dc73f60.odttf" />
    								</Canvas>
    							</Canvas>
    						</Canvas>
    					</Canvas>
    				</Canvas>
    			</Canvas>
    		</Canvas>
    	</Canvas>
    </FixedPage>

    • Изменено Ivan Mys 23 августа 2017 г. 8:53
    23 августа 2017 г. 8:43
  • См. спецификацию формата: https://www.ecma-international.org/activities/XML%20Paper%20Specification/XPS%20Standard.pdf

    Параметр RenderTransform задает матрицу преобразования, в котором последние два параметра это координаты для операции переноса OffsetX, OffsetY.

    23 августа 2017 г. 9:54