【问题标题】:PDFsharp, error displaying a JPG in PDFPDFsharp,在 PDF 中显示 JPG 时出错
【发布时间】:2016-06-10 04:50:02
【问题描述】:

我正在尝试执行一个简单的操作:在使用 .NET Framework 4.0 和 MVC.NET 使用 PDFsharp v1.32.2608.0 从头生成的 PDF 文件中添加照片(JPG 文件)

我正在使用下一个代码来执行此操作:

PdfDocument doc = new PdfDocument();
PdfPage pag = doc.AddPage();
XGraphics gfx = XGraphics.FromPdfPage(pag);

Image foto = Image.FromStream([stream]);
XImage xfoto = XImage.FromGdiPlusImage(foto);
gfx.DrawImage(xfoto, 30, 130, 380, 250);

MemoryStream stream = new MemoryStream();
doc.Save(stream, false);

问题是我打开PDF文件时,图片出现错误,损坏,损坏...不知道怎么解释,可以下载原图和生成的PDF在下@987654321 @查看结果。

这个错误不一致,有些照片有这个确切的问题,有些没有,我不知道为什么。也许是文件中的格式或类似的东西?如果这是问题所在,哪些格式有效?

任何帮助将不胜感激。

编辑:我注意到的是,错误的图像看起来会有所不同,具体取决于我使用哪个程序可视化 PDF。例如,如果您使用 Dropbox 的可视化工具(使用我提供的链接)查看 PDF,则图像看起来不错;如果我使用 Chrome PDF 查看器,图像是错误的,但只显示为黑白和条纹,但仍然可见;如果我使用 Adob​​e Acrobat Reader DC,图像仍然是错误的,但完全无法识别。

编辑 2:我更改为 PDFSharp v1.50.4000(测试版 3)以查看是否可能是库的问题,但问题仍然相同。新版本的代码如下:

PdfDocument doc = new PdfDocument();
PdfPage pag = doc.AddPage();
XGraphics gfx = XGraphics.FromPdfPage(pag);

XImage xfoto = XImage.FromStream([stream]);
gfx.DrawImage(xfoto, 30, 130, 380, 250);

MemoryStream stream = new MemoryStream();
doc.Save(stream, false);

【问题讨论】:

  • 考虑到您的编辑可能存在 jpg 本身的问题...您可以分享它以供检查吗?
  • @mkl 该图像可以在 Dropbox 上找到(参见代码框下方文本中的链接)。

标签: c# pdf jpeg pdfsharp


【解决方案1】:

这是我得到的解决方案,感谢 PDFsharp 论坛的 TH-Soft 告诉我路径:

PdfDocument doc = new PdfDocument();
PdfPage pag = doc.AddPage();
XGraphics gfx = XGraphics.FromPdfPage(pag);

MemoryStream strm = new MemoryStream();
Image img = Image.FromStream([stream]);
img.Save(strm, System.Drawing.Imaging.ImageFormat.Png);

XImage xfoto = XImage.FromStream(strm);
gfx.DrawImage(xfoto, 30, 130, 380, 250);

MemoryStream stream = new MemoryStream();
doc.Save(stream, false);

在将图像添加到 PDF 之前,我将图像转换为 PNG 格式 图片的“问题”已被删除。

当然,这不是最好的解决方案,PDFsharp 应该管理这个格式问题,但它不会很快发生(至少在 PDFsharp 1.5 beta3 中没有管理)。

【讨论】:

  • 为我工作 (+1)。作为[stream],您可以使用File.OpenRead(imgFilePath)
  • 在我的情况下,图像根本没有显示,这没有帮助
  • @JadaVonRuth 这是一个老问题。你用的是什么版本?可以分享图片/文件吗?
  • @prueba-prueba 我知道它的老问题。我正在使用库的 .net 核心端口(PdfSharpCore),linux docker 出现问题,gdi+ 库已经存在,问题是别的。最后我使用pdfsharp的另一个.net核心端口解决了它。
【解决方案2】:

当您使用 PDFsharp 1.50 或更高版本并使用XImage.FromStream 而不是Image.FromStream 加上XImage.FromGdiPlusImage 时,JPEG 图像的处理效果会更好。

PDFsharp 需要一份 JPEG 文件的副本。使用XImage.FromStream 可确保 PDFsharp 获取原始数据。

如果您坚持使用 Windows XP,您的代码将在 PDFsharp 1.32 中正常工作。更高版本的 Windows 版本会出现您看到的问题,但使用 PDFsharp 1.50 应该可以再次工作。

【讨论】:

  • 嗨,兄弟。那没用,我下载了 PDFsharp 项目 1.5 beta3b(我找到的最后一个版本)并将其添加到项目中,但图像仍然存在同样的问题。
  • 是的,这张图片处理不正确,奇怪的JPEG格式。使用 Firefox 查看 PDF 文件时看起来正确。下周将对此进行进一步调查。如果您必须使用此特定图像:使用图像处理器(例如 MS Paint)打开,然后使用 File => Save As,新图像将适用于​​ PDFsharp。
  • 谢谢@ThomasH,解决了这个问题。我仍然不知道这是否可能是最终答案,或者只是这个问题的“补丁”。如果您将此作为答案发布,我很乐意将其标记为解决方案。
【解决方案3】:

您的图像是 CMYK JPEG。当它嵌入 PDF 文件时,其色彩空间设置为 RGB,这会导致解码错误。
我不知道您是否可以将代码中的图像色彩空间设置为 CMYK,或者这是否需要在 PDFsharp 中修复。

【讨论】:

  • PDFsharp 依赖 GDI+ 或 WPF 来确定 JPEG 是 RGB 还是 CMYK。
  • 您认为我们应该向 PDFsharp 开发人员报告这个问题吗?
  • 不幸的是,GDI+ 和 WPF 在处理 CMYK JPEG 时都有问题。
猜你喜欢
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 2015-12-21
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
相关资源
最近更新 更多