2016-02-17 2 views
0

По какой-то причине, когда я пытаюсь создать документ с несколькими страницами, первая страница одобрена, но все остальные будут пустыми.PDFSharp - Вторая страница пуста

public PdfDocument toPdf() 
{ 
    // Create new PDF document 
    PdfDocument document = new PdfDocument(); 
    XGraphics gfx; 
    PdfPage page; 

    foreach (var p in pages) 
    { 
     // Create new page 
     page = document.AddPage(); 
     page.Width = XUnit.FromMillimeter(width); 
     page.Height = XUnit.FromMillimeter(height); 
     gfx = XGraphics.FromPdfPage(page, XGraphicsUnit.Millimeter); 
     p.drawItems(gfx); 
    } 
    return document; 
} 

Любые подсказки?

+0

ли один из этих типов документов/график/страницы имеет 'интерфейс IDisposable'? – Stefan

+0

PdfDocument и XGraphics кажутся IDisposable ... – Jmorvan

ответ

2

AFAIK есть проблема с XGraphics при установке нестандартного устройства (миллиметровый в вашем случае) ,

Возможно, вторая страница не пуста, но содержимое находится за пределами «окна просмотра».

Если мои предположения верны, то первая страница также не будет правильной.

Смотрите этот случай на PDFsharp форуме:
http://forum.pdfsharp.net/viewtopic.php?p=9642#p9642

+0

получается, что это было. Я просчитывал позиции и единицы Миллиметр работает странно ... спасибо – Jmorvan

1

Попробуйте расположить графический объект должным образом, как это:

public PdfDocument toPdf() 
{ 
    // Create new PDF document 
    PdfDocument document = new PdfDocument(); 
    PdfPage page; 

    foreach (var p in pages) 
    { 
     // Create new page 
     page = document.AddPage(); 
     page.Width = XUnit.FromMillimeter(width); 
     page.Height = XUnit.FromMillimeter(height); 

     using (var gfx = XGraphics.FromPdfPage(page, XGraphicsUnit.Millimeter)) 
     { 
      p.drawItems(gfx); 
     } 
    } 

    return document; 
} 

Как правило: все объекты, которые реализуют IDisposable должны быть утилизированы путем вызова Dispose. Оператор using делает это неявным.

С тех пор, как вы возвращаете документ, это ответственность вызывающего абонента за его использование.

В качестве примечания стороны: некоторые люди скажут вам, что Dispose будет вызываться в Finalizer, поэтому вам не нужно его называть. Этот аргумент является недействительным, так как:

а) не все реализует IDisposable должным образом, и

б) типичные объекты, особенно графические объекты и объекты ввода-вывода (например, файловые замки), должны быть утилизированы, прежде чем они могут быть повторно используется таким образом.

Если это не помогает, пожалуйста, убедитесь, что у вас нет пустых страниц :-)

+0

На странице может быть только один объект XGraphics, но одновременно может быть несколько объектов XGraphics (для разных страниц). Так что, наверное, это не имеет значения. –

+0

Томас прав, это ничего не меняет .... – Jmorvan

+0

Хм, к сожалению, я сохраню это для справки, пока не найду ответ. – Stefan

 Смежные вопросы

  • Нет связанных вопросов^_^