使用C#从PDF导出Illustrator矢量图像

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

使用itextsharp从PDF中提取图像

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,在屏幕上调整大小,然后进行屏幕截图。 - mbmcavoy
很遗憾,客户将以这种方式提供所有的图片。原因是网站将根据图片尺寸请求产生不同尺寸的图片,或者用户可以下载其矢量版本。 - JohnathanKong
1
好的,那么将有大量的图像以这种方式进行处理?不过,PDF似乎不是一个好的选择。也许SVG会更好?因为这是一种开放格式,得到了广泛的支持,我相信你可以按需编程地转换为PNG或PDF。 - mbmcavoy
1
为什么你不能直接要求客户提供Illustrator文件而不是PDF版本呢?我很难相信他们自己没有Illustrator文件... - Lasse V. Karlsen
不幸的是,之前的项目经理告诉他们要使用这种格式,他们已经习惯了。众所周知,客户可能会非常苛刻,特别是当他们不了解技术时。我们卡住的另一个问题是,他们当前的系统可以做到所有这些,所以他们总是说:“如果当前系统可以做到,为什么你们的系统不能呢?” - JohnathanKong
2个回答

0

你不能用iText来完成这个任务,因为它无法在PDF文件中渲染或光栅化矢量图形。

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

命令行示例:

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服务器。 - JohnathanKong
ImageMagick依赖于Ghostscript进行PDF光栅化,据我所知,在Ghostscript中没有办法将其输出到内存流中。我可能是错的,但如果我不是,我猜你无法通过ImageMagick实现这一点(我的意思是获取内存流中的输出)。 - yms
请注意,在商业的闭源应用程序中免费使用ImageMagick+Ghostscript可能是不合法的。但我不是律师,所以你的情况可能会有所不同 - yms
谢谢你提醒我。我会调查一下这个的合法性。 - JohnathanKong

0

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

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

Illustrator可能已经使用自己的元数据来限定图像。如果是这种情况,那么提取将会很困难。但是,它可能已经使用了类似于Form XObject的PDF模拟器。如果我设计Illustrator,我可能会两者兼备。

因此,可能可以提取,尽管可能有点棘手。除非能看到文档,否则无法说更多。

如果您想将Illustrator文件发送给我们ABCpdf,我们肯定会提供建议。 :-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接