2013-05-17 35 views
4

我有一个包含矢量图像的pdf。我向客户询问了这件事,他们说他们在Illustrator中创建了图像并将其保存为pdf。有没有一种方法可以提取该图像并将其转换为PNG?我试着从下面的代码:使用C导出Illustrator矢量图像从PDF使用#

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 sdk还是有办法让我使用itextsharp来完成它?此外,我需要将其转换为标准的图像格式,如png,并将流发送到调用应用程序,所以我需要能够抓取流。

+0

这听起来像是一次性用例。由于您的客户创建了图像并将其提供给您,您是否可以请求他们仅以PNG格式提供图像?或者你可以打开PDF文件,在屏幕上调整你想要的尺寸,并做一个屏幕截图。 – mbmcavoy

+0

不幸的是,客户端将提供像这样的所有图像。原因是因为该网站会根据图片大小要求吐出不同大小的图片,或者如果用户想要,他们可以下载它的矢量版本。 – JohnathanKong

+1

好吧,这样就会有大量的图片需要处理?尽管如此,这看起来像PDF是一种糟糕的格式选择。也许SVG?由于这是一个广泛支持的开放格式,我相信您可以按需编程转换为PNG或PDF格式。 – mbmcavoy

回答

0

由于无法渲染或光栅化PDF文件中的矢量图形,因此您无法使用iText进行此操作。

选项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,这对于将输出写入存储器流非常有用。

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); 

免责声明:导出使用IacDocument.DrawCurrentPage一个页面到内存流

示例代码中,我目前的工作作为库的开发

+0

Image Magick似乎是那里唯一的免费赠品,而且我爱Amyuni,目前这个小项目目前已经超出了我们的价格范围。从imagemagicknet的外观来看,自从2009年上次发布以来,它们似乎停止了开发,这意味着可能不会支持流。我的主机没有文件存储,所以我不得不在PHP服务器和我的.NET Web服务之间使用交叉。这是一个非常糟糕的做事方式,但另一种方法是更新imagemgaick源代码或获得真正的Windows服务器。 – JohnathanKong

+0

ImageMagick依赖Ghostscript进行PDF光栅化,据我所知,Ghostscript无法将其输出存入内存流。我可能是错的,但如果我不是,我想你将无法用ImageMagick实现这一点(我的意思是让输出在内存流中)。 – yms

0

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

是的大多数PDF包旨在提取位图,因为它们都是原子块。如果你的嵌入式图像是矢量图,那么它就会以一种大多数人不会理解的格式被放入。

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

所以它可能提取虽然也许有点棘手。如果没有能够看到文件,就不可能说更多。

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