虽然我有解决此问题的方法,但我更愿意按照遇到此问题的方式进行操作。在讨论问题之前,让我先解释一下背景:
我正在使用扫描仪获取虚拟图像,我想用它来创建 PDF,每个页面都是一个图像。我使用 PDFsharp 创建 PDF 工作得很好。
但是;如果我尝试重新保存 PDFsharp 文档,最终会清空所有以前的页面,然后添加新图像。
为了了解更多背景信息,我使用 ASP.NET Windows 窗体,使用 NTwain 作为扫描软件,使用 PDFsharp 创建 PDF,使用 PdfiumViewer 在 Windows 窗体上查看 PDF。
我有一个文档的类级变量
PdfDocument document = new PdfDocument();
在图像保存时,我只需将图像保存到新页面
var img = pictureBox1.Image;
PdfPage page = document.AddPage();
XGraphics gfx = XGraphics.FromPdfPage(page);
XImage image = XImage.FromGdiPlusImage(img);
gfx.DrawImage(image, 0, 0);
为了渲染文档,我将文档复制(认为这可能会解决问题)到一个新文档,将内容保存到新的内存流,然后简单地查看 PDF
var viewDocument = (PdfDocument)document.Clone();
MemoryStream ms = new MemoryStream();
viewDocument.Save(ms, false);
ms.Position = 0;
var pdf = PdfiumViewer.PdfDocument.Load(ms);
pdfRenderer1.Load(pdf);
我通过将图像保存到列表而不是作为新页面来使其工作,并在每次我想显示它时重新制作文档。不过这个问题确实很奇怪。
任何有助于理解其原因的帮助都将受到赞赏。
AFAIK 这是实现的状态:推荐的方法是创建一个
PdfDocument
或从文件中打开它,进行所需的更改,然后保存它once。保存文档,打开它,添加更多页面,再次保存也可以。这样您就不需要所有图像的列表。但恕我直言,每次保存时使用列表并创建一个新的
PdfDocument
是最干净的方法。
进一步更改后再次保存时会出现意外结果。这是一个已知的问题。请随意调查此问题并修复它。也许只是一个简单的改变,也许很复杂。
我遇到的针对我的案例的解决方案来自以下论坛帖子。
我试图像这样重新初始化 PdfDocument:
var document = new PdfDocument(stream);
在稍后阶段调用
document.Save(stream)
并尝试从中重新创建 PdfDocument 时,这显然会导致问题。
相反,请确保使用以下内容,而不是 PdfDocument 构造函数:
var document = PdfReader.Open(stream);
文档现在应该包含您的所有原始页面。