【问题标题】:MigraDoc: Rendering the same document twiceMigraDoc:两次渲染同一个文档
【发布时间】:2016-06-29 11:52:38
【问题描述】:

我想渲染“文档”对象两次,但在第二代 PDF 文件显示错误:

此页面上的错误。可能此页面无法正确显示。请与文档创建者交谈。

Sorry, it is german...

这是我的示例代码:

using System;
using System.Windows.Forms;
using MigraDoc.Rendering;
using MigraDoc.DocumentObjectModel;
using PdfSharp.Pdf;
using System.Diagnostics;

namespace Temp
{
    public partial class Form1 : Form
    {
        Document document; //using the same document- and renderer-object ..
        PdfDocumentRenderer renderer; //..creates the error

        public Form1()
        {
            InitializeComponent();
            document = new Document();
            renderer = new PdfDocumentRenderer(false, PdfFontEmbedding.Always);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Section section = document.AddSection();
            Paragraph paragraph = section.AddParagraph();
            paragraph.AddFormattedText("Hello World", TextFormat.Bold);

            SaveFile(renderer);
        }

        private void SaveFile(PdfDocumentRenderer renderer)
        {
            renderer.Document = document;
            renderer.RenderDocument();
            string pdfFilename = string.Format("Rekla-{0:dd.MM.yyyy_hh-mm-ss}.pdf", DateTime.Now);
            renderer.PdfDocument.Save(pdfFilename);
            Process.Start(pdfFilename);
        }
    }
}

当然,我总是可以创建一个新的“文档”对象:

private void button1_Click(object sender, EventArgs e)
{
    Document document = new Document(); //Creating a new document-object solves the problem..
    PdfDocumentRenderer renderer = new PdfDocumentRenderer(false, PdfFontEmbedding.Always);
    Section section = document.AddSection();
    Paragraph paragraph = section.AddParagraph();
    paragraph.AddFormattedText("Hi", TextFormat.Bold);

    SaveFile(renderer, document);
}

这行得通。但是我需要在执行其他按钮单击事件时更改当前文档。第二个代码-sn-p 没有解决这个任务。

有人知道如何修复第一个 code-sn-p 吗?

【问题讨论】:

    标签: c# pdfsharp migradoc


    【解决方案1】:

    不要重复使用渲染器。在 SaveFile 方法中创建一个新的 Renderer,一切都应该没问题。

    如果新的渲染器不够用,请调用document.Clone() 并将其分配给渲染器。

    【讨论】:

      【解决方案2】:

      我发现对于重复将 Migradoc pdf 保存到文件非常有用的方法是在渲染文档时将文档保存到 MemoryStream/byte 数组。然后当我需要保存pdf文件时,我只保存字节数组。

      将此部分放入您要呈现文档的构造函数中:

      // First we render our document and save it to a byte array
      bytes[] documentBytes;
      Document doc;
      using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
      {
         PdfDocumentRenderer pdfRender = new PdfDocumentRenderer();
         pdfRender.Document = doc;
         pdfRender.RenderDocument();
         pdfRender.Save(ms, false);
         documentBytes = ms.ToArray();
      }
      

      将此部分放入您要保存到文件的按钮事件中:

      // Then we save the byte array to a file when needed
      string filename;
      using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Create))
      {
          fs.Write(documentBytes, 0, documentBytes.Length);
      }
      

      【讨论】:

        猜你喜欢
        • 2020-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-14
        • 2020-03-05
        • 2023-04-04
        • 2016-07-03
        • 1970-01-01
        相关资源
        最近更新 更多