Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C从PDF导出Illustrator矢量图像#_C#_.net_Pdf_Adobe Illustrator - Fatal编程技术网

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

C# 使用C从PDF导出Illustrator矢量图像#,c#,.net,pdf,adobe-illustrator,C#,.net,Pdf,Adobe Illustrator,我有一个包含矢量图像的pdf。我问过客户,他们说他们在Illustrator中创建了这张图片,并将其保存为pdf格式。有没有一种方法可以提取该图像并将其转换为png?我尝试了以下代码: 还有一些我找不到的链接,但它们似乎都不起作用。我的理论是,他们正在提取嵌入式图像,如JPEG、BMP、PNG等,但我面临的是illustrator的直接输出 我应该使用illustrator sdk,还是有办法使用itextsharp?此外,我需要将其转换为标准图像格式,如png,并将流发送到呼叫应用程序,因

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

还有一些我找不到的链接,但它们似乎都不起作用。我的理论是,他们正在提取嵌入式图像,如JPEG、BMP、PNG等,但我面临的是illustrator的直接输出


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

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

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

命令行示例:

convert -density 300 -depth 8 c:\temp\mydoc.pdf c:\temp\myrasterimage.png
Codeplex中还有一个.net包装器可能适合您:

选项A:
如果您可以选择商业图书馆,您可以尝试使用。您可以使用需要写入文件的方法,也可以使用用于将输出写入内存流的方法

使用
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可能使用了自己的元数据来界定图像。如果是这种情况,则很难提取。不过,它可能使用了类似XObject的PDF格式。如果我在设计Illustrator,我可能会同时做这两件事

因此,虽然可能有点棘手,但提取还是有可能的。如果看不到文件,就不可能说更多


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

这听起来像是一个单一的时间用例。既然您的客户创建了图像并将其提供给您,您是否可以请求他们以PNG格式提供图像?或者你可以打开PDF,在屏幕上随意调整大小,然后进行屏幕截图。不幸的是,客户端会像这样提供他们所有的图像。原因是因为网站会根据图像大小请求输出不同大小的图像,或者如果用户愿意,他们可以下载矢量版本的图像。好吧,那么将有大量图像以这种方式处理?不过,这似乎是一个糟糕的PDF格式选择。也许是SVG?由于这是一种具有广泛支持的开放格式,我相信您可以通过编程方式按需转换为PNG或PDF。为什么您不能简单地要求客户向您提供illustrator文件,而不是PDF版本?我发现很难相信他们自己不会有illustrator文件…不幸的是,以前的项目经理告诉他们使用这种格式,他们已经习惯了。众所周知,客户可能要求很高,尤其是当他们不了解技术时。同样让我们感到困惑的是,他们目前的系统能做到这一切,所以他们总是说,“如果目前的系统能做到,为什么你的系统不行?”。Image Magick似乎是唯一一个免费的系统,尽管我非常喜欢Amyuni,但对于这样一个小项目,它目前超出了我们的价格范围。从imagemagicknet的外观来看,自2009年发布以来,他们似乎已经停止了对它的开发,这意味着可能不会支持streams。我的主机没有文件存储,所以我不得不在php服务器和.NET web服务之间使用交叉。这是一种非常糟糕的方法,但另一种方法是更新imagemgaick源代码或获得真正的windows服务器。ImageMagick依赖Ghostscript进行PDF光栅化,据我所知,Ghostscript无法将其输出获取到内存流中。我可能错了,但如果我没有错,我想你将无法用ImageMagick实现这一点(我指的是在内存流中获得输出)。还要考虑到,在商业封闭源代码应用程序中免费使用ImageMagick+Ghostscript可能是不合法的。但我不是律师,所以谢谢你的提醒。我会调查这件事的合法性。