使用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,并将流发送到调用应用程序,所以我需要能够抓取流。
您将无法对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,我们一定会看到我们可以建议什么。: -)