2012-02-08 2 views
3

Я пишу службу Windows, необходимую для извлечения данных из базы данных, создания документа из этих данных и последующей отправки по факсу. Tiff, кажется, является стандартом для факсимильных изображений, и я знаю, что я могу кодировать объект Image как tiff.Создание образов документов

Было бы здорово, если бы я мог создать объект изображения, подобный тому, как это делает iTextSharp, создавая новые элементы и прикрепляя элементы к объекту PdfDocument. Мои факсимильные документы будут просты, но требуют этих вещей

  • Центрирования абзаца текста
  • Добавить еще одно изображения с абсолютным позиционированием (логотип)
  • Простых два таблиц столбцов для поля/значение
  • Горизонтальных правила

Создание HTML-документа тривиально, но .Net, похоже, не имеет возможности визуализировать HTML-объект изображения.

Желательные решения - это некоторый тип класса документа в BCL, который может быть отображен в объект изображения, где я мог бы кодировать оттуда или какой-либо вспомогательный класс/библиотеку или обертку изображений, чтобы нарисовать эти простые элементы в экземпляр изображения ,

Существует ли какое-либо решение или может быть что-то еще, что я мог бы рассмотреть?

ответ

0

Так что я нашел решение, которое позволяет мне создавать документы с теми функциями, которые мне нужны. Я закончил использование MigraDoc, хотя он определенно не так изящен, как iTextSharp. MigraDoc разрешил мне создать объект System.Drawing.Image из объекта Document, используя его класс XGraphics.

Используя несколько примеров MigraDoc (я действительно хочу, чтобы они были лучше библиотечную документацию класса, это был большой жулик ИМХО) я был в состоянии создать TIFF-файл, как этот

public void CreateNotificationImage(string imagePath, NotificationData data) 
{ 
    // CreateDocument() is my own method where a new doc is created with new data 
    Document doc = CreateDocument(data); 
    doc.DefaultPageSetup.PageFormat = PageFormat.Letter; 

    int page = 1; 
    DocumentRenderer renderer = new DocumentRenderer(doc); 
    renderer.PrepareDocument(); 
    PageInfo pageInfo = renderer.FormattedDocument.GetPageInfo(page); 

    int dpi = 150; 
    int dx = (int)(pageInfo.Width.Inch * dpi); 
    int dy = (int)(pageInfo.Height.Inch * dpi); 
    float scale = dpi/72f; 

    System.Drawing.Image image = new Bitmap(dx, dy, PixelFormat.Format32bppRgb); 

    using (Graphics graphics = Graphics.FromImage(image)) 
    { 
     graphics.Clear(System.Drawing.Color.White); 
     graphics.ScaleTransform(scale, scale); // scale to 72dpi 

     using (XGraphics gfx = XGraphics.FromGraphics(graphics, new XSize(Unit.FromInch(8.5).Point, Unit.FromInch(11).Point))) 
     { 
      renderer.RenderPage(gfx, page); 
      WriteTiffImage(imagePath, image); 
     } 
    }   
} 

WriteTiffImage() является используется для кодирования изображения как TIFF, а затем выполняет окончательную запись на диск.

private void WriteTiffImage(string targetPath, System.Drawing.Image image) 
{ 
    Encoder  encoder = Encoder.SaveFlag; 
    ImageCodecInfo tiffInfo = ImageCodecInfo.GetImageEncoders() 
           .Where(e => e.MimeType == "image/tiff") 
           .FirstOrDefault(); 

    EncoderParameters encoderParams = new EncoderParameters(1); 
    encoderParams.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame); 

    image.Save(targetPath, tiffInfo, encoderParams); 

    // close file 
    encoderParams.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.Flush); 
    image.SaveAdd(encoderParams); 
} 

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

0

Я считаю, что вы можете использовать XSL-FO, чтобы определить свой документ, а затем запустить его через FOP (nFOP для .NET) для вывода в TIFF. Я использовал его только для вывода PDF (и у меня были хорошие впечатления), но я вижу, что есть опция TIFF. http://xmlgraphics.apache.org/fop/0.95/running.htmlhttp://sourceforge.net/projects/nfop/ Удачи.

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