C# 创建文档图像
我正在编写一个windows服务,它需要从数据库中检索数据,从该数据生成文档,然后将其传真。Tiff似乎是传真图像的标准,我知道我可以将图像对象编码为Tiff 如果我可以像文档一样构建图像对象,就像iTextSharp创建新元素并将元素附加到PdfDocument对象那样,那就太好了。我的传真文件很简单,但需要这些东西C# 创建文档图像,c#,image,C#,Image,我正在编写一个windows服务,它需要从数据库中检索数据,从该数据生成文档,然后将其传真。Tiff似乎是传真图像的标准,我知道我可以将图像对象编码为Tiff 如果我可以像文档一样构建图像对象,就像iTextSharp创建新元素并将元素附加到PdfDocument对象那样,那就太好了。我的传真文件很简单,但需要这些东西 将一段文字居中 添加另一个具有绝对定位(徽标)的图像 字段/值的简单两列表 横向规则 创建HTML文档很简单,但是.Net似乎没有办法将HTML呈现给图像对象 理想的解决方案
- 将一段文字居中
- 添加另一个具有绝对定位(徽标)的图像
- 字段/值的简单两列表
- 横向规则
是否存在任何一个解决方案,或者我可以考虑其他的东西吗?
< 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);
}
我可能甚至不需要进行缩放,但它在示例中,对于我想要实现的目标来说效果很好