PDFsharp,在 PDF 中显示 JPG 时出错
PDFsharp, error displaying a JPG in PDF
我正在尝试执行一个简单的操作:在使用 .NET Framework 4.0 和 MVC.NET[=13 使用 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 public Dropbox folder查看结果。
这个错误并不一致,有些照片有这个确切的问题,有些则没有,我不知道为什么。也许是文件中的格式或类似的格式?如果这是问题所在,哪些格式有效?
如有任何帮助,我们将不胜感激。
编辑:我注意到错误的图像看起来会有所不同,具体取决于我使用哪个程序可视化 PDF。例如,如果您使用 Dropbox 的可视化工具(使用我提供的 link)查看 PDF,图像看起来不错;如果我使用 Chrome PDF 查看器,图像是错误的,但只显示为黑白条纹,但仍然可见;如果我使用 Adobe 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);
当您使用 PDFsharp 1.50 或更高版本并使用 XImage.FromStream
而不是 Image.FromStream
加上 XImage.FromGdiPlusImage
.
时,JPEG 图像的处理效果更好
PDFsharp 需要 JPEG 文件的副本。使用 XImage.FromStream
确保 PDFsharp 获取原始数据。
如果您坚持使用 Windows XP,您的代码将在 PDFsharp 1.32 上正常工作。后来的 Windows 版本有你看到的问题,但使用 PDFsharp 1.50 它应该再次工作。
您的图片是 CMYK JPEG。当它嵌入到 PDF 文件中时,其色彩空间设置为 RGB,这会导致解码不正确。
我不知道您是否可以将代码中的图像色彩空间设置为 CMYK,或者这是否需要在 PDFsharp 中修复。
这是我得到的解决方案,感谢 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,因此格式
"issues" 图像已被删除。
当然,这不是最好的解决方案,PDFsharp 应该可以解决这个格式问题,但它不会很快发生(至少在 PDFsharp 1.5 beta3 中没有管理)。
我正在尝试执行一个简单的操作:在使用 .NET Framework 4.0 和 MVC.NET[=13 使用 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 public Dropbox folder查看结果。
这个错误并不一致,有些照片有这个确切的问题,有些则没有,我不知道为什么。也许是文件中的格式或类似的格式?如果这是问题所在,哪些格式有效?
如有任何帮助,我们将不胜感激。
编辑:我注意到错误的图像看起来会有所不同,具体取决于我使用哪个程序可视化 PDF。例如,如果您使用 Dropbox 的可视化工具(使用我提供的 link)查看 PDF,图像看起来不错;如果我使用 Chrome PDF 查看器,图像是错误的,但只显示为黑白条纹,但仍然可见;如果我使用 Adobe 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);
当您使用 PDFsharp 1.50 或更高版本并使用 XImage.FromStream
而不是 Image.FromStream
加上 XImage.FromGdiPlusImage
.
PDFsharp 需要 JPEG 文件的副本。使用 XImage.FromStream
确保 PDFsharp 获取原始数据。
如果您坚持使用 Windows XP,您的代码将在 PDFsharp 1.32 上正常工作。后来的 Windows 版本有你看到的问题,但使用 PDFsharp 1.50 它应该再次工作。
您的图片是 CMYK JPEG。当它嵌入到 PDF 文件中时,其色彩空间设置为 RGB,这会导致解码不正确。
我不知道您是否可以将代码中的图像色彩空间设置为 CMYK,或者这是否需要在 PDFsharp 中修复。
这是我得到的解决方案,感谢 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,因此格式 "issues" 图像已被删除。
当然,这不是最好的解决方案,PDFsharp 应该可以解决这个格式问题,但它不会很快发生(至少在 PDFsharp 1.5 beta3 中没有管理)。