创建文档图像

时间:2012-02-08 14:03:01

标签: c# image

我正在编写一个从数据库中检索数据,从该数据构建文档然后传真的Windows服务。 Tiff似乎是传真图像的标准,我知道我可以将Image对象编码为tiff。

如果我可以通过创建新元素并将元素附加到PdfDocument对象来构建类似于iTextSharp的文档的图像对象,那将是很棒的。我的传真文件很简单但需要这些东西

  • 居中一段文字
  • 添加另一张绝对定位的图像(徽标)
  • 字段/值的简单两列表
  • 横向规则

创建HTML文档很简单,但.Net似乎没有办法将HTML呈现给图像对象。

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

是否存在任何解决方案或者我可以考虑其他什么?

2 个答案:

答案 0 :(得分:0)

我相信您可以使用XSL-FO定义您的文档,然后通过FOP(nFOP for .NET)运行它以输出到TIFF。我只用它来输出PDF(我有很好的经历),但我确实看到有一个TIFF选项。 http://xmlgraphics.apache.org/fop/0.95/running.html http://sourceforge.net/projects/nfop/祝你好运。

答案 1 :(得分:0)

所以我找到了一个解决方案,允许我使用我需要的功能构建文档。我最终使用MigraDoc,尽管它肯定不如iTextSharp那么优雅。 MigraDoc允许我使用其XGraphics类从Document对象创建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);
}

我可能甚至不需要进行缩放,但它在示例中并且很好地完成了我想要完成的任务。