为什么此 PDF 文件中的图像在某些查看器中损坏?
Why are the images in this PDF file corrupt in some viewers?
我们正在使用 PDFsharp to gather sets of images from a folder and put them into PDF files, one image per page. For this certain set of images, the resulting PDF document appears corrupted when opening in certain viewers... Chrome is broken, Adobe Reader is broken, Edge gives up entirely, but Firefox 实际上渲染正确。
相关代码如下:
public static List<string> ImageExtensions()
{
return new List<string>() { ".tif", ".tiff", ".png", ".jpg", ".jpeg", ".gif" };
}
public void Convert()
{
PdfDocument doc = new PdfDocument();
foreach(string fPath in FilePaths)
{
string ext = Path.GetExtension(fPath);
if (ImageExtensions().Contains(ext))
AddImageToPDF(fPath, ref doc);
}
try
{
doc.Save(OutputFilePath);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
doc.Close();
doc.Dispose();
}
private void AddImageToPDF(string imagePath, ref PdfDocument doc)
{
Image MyImage = Image.FromFile(imagePath);
AddImageToPDF(MyImage, ref doc);
}
private void AddImageToPDF(Image image, ref PdfDocument doc)
{
try
{
int numPages = doc.Pages.Count;
using (Image MyImage = image)
{
for (int _pageIndex = 0; _pageIndex < MyImage.GetFrameCount(FrameDimension.Page); _pageIndex++)
{
MyImage.SelectActiveFrame(FrameDimension.Page, _pageIndex);
XImage img = XImage.FromGdiPlusImage(MyImage);
img.Interpolate = true;
var page = new PdfPage() { Orientation = img.PixelWidth > img.PixelHeight ? PageOrientation.Landscape : PageOrientation.Portrait };
doc.Pages.Add(page);
using (var xg = XGraphics.FromPdfPage(doc.Pages[_pageIndex + numPages]))
{
xg.DrawImage(img, 0, 0);
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
File set A (broken in most viewers). File set B(适用于所有查看器)。两组都是使用完全相同的机制 (Irfanview) 从 PNG 转换而来的 JPEG。
为什么除 Firefox 之外的所有查看器都错误地呈现 A,我该如何解决?
对于只有单帧的图像,您应该使用 XImage.FromFile
而不是 XImage.FromGdiPlusImage
来解决 Windows 框架最新版本中某处的错误。
XImage.FromFile 允许 PDFsharp 访问原始文件,而 XImage.FromGdiPlusImage 必须依赖框架提供的信息 - 对于某些 JPEG 图像,此信息不正确。
确保您使用的是最新版本的 PDFsharp。好的问题表明他们指的是哪个版本。
如果您在 Windows XP 下 运行 您的代码,您应该得到正确的 PDF 文件(当然,这不是用于生产的选项)。
我是个白痴...更新到最新版本的 PDFSharp 解决了这个问题。我以为我们已经在使用最新的。 >=/
我们正在使用 PDFsharp to gather sets of images from a folder and put them into PDF files, one image per page. For this certain set of images, the resulting PDF document appears corrupted when opening in certain viewers... Chrome is broken, Adobe Reader is broken, Edge gives up entirely, but Firefox 实际上渲染正确。
相关代码如下:
public static List<string> ImageExtensions()
{
return new List<string>() { ".tif", ".tiff", ".png", ".jpg", ".jpeg", ".gif" };
}
public void Convert()
{
PdfDocument doc = new PdfDocument();
foreach(string fPath in FilePaths)
{
string ext = Path.GetExtension(fPath);
if (ImageExtensions().Contains(ext))
AddImageToPDF(fPath, ref doc);
}
try
{
doc.Save(OutputFilePath);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
doc.Close();
doc.Dispose();
}
private void AddImageToPDF(string imagePath, ref PdfDocument doc)
{
Image MyImage = Image.FromFile(imagePath);
AddImageToPDF(MyImage, ref doc);
}
private void AddImageToPDF(Image image, ref PdfDocument doc)
{
try
{
int numPages = doc.Pages.Count;
using (Image MyImage = image)
{
for (int _pageIndex = 0; _pageIndex < MyImage.GetFrameCount(FrameDimension.Page); _pageIndex++)
{
MyImage.SelectActiveFrame(FrameDimension.Page, _pageIndex);
XImage img = XImage.FromGdiPlusImage(MyImage);
img.Interpolate = true;
var page = new PdfPage() { Orientation = img.PixelWidth > img.PixelHeight ? PageOrientation.Landscape : PageOrientation.Portrait };
doc.Pages.Add(page);
using (var xg = XGraphics.FromPdfPage(doc.Pages[_pageIndex + numPages]))
{
xg.DrawImage(img, 0, 0);
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
File set A (broken in most viewers). File set B(适用于所有查看器)。两组都是使用完全相同的机制 (Irfanview) 从 PNG 转换而来的 JPEG。
为什么除 Firefox 之外的所有查看器都错误地呈现 A,我该如何解决?
对于只有单帧的图像,您应该使用 XImage.FromFile
而不是 XImage.FromGdiPlusImage
来解决 Windows 框架最新版本中某处的错误。
XImage.FromFile 允许 PDFsharp 访问原始文件,而 XImage.FromGdiPlusImage 必须依赖框架提供的信息 - 对于某些 JPEG 图像,此信息不正确。
确保您使用的是最新版本的 PDFsharp。好的问题表明他们指的是哪个版本。
如果您在 Windows XP 下 运行 您的代码,您应该得到正确的 PDF 文件(当然,这不是用于生产的选项)。
我是个白痴...更新到最新版本的 PDFSharp 解决了这个问题。我以为我们已经在使用最新的。 >=/