2013-05-17 3 views
4

У меня есть pdf, который содержит векторное изображение. Я спросил у клиента об этом, и они сказали, что они создали изображение в Illustrator и сохранили его как pdf. Есть ли способ извлечь это изображение и преобразовать его в png? Я попытался код из следующих функций:Экспорт иллюстратора векторного изображения из PDF с использованием C#

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 и т. Д., Но с чем я столкнулся - это прямой экспорт из иллюстратора.

Должен ли я использовать иллюстратор sdk или есть ли способ сделать это с помощью itextsharp? Кроме того, мне нужно преобразовать его в стандартный формат изображения, например png, и отправить поток в вызывающее приложение, поэтому мне нужно будет захватить поток.

+0

Это звучит как одноразовый прецедент. Поскольку ваш клиент создал изображение и предоставил его вам, вы могли бы запросить, чтобы они просто поставляли его в формате PNG? Или вы можете открыть PDF, размер его на экране, как вы хотите, и сделать захват экрана. – mbmcavoy

+0

К сожалению, клиент будет поставлять ВСЕ их изображения, как это. Причина в том, что сайт будет выплевывать изображения разных размеров на основе запроса размера изображения, или если пользователь хочет, они могут загрузить его векторную версию. – JohnathanKong

+1

ОК, так будет значительное количество изображений, которые будут обработаны таким образом? Тем не менее, похоже, что PDF - это плохой выбор формата. Возможно, SVG? Поскольку это открытый формат с широкой поддержкой, я уверен, что вы можете программно конвертировать в PNG или PDF по запросу. – mbmcavoy

ответ

0

Вы не сможете сделать это с помощью iText, так как он не может отображать или растеризовать векторную графику в файлах PDF.

Вариант 1:
Если GPL лицензия работает для вас, вы можете растеризации файл PDF с ImageMagick + GNU Ghostscript, но AFAIK вам придется записать вывод в файл в этом случае.

пример командной строки:

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

Существует также .net обертка в Codeplex, которые могли бы работать для вас: ImageMagick.NET

Вариант А:
Если коммерческая библиотека является вариантом вы можете попробовать с 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); 

Отказ от ответственности: В настоящее время я работаю как разработчик библиотеки

+0

Image Магия кажется единственной бесплатной и там, где я люблю Amyuni, в настоящее время она находится вне нашего ценового диапазона для такого маленького проекта. Из взглядов imagemagicknet кажется, что они прекратили разработку на нем с момента последнего выпуска в 2009 году, а это означает, что, вероятно, не будет поддержки потоков. Мой хостинг не имеет файлового хранилища, поэтому я вынужден использовать крест между php-сервером и моими веб-службами .NET. Это очень плохой способ сделать что-то, но альтернативой является обновление исходного кода imagemgaick или получение реального сервера Windows. – JohnathanKong

+0

ImageMagick полагается на Ghostscript для растеризации PDF, и насколько я знаю, в Ghostscript нет способа получить его вывод в поток памяти. Возможно, я ошибаюсь, но если это не так, я думаю, вам не удастся достичь этого (я имею в виду получение вывода в потоке памяти) с помощью ImageMagick. – yms

+0

Также учтите, что вам может быть нецелесообразно использовать ImageMagick + Ghostscript бесплатно в коммерческом приложении с закрытым исходным кодом. Но я не юрист, поэтому [YMMV] (http://en.wiktionary.org/wiki/your_mileage_may_vary). – yms

0

Современные версии AI использует PDF как экспорт формат. Это расширенная форма PDF, содержащая важные метаданные для Illustrator, но в конечном итоге это PDF.

Да, большинство пакетов PDF предназначено для извлечения растровых изображений, поскольку они входят в атомные комки. Если ваше внедренное изображение является вектором, оно заносится в формат, который большинство не понимает.

Иллюстратор, возможно, использовал свои собственные метаданные для разграничения изображения. Если это так, то это будет трудно извлечь. Однако, возможно, он использовал аналог PDF, такой как форма XObject. Если бы я разрабатывал Illustrator, я бы, вероятно, сделал и то, и другое.

Так что, возможно, можно извлечь хотя, возможно, немного сложнее. Больше невозможно сказать, не имея возможности увидеть документ.

Если вы хотите отправить нам свой файл иллюстратора в ABCpdf, мы обязательно увидим, что мы можем предложить. :-)

Смежные вопросы