Извлечь одну страницу из документа XPS

Мне нужно разделить существующий документ XPS и создать новый документ XPS только с одной страницей оригинала. Я пытался скопировать документ и удалить страницы из скопированного документа, но это очень медленно. Есть ли более эффективный способ сделать это? В C# пожалуйста.

Благодарю.

Постановили:

public void Split(string originalDocument, string detinationDocument)
    {
        using (Package package = Package.Open(originalDocument, FileMode.Open, FileAccess.Read))
        {
            using (Package packageDest = Package.Open(detinationDocument))
            {
                string inMemoryPackageName = "memorystream://miXps.xps";
                 Uri packageUri = new Uri(inMemoryPackageName);
                 PackageStore.AddPackage(packageUri, package);
                XpsDocument xpsDocument = new XpsDocument(package, CompressionOption.Maximum, inMemoryPackageName);
                XpsDocument xpsDocumentDest = new XpsDocument(packageDest, CompressionOption.Normal, detinationDocument);
                var fixedDocumentSequence = xpsDocument.GetFixedDocumentSequence();
                DocumentReference docReference = xpsDocument.GetFixedDocumentSequence().References.First();
                FixedDocument doc = docReference.GetDocument(false);
                var content = doc.Pages[2];
                var fixedPage = content.GetPageRoot(false);
                var writter = XpsDocument.CreateXpsDocumentWriter(xpsDocumentDest);
                writter.Write(fixedPage);
                xpsDocumentDest.Close();
                xpsDocument.Close();
            }
        }
    }

2 ответа

Решение
  1. Откройте XpsDocument
  2. Создайте целевой XpsDocument (тот же метод)
  3. Получить FixedDocumentSequece из первого XpsDocument
  4. Получить первый FixedDocument из последовательности.
  5. Получить первый PageContent из свойства Pages
  6. Получить FixedPage из дочернего свойства PageContent
  7. Получите XpsDocumentWriter из второго XpsDocument
  8. Написать FixedPage

Легко.


Как отмечает Christopher Currens, может понадобиться использовать PageContent.GetPageRoot вместо Child на шаге 6.

Спасибо, это может помочь многим людям, которые ищут способ обойти ограничение печати Xps, которое игнорирует PrintTicket, определенный на уровне страницы.

https://connect.microsoft.com/VisualStudio/feedback/details/529120/printqueue-addjob-ignores-printtickets-in-xps-documents

Другие вопросы по тегам