C# 创建文档图像

C# 创建文档图像,c#,image,C#,Image,我正在编写一个windows服务,它需要从数据库中检索数据,从该数据生成文档,然后将其传真。Tiff似乎是传真图像的标准,我知道我可以将图像对象编码为Tiff 如果我可以像文档一样构建图像对象,就像iTextSharp创建新元素并将元素附加到PdfDocument对象那样,那就太好了。我的传真文件很简单,但需要这些东西 将一段文字居中 添加另一个具有绝对定位(徽标)的图像 字段/值的简单两列表 横向规则 创建HTML文档很简单,但是.Net似乎没有办法将HTML呈现给图像对象 理想的解决方案

我正在编写一个windows服务,它需要从数据库中检索数据,从该数据生成文档,然后将其传真。Tiff似乎是传真图像的标准,我知道我可以将图像对象编码为Tiff

如果我可以像文档一样构建图像对象,就像iTextSharp创建新元素并将元素附加到PdfDocument对象那样,那就太好了。我的传真文件很简单,但需要这些东西

  • 将一段文字居中
  • 添加另一个具有绝对定位(徽标)的图像
  • 字段/值的简单两列表
  • 横向规则
创建HTML文档很简单,但是.Net似乎没有办法将HTML呈现给图像对象

理想的解决方案是BCL中的某种类型的文档类,可以呈现到图像对象,我可以从那里编码,或者某种类型的助手类/库或图像包装器将这些简单元素绘制到图像实例


是否存在任何一个解决方案,或者我可以考虑其他的东西吗?

< P>我相信你可以使用XSL-FO来定义你的文档,然后通过FOP(NFop.NET)运行它,输出到TIFF。我只在PDF输出中使用过它(我有很好的经验),但我确实看到了TIFF选项。祝您好运。

我相信您可以使用XSL-FO定义您的文档,然后通过FOP(nFOP for.NET)将其输出到TIFF。我只在PDF输出中使用过它(我有很好的经验),但我确实看到了TIFF选项。祝你好运。

所以我确实找到了一个解决方案,它允许我使用所需的功能构建文档。我最终使用了它,尽管它肯定没有iTextSharp那么优雅。MigraDoc允许我使用其XGraphics类从文档对象创建System.Drawing.Image对象

通过使用几个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);
}

我甚至可能不需要进行缩放,但它就在示例中,对于我想要实现的目标来说效果很好。

因此我找到了一个解决方案,允许我使用所需的功能构建文档。我最终使用了它,尽管它肯定没有iTextSharp那么优雅。MigraDoc允许我使用其XGraphics类从文档对象创建System.Drawing.Image对象

通过使用几个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);
}
我可能甚至不需要进行缩放,但它在示例中,对于我想要实现的目标来说效果很好