У меня есть простая программа, которая читает файл XPS и создает дубликаты страниц.
Оригинальный документ:
![A very simple xps file.](https://i.stack.imgur.com/OWmEC.png)
Вывод получения 5 страниц:
![enter image description here](https://i.stack.imgur.com/EpZgD.png)
Как видите, операция очень проста. Однако я обнаружил, что при создании на количестве страниц, исключение "System.NotSupportedException. Префикс URI не распознан" Будет выброшено.
Я создал тестовую программу, которая увеличивает количество страниц в цикле while. Как вы можете видеть, я буду печатать URI каждого временного потока памяти, который использовался для хранения файла xps (просто для проверки коллизий или для отладки) и я обнаружил, что каждый раз, когда счетчик достигает 11 , здесь будет выдаваться исключение.
Перевести: 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);