Итак, я нашел решение, которое позволило бы мне создавать документы с необходимыми мне функциями. В итоге я использовал 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);
}
Мне, вероятно, даже не нужно было выполнять масштабирование, но это было в примере и сработало хорошо для того, чего я хотел достичь.