【问题标题】:Why are the images in this PDF file corrupt in some viewers?为什么此 PDF 文件中的图像在某些查看器中损坏?
【发布时间】:2019-12-26 21:34:16
【问题描述】:

我们正在使用PDFsharp 从一个文件夹中收集一组图像并将它们放入 PDF 文件中,每页一张图像。对于这组图像,在某些查看器中打开时,生成的 PDF 文档会出现损坏...Chrome 损坏,Adobe Reader 损坏,Edge 完全放弃,但 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(在大多数观众中被打破)。 File set B(在所有观众中工作)。两组都是使用完全相同的机制 (Irfanview) 从 PNG 转换而来的 JPEG。

为什么除了 Firefox 之外的所有查看器都无法正确渲染 A,我可以做些什么来解决这个问题?

【问题讨论】:

  • 如果我错了,请纠正我,但我会在点 yourString.split('.') 处拆分字符串并选择拆分后数组的最后一个元素:splittedString[splittedString.length - 1]
  • 我目前无法检查您的文件,但通常您可以依靠 Adob​​e Reader 正确呈现有效文件(它还会呈现许多无效文件不知何故让其他 pdf 实施者难以生存标准,但通常不会无法正确呈现有效文件)。因此,这些文件很可能确实已损坏。
  • Firefox 可以正确呈现,因为它忽略了 PDF 文件中指定的标志。 PDFsharp 根据 Windows 框架返回的信息设置这些标志。另请参阅下面的答案。

标签: c# pdf pdfsharp


【解决方案1】:

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

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

确保您使用的是最新版本的 PDFsharp。好的问题表明他们指的是哪个版本。

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

【讨论】:

  • 感谢您的建议,但 XImage.FromFile 产生相同的结果。
  • 看来您目前正在使用 PDFsharp 的 GDI 版本。您可以尝试构建 WPF。您也可以尝试不同的图像转换器(MS Paint 可用于手动转换单个图像)。我现在没有时间调试这个问题。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 2012-03-31
    • 1970-01-01
    • 2015-09-21
    • 2023-02-13
    相关资源
    最近更新 更多