Monotouch アプリケーションでは、次のコードはページを PDF ドキュメントから UIImage に変換します。動作しますが、PDF ドキュメントが正しく配置されません。
public class KillerLeak
{
public static void RunOnce()
{
using (CGPDFDocument doc = CGPDFDocument.FromFile("DMSWorkbook.pdf"))
{
Console.WriteLine("Opened: pages={0}", doc.Pages);
UIImage img = GetThumbImage(doc, 1000, 1);
img.Dispose();
}
GC.Collect(GC.MaxGeneration);
GC.WaitForPendingFinalizers();
}
private static UIImage GetThumbImage(CGPDFDocument document, float thumbContentSize, int pageNumber)
{
if ((pageNumber <= 0) || (pageNumber > document.Pages)) {
return null;
}
// Calc page view size
SizeF pageSize = new SizeF(768, 1024);
if (pageSize.Width % 2 > 0) {
pageSize.Width--;
}
if (pageSize.Height % 2 > 0) {
pageSize.Height--;
}
// Calc target size
var targetSize = new Size((int)pageSize.Width, (int)pageSize.Height);
// Draw page on CGImage
CGImage pageImage;
using (CGColorSpace rgb = CGColorSpace.CreateDeviceRGB()) {
using (CGBitmapContext context = new CGBitmapContext(null, targetSize.Width, targetSize.Height, 8, 0, rgb, CGBitmapFlags.ByteOrder32Little | CGBitmapFlags.NoneSkipFirst)) {
using (CGPDFPage pdfPage = document.GetPage(pageNumber)) {
RectangleF thumbRect = new RectangleF(0.0f, 0.0f, targetSize.Width, targetSize.Height);
context.SetFillColor(1.0f, 1.0f, 1.0f, 1.0f);
context.FillRect(thumbRect);
context.ConcatCTM(pdfPage.GetDrawingTransform(CGPDFBox.Crop, thumbRect, 0, true));
context.SetRenderingIntent(CGColorRenderingIntent.Default);
context.InterpolationQuality = CGInterpolationQuality.Default;
context.DrawPDFPage(pdfPage);
pageImage = context.ToImage();
}
}
}
UIImage result = UIImage.FromImage(pageImage);
pageImage.Dispose();
return result;
}
}
DrawPDFPage(...) 行をコメントアウトすると、コードは漏れません。これは Monotouch のバグですか、それとも何か間違っていますか?