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

本文关键字:图像 Illustrator 导出 PDF 使用 | 更新日期: 2023-09-27 18:14:03

我有一个包含矢量图像的pdf。我问了客户这个问题,他们说他们在Illustrator中创建了图像,并保存为pdf格式。是否有一种方法可以提取图像并将其转换为png?我试过下面的代码:

使用itextsharp从PDF中提取图像

http://www.vbforums.com/showthread.php?530736 - 2005 -提取-图像- - - pdf文件-使用itextsharp

和其他几个我找不到的链接,但它们似乎都不起作用。我的理论是,他们正在提取嵌入图像,如jpeg, bmp, png等,但我面临的是直接从illustrator导出。

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

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

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

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

命令行示例:

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

Codeplex中还有一个。net包装器:ImageMagick。净

选项:
如果您可以选择商业库,您可以尝试使用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);

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

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

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

Illustrator可能使用了自己的元数据来分隔图像。如果是这样的话,那就很难提取了。但是,它可能使用了类似于Form XObject的PDF。如果我在设计Illustrator,我可能会两者都做。

所以它可能是可以提取的,尽管可能有点棘手。在没有看到文件的情况下,什么也说不出来。

如果你想邮寄你的插画文件到我们的ABCpdf,我们一定会看到我们可以建议什么。: -)