【问题标题】:Export Illustrator Vector Image From PDF Using C#使用 C# 从 PDF 导出 Illustrator 矢量图像
【发布时间】:2013-05-12 23:52:09
【问题描述】:

我有一个包含矢量图像的 pdf。我询问了客户,他们说他们在 Illustrator 中创建了图像并将其保存为 pdf。有没有办法可以提取该图像并将其转换为 png?我尝试了以下代码:

Extract image from PDF using itextsharp

http://www.vbforums.com/showthread.php?530736-2005-Extract-Images-from-a-PDF-file-using-iTextSharp

还有一些我找不到的其他链接,但它们似乎都不起作用。我的理论是他们正在提取 jpegs、bmps、pngs 等嵌入图像,但我面临的是直接从 illustrator 导出。

我应该使用 illustrator sdk 还是有办法让我使用 itextsharp?此外,我需要将其转换为标准图像格式,如 png,并将流发送到调用应用程序,因此我需要能够抓取流。

【问题讨论】:

  • 这听起来像是一个一次性用例。由于您的客户创建了图像并将其提供给您,您能否要求他们仅以 PNG 格式提供图像?或者,您可以打开 PDF,在屏幕上调整大小,然后进行屏幕截图。
  • 不幸的是,客户将像这样提供他们所有的图像。之所以会这样,是因为网站会根据图片尺寸的要求吐出不同尺寸的图片,或者如果用户需要,可以下载矢量版。
  • 好的,那么会有大量的图像需要这样处理吗?尽管如此,这似乎 PDF 是一种糟糕的格式选择。也许是 SVG?由于这是一种具有广泛支持的开放格式,我相信您可以按需以编程方式转换为 PNG 或 PDF。
  • 为什么不能简单地要求客户提供插图文件而不是pdf版本?我很难相信他们自己没有插画师文件……
  • 不幸的是,之前的项目经理告诉他们使用这种格式,他们已经习惯了。众所周知,客户可能要求很高,尤其是当他们不懂技术时。让我们陷入困境的是,他们当前的系统可以做到这一切,所以他们总是说,“如果当前的系统可以做到,为什么你的系统不能?”。

标签: c# .net pdf adobe-illustrator


【解决方案1】:

现代版本的 AI 使用 PDF 作为导出格式。它是 PDF 的增强形式,包含 Illustrator 的重要元数据,但最终它是 PDF。

是的,大多数 PDF 包都旨在提取位图,因为它们以原子块的形式出现。如果您的嵌入图像是矢量,那么它会以大多数人无法理解的格式放入。

Illustrator 可能使用了自己的元数据来分隔图像。如果是这种情况,那么将很难提取。然而,它可能使用了类似 Form XObject 的 PDF 模拟。如果我在设计 Illustrator,我可能会同时做这两件事。

所以虽然可能有点棘手,但它可能是可以提取的。看不到文档就说不出更多了。

如果您想通过 ABCpdf 将您的插画文件邮寄给我们,我们一定会看到我们可以提供的建议。 :-)

【讨论】:

    【解决方案2】:

    您将无法使用 iText 执行此操作,因为它无法在 PDF 文件中渲染或栅格化矢量图形。

    选项 1:
    如果 GPL 许可证适用于您,您可以使用 Imagemagick+GNU Ghostscript 光栅化您的 PDF 文件,但 AFAIK 在这种情况下您必须将输出写入文件。

    命令行示例:

    convert -density 300 -depth 8 c:\temp\mydoc.pdf c:\temp\myrasterimage.png
    

    Codeplex 中还有一个可能适合您的 .net 包装器:ImageMagick.NET

    选项 A:
    如果您可以选择商业图书馆,您可以尝试使用Amyuni PDF Creator .Net。您可以使用方法IacDocument.ExportToJpg,它需要写入文件,也可以使用方法IacDocument.DrawCurrentPage,这对于将输出写入内存流很有用。

    使用IacDocument.DrawCurrentPage 将一页导出到内存流的示例代码:

    const int twipsPerInch = 1440;
    const int MM_ISOTROPIC = 7;
    private static MemoryStream RasterizePDF(string filePath, int pageIndex, int targetDPI)
    {
        Amyuni.PDFCreator.IacDocument doc = new Amyuni.PDFCreator.IacDocument();
        doc.SetLicenseKey("Evaluation", "07EFC00...77C23E29");
        FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);     
        doc.Open(fs, "");
        //Get the width and height of the target page
        Amyuni.PDFCreator.IacPageFormat format = doc.GetPage(pageIndex).GetPageFormat();
        doc.CurrentPageNumber = pageIndex;
    
        //Create Image
        Bitmap img = new Bitmap((int)(format.Width * targetDPI / twipsPerInch), (int)(format.Length * targetDPI / twipsPerInch), PixelFormat.Format32bppArgb);
        Graphics g = Graphics.FromImage(img);
        //set image object background to white
        g.Clear(Color.White);
        //Get a device context for the grahics object
        IntPtr hdc = g.GetHdc();
        SetMapMode(hdc, MM_ISOTROPIC);
        // set scaling factor
        SetWindowExtEx(hdc, twipsPerInch, twipsPerInch, 0);
        SetViewportExtEx(hdc, targetDPI, targetDPI, 0);
        //draw the contents of the PDF document on to the graphic context
        doc.DrawCurrentPage(hdc, false);
        //clean up
        g.ReleaseHdc(hdc);
        g.Dispose();
        // Save the bitmap as png into the resulting stream
        MemoryStream resultStrm = new MemoryStream();
        img.Save(resultStrm, ImageFormat.Png);
        //Prepare the stream to be read later on
        resultStrm.Position = 0;
    }
    
    [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
    private static extern int SetMapMode(IntPtr hdc, int MapMode);
    [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
    private static extern int SetWindowExtEx(IntPtr hdc, int nXExtent, int nYExtent, int not_used);
    [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
    private static extern int SetViewportExtEx(IntPtr hdc, int nXExtent, int nYExtent, int not_used);
    

    免责声明:我目前是该库的开发人员

    【讨论】:

    • Image Magick 似乎是唯一免费的,尽管我很喜欢 Amyuni,但对于这么小的项目,目前它超出了我们的价格范围。从 imagemagicknet 的外观来看,自上次发布是在 2009 年以来,他们似乎已经停止了对其的开发,这意味着可能不支持流。我的主机没有文件存储,所以我不得不使用 php 服务器和我的 .NET Web 服务之间的交叉。这是一种极其糟糕的处理方式,但替代方法是更新 imagemgaick 源代码或获取真正的 windows 服务器。
    • ImageMagick 依赖 Ghostscript 进行 PDF 光栅化,据我所知,Ghostscript 无法将其输出放入内存流。我可能错了,但如果我错了,我想你将无法使用 ImageMagick 实现这一点(我的意思是在内存流中获取输出)。
    • 还要考虑到在商业闭源应用程序中免费使用 ImageMagick+Ghostscript 可能是不合法的。但我不是律师,所以YMMV.
    • 感谢您的提醒。我会调查这个的合法性。
    猜你喜欢
    • 1970-01-01
    • 2012-04-15
    • 2012-11-06
    • 2014-04-02
    • 1970-01-01
    • 2015-10-21
    • 2011-09-23
    • 1970-01-01
    • 2017-11-21
    相关资源
    最近更新 更多