PDFSharp - 第二页是空的

时间:2016-02-17 20:45:20

标签: c# 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;
}

任何线索?

2 个答案:

答案 0 :(得分:2)

当您设置非默认单位时,AFAIK XGraphics出现问题(在您的情况下为毫米)。

也许第二页不是空的,但内容在" viewport"之外。

如果我的猜测是正确的,那么第一页也不正确。

在PDFsharp论坛上查看此案例:
http://forum.pdfsharp.net/viewtopic.php?p=9642#p9642

答案 1 :(得分: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,因此您无需调用它。此参数无效,因为:

a)并非所有人都能正确实施IDisposable,并且

b)典型对象,尤其是图形对象和IO对象(例如文件锁),在以这种方式重新使用之前需要进行处理。

如果这没有帮助,请确保您没有空白页: - )