我正在编写一个从数据库中检索数据,从该数据构建文档然后传真的Windows服务。 Tiff似乎是传真图像的标准,我知道我可以将Image对象编码为tiff。
如果我可以通过创建新元素并将元素附加到PdfDocument对象来构建类似于iTextSharp的文档的图像对象,那将是很棒的。我的传真文件很简单但需要这些东西
创建HTML文档很简单,但.Net似乎没有办法将HTML呈现给图像对象。
理想的解决方案是BCL中的某种类型的文档类,它可以呈现给图像对象,在那里我可以从那里编码或者某种类型的帮助器类/库或图像包装器将这些简单元素绘制到图像实例。
是否存在任何解决方案或者我可以考虑其他什么?
答案 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);
}
我可能甚至不需要进行缩放,但它在示例中并且很好地完成了我想要完成的任务。