Создание изображений документа - PullRequest
3 голосов
/ 08 февраля 2012

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 22 февраля 2012

Итак, я нашел решение, которое позволило бы мне создавать документы с необходимыми мне функциями. В итоге я использовал 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 голосов
/ 08 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...