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,并将流发送到调用应用程序,因此我需要能够抓取流。

4

2 回答 2

0

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

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

Illustrator 可能使用了自己的元数据来分隔图像。如果是这种情况,那么将很难提取。然而,它可能使用了类似 Form XObject 的 PDF 模拟。如果我在设计 Illustrator,我可能会两者兼而有之。

因此,尽管可能有点棘手,但可能可以提取。没有看到文件就无法说更多。

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

于 2013-05-21T12:20:07.797 回答
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);

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

于 2013-05-17T18:43:03.750 回答