Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么此PDF文件中的图像在某些查看器中损坏?_C#_Pdf_Pdfsharp - Fatal编程技术网

C# 为什么此PDF文件中的图像在某些查看器中损坏?

C# 为什么此PDF文件中的图像在某些查看器中损坏?,c#,pdf,pdfsharp,C#,Pdf,Pdfsharp,我们使用从文件夹中收集图像集,并将其放入PDF文件中,每页一幅图像。对于这组特定的图像,在某些查看器中打开时,生成的PDF文档似乎已损坏。。。被破坏,被破坏,完全放弃,但实际上正确地呈现了它 以下是相关代码: public static List<string> ImageExtensions() { return new List<string>() { ".tif", ".tiff", ".png", ".jpg", ".jpeg", ".gif" }; }

我们使用从文件夹中收集图像集,并将其放入PDF文件中,每页一幅图像。对于这组特定的图像,在某些查看器中打开时,生成的PDF文档似乎已损坏。。。被破坏,被破坏,完全放弃,但实际上正确地呈现了它

以下是相关代码:

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);
    }
}
公共静态列表ImageExtensions()
{
返回新列表(){.tif',.tiff',.png',.jpg',.jpeg',.gif};
}
公共void Convert()
{
PdfDocument doc=新PdfDocument();
foreach(文件路径中的字符串fPath)
{
字符串ext=Path.GetExtension(fPath);
如果(ImageExtensions()包含(ext))
AddImageToPDF(fPath,ref doc);
}
尝试
{
单据保存(OutputFilePath);
}
捕获(例外e)
{
控制台写入线(e.Message);
}
doc.Close();
doc.Dispose();
}
私有void AddImageToPDF(字符串图像路径,参考PdfDocument文档)
{
Image MyImage=Image.FromFile(imagePath);
AddImageToPDF(我的图像,参考文档);
}
专用void AddImageToPDF(图像图像,参考PDF文档文档)
{
尝试
{
int numPages=doc.Pages.Count;
使用(Image MyImage=Image)
{
对于(int _pageIndex=0;_pageIndex
(在大多数观众中被打断)。(在所有查看器中工作)。这两组都是使用完全相同的机制(Irfanview)从PNG转换而来的JPEG


为什么除了Firefox之外的所有查看器都呈现错误的图像,我可以做些什么来修复这个问题?

对于只有一个帧的图像,您应该使用
XImage.FromFile
而不是
XImage.FromGdiPlusImage
来解决Windows框架最新版本中的某个错误

XImage.FromFile允许PDFsharp访问原始文件,而XImage.FromGdiPlusImage必须依赖框架提供的信息-对于某些JPEG图像,此信息不正确

确保您使用的是最新版本的PDFsharp。好的问题指出他们所指的版本


如果您在Windows XP下运行代码,您应该获得正确的PDF文件(但这当然不是生产使用的选项)。

我是个白痴。。。更新到PDFSharp的最新版本修复了该问题。我以为我们已经在使用最新版本了。>=/

如果我错了,请纠正我,但我会在点
yourString.split('.')
处拆分字符串,并选择拆分数组的最后一个元素:
splittedString[splittedString.length-1]
我目前无法检查您的文件,但通常您可以指望Adobe Reader正确呈现有效文件(它还以某种方式呈现许多无效文件,使pdf标准的其他实现者难以生存,但通常不会无法正确呈现有效文件)。因此,有问题的文件很可能确实已损坏。Firefox会正确渲染,因为它会忽略PDF文件中指定的标志。PDFsharp会根据Windows框架返回的信息设置这些标志。另请参见下面的答案。感谢您的建议,但XImage.FromFile会产生相同的结果。您目前似乎正在使用PDFsharp的GDI版本。您可以尝试WPF版本。您也可以尝试其他图像转换器(MS Paint可用于手动转换单个图像)。我目前没有时间调试此问题。