PDFsharp PdfDocument.Save 导致任何其他保存时出现空白页

问题描述 投票:0回答:2

虽然我有解决此问题的方法,但我更愿意按照遇到此问题的方式进行操作。在讨论问题之前,让我先解释一下背景:

我正在使用扫描仪获取虚拟图像,我想用它来创建 PDF,每个页面都是一个图像。我使用 PDFsharp 创建 PDF 工作得很好。 display of PDF

但是;如果我尝试重新保存 PDFsharp 文档,最终会清空所有以前的页面,然后添加新图像。 display of broken PDF

为了了解更多背景信息,我使用 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);

我通过将图像保存到列表而不是作为新页面来使其工作,并在每次我想显示它时重新制作文档。不过这个问题确实很奇怪。

任何有助于理解其原因的帮助都将受到赞赏。

c# asp.net pdf webforms pdfsharp
2个回答
1
投票

AFAIK 这是实现的状态:推荐的方法是创建一个

PdfDocument
或从文件中打开它,进行所需的更改,然后保存它once
这就是您在适合您的实施中所做的事情。

保存文档,打开它,添加更多页面,再次保存也可以。这样您就不需要所有图像的列表。但恕我直言,每次保存时使用列表并创建一个新的

PdfDocument
是最干净的方法。

进一步更改后再次保存时会出现意外结果。这是一个已知的问题。请随意调查此问题并修复它。也许只是一个简单的改变,也许很复杂。


0
投票

我遇到的针对我的案例的解决方案来自以下论坛帖子

我试图像这样重新初始化 PdfDocument:

var document = new PdfDocument(stream);

在稍后阶段调用

document.Save(stream)
并尝试从中重新创建 PdfDocument 时,这显然会导致问题。

相反,请确保使用以下内容,而不是 PdfDocument 构造函数:

var document = PdfReader.Open(stream);
文档现在应该包含您的所有原始页面。

© www.soinside.com 2019 - 2024. All rights reserved.