«Префикс URI не распознан» при работе с документом XPS - PullRequest
0 голосов
/ 31 августа 2018

У меня есть простая программа, которая читает файл XPS и создает дубликаты страниц.

Оригинальный документ:

A very simple xps file.

Вывод получения 5 страниц:

enter image description here

Как видите, операция очень проста. Однако я обнаружил, что при создании на количестве страниц, исключение "System.NotSupportedException. Префикс URI не распознан" Будет выброшено.

Я создал тестовую программу, которая увеличивает количество страниц в цикле while. Как вы можете видеть, я буду печатать URI каждого временного потока памяти, который использовался для хранения файла xps (просто для проверки коллизий или для отладки) и я обнаружил, что каждый раз, когда счетчик достигает 11 , здесь будет выдаваться исключение.

enter image description here Перевести: System.NotSupportedException. Префикс URI не распознан
Интересно, что проблема повторяется, и я понятия не имел, что происходит: \ Любой совет будет оценен, спасибо!

class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        var xpsFile = File.ReadAllBytes(@"Test.xps");
        Stopwatch sw1 = new Stopwatch();
        int i = 5;
        while (true)
        {
            sw1.Start();

            var output = createDuplicatePages(xpsFile, i++);
            sw1.Stop();

            File.WriteAllBytes(@"output.xps", output);
            Console.WriteLine($"Trial {i} Completed. {sw1.ElapsedMilliseconds}");
            Console.ReadLine();
        }

    }

    static byte[] createDuplicatePages(byte[] originalXPS, int numberOfCopies)
    {

        byte[] ret = originalXPS;
        try
        {
            using (MemoryStream outputStream = new MemoryStream())
            {
                Package container = Package.Open(outputStream, FileMode.Create);
                XpsDocument xpsDoc = new XpsDocument(container);
                XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(xpsDoc);
                SerializerWriterCollator vxpsd = writer.CreateVisualsCollator();
                vxpsd.BeginBatchWrite();
                for (int nthCopy = 0; nthCopy < numberOfCopies; nthCopy++)
                {
                    MemoryStream inputStream = new MemoryStream(originalXPS);
                    string memoryStreamUri = "memorystream://" + Path.GetFileName(Guid.NewGuid().ToString() + ".xps");
                    Uri packageUri = new Uri(memoryStreamUri);
                    Console.WriteLine(packageUri.AbsoluteUri);
                    Package oldPackage = Package.Open(inputStream);
                    PackageStore.AddPackage(packageUri, oldPackage);
                    using (XpsDocument xpsOld = new XpsDocument(oldPackage, CompressionOption.Normal, memoryStreamUri))
                    {
                        FixedDocumentSequence seqOld = xpsOld.GetFixedDocumentSequence();                          
                        foreach (DocumentReference r in seqOld.References)
                        {
                            FixedDocument d = r.GetDocument(false);

                            foreach (PageContent pc in d.Pages)
                            {
                                FixedPage fixedPage = pc.GetPageRoot(false);
                                double width = fixedPage.Width;
                                double height = fixedPage.Height;

                                System.Windows.Size sz = new System.Windows.Size(width, height);
                                fixedPage.Width = width;
                                fixedPage.Height = height;
                                fixedPage.Measure(sz);
                                fixedPage.Arrange(new System.Windows.Rect(new System.Windows.Point(), sz));

                                ContainerVisual newPage = new ContainerVisual();

                                newPage.Children.Add(fixedPage);

                                vxpsd.Write(newPage);

                            }
                        }
                        PackageStore.RemovePackage(packageUri);
                    }
                    oldPackage.Close();
                }
                vxpsd.EndBatchWrite();
                container.Close();
                ret = outputStream.ToArray();
            }             
            return ret;
        }
        catch (Exception e)
        {
            return originalXPS;
        }
    }
}

Test.xps:
https://drive.google.com/file/d/1kXrcKeDgAeSsIGqQwx-UpRhLdx8eW0PV/view?usp=sharing

----- 9/9/2018 Обновлено -----

Я обнаружил, что следующая модификация решила проблему, но почему ?? Понятия не имею: \

vxpsd.BeginBatchWrite();
for (int nthCopy = 0; nthCopy < numberOfCopies; nthCopy++)
{
     MemoryStream inputStream = new MemoryStream(originalXPS);
     string memoryStreamUri = "memorystream://" + Path.GetFileName(Guid.NewGuid().ToString() + ".xps");

К

vxpsd.BeginBatchWrite();
string memoryStreamUri = "memorystream://" + Path.GetFileName(Guid.NewGuid().ToString() + ".xps");
for (int nthCopy = 0; nthCopy < numberOfCopies; nthCopy++)
{
     MemoryStream inputStream = new MemoryStream(originalXPS);
...