2011-02-08 2 views
0

Я полностью не могу получить файл WMF в PDF с помощью iTextSharp. Я специально хочу использовать WMF, потому что это векторный файл.Добавление WMF в PDF с помощью iTextSharp

Мой файл WMF поступает с элемента управления Chart.

Код для воспроизведения очень прост.

  1. Создайте новый проект Windows Form.
  2. Добавить контроль диаграммы на Form1.
  3. Затем добавьте следующий код:

Добавить эту директиву с помощью

using iTS = iTextSharp.text; 

И добавьте следующий код в файл Form1.cs:

private void Form1_Load(object sender, EventArgs e) 
{ 
    Document pdfDoc = new Document(); 
    PdfWriter.GetInstance(pdfDoc, new FileStream(@"D:\dev\Test\TestPdfCreation\TestPdfCreation\bin\Debug\test.pdf", FileMode.Create)); 

    MemoryStream mimg1 = new MemoryStream(); 
    chart1.SaveImage(mimg1, ImageFormat.Wmf); 
    mimg1.Seek(0, SeekOrigin.Begin); 
    iTS.Image img1 = iTS.Image.GetInstance(mimg1); 
    pdfDoc.Add(img1); 
    pdfDoc.Close(); 
} 

Ошибка я получаю является : IOException произошло. Массив байта не является признанным форматом изображения.

Использование iTextSharp 5.0.5.

+0

Я использую WMF-файл без проблем, но загружаю его с диска. Можете ли вы записать его на диск и загрузить его по пути, чтобы убедиться, что это работает? Мне интересно, есть ли проблема с потоком памяти. –

+0

Если смотреть немного дальше, то есть два разных типа файлов WMF. Существует версия Windows 3.0, которая имеет «01 00 09 00 00 03» или «02 00 09 00 00 03» в качестве первых шести байтов. Но когда я делаю WMF из Adobe Illustrator, я получаю 'D7 CD C6 9A' как первые 4 байта. Последнее - то, что работает для меня с iTextSharp. –

ответ

3

Вы можете попробовать строить его непосредственно, а не вызывать createImage:

Image img = new ImgWMF(bytes); 

Хотя, глядя на код, я вижу, что вы просто получить другую исключение:

 InputMeta in = new InputMeta(is); 
     if (in.readInt() != 0x9AC6CDD7) { 
      throw new BadElementException(errorID + " is not a valid placeable windows metafile."); 
     } 

Ключевым моментом здесь может быть «доступным». Я не совсем знаком с WMF, но вы можете найти альтернативу ImageFormat или что-то в этом роде.

Да. Похоже, что размещаемые WMF - это что-то вроде Aldus. Вот вопрос о переходе от WMF к чему-то IText можно использовать:

http://itext-general.2136553.n4.nabble.com/WMF-file-doesn-t-display-correctly-td2283480.html

Эта конкретная проблема была связана с градиентной заливки.

+0

Я отредактировал вышеупомянутое сообщение и добавил код рабочего решения ... не уверен, куда пошло редактирование. –

+0

@Clever Мне бы очень хотелось узнать о рабочем решении, которое вы опубликовали. У вас есть где-нибудь? – TaW

+0

Я не знаю, где был отправлен исходный код, но решение заключалось в том, чтобы понять, что элемент управления диаграммой производит и файл EMF, а не файл WMF, и что мне нужно его преобразовать. Мне пришлось использовать вызов Win32 Api для этого: GdipEmfToWmfBits. Надеюсь, это поможет! –

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