我想将页面图像从PDF文档复制到TBitmap。我看了this answer。它没有马上工作;我必须在CopyToClipboard
之后添加等待:
ClipBoard.Clear;
PDPage.CopyToClipboard(PDRect, 0, 0, 100);
repeat
Sleep(100);
until ClipBoard.HasFormat(cf_Bitmap);
Bitmap.LoadFromClipboardFormat(cf_BitMap, ClipBoard.GetAsHandle(cf_Bitmap), 0);
但它远非理想。首先它很慢,其次如果你想将它用于批处理,那么剪贴板对其他应用程序来说是不受限制的。难道没有更好的方法,而且没有使用剪贴板吗?
在Acrobat's API documentation中,我找到了PDPage的DrawEx方法:
var
hBitmap: THandle;
...
hBitmap := CreateCompatibleBitmap(Bitmap.Handle, Bitmap.Width, Bitmap.Height);
PDPage.DrawEx(hBitmap, 0, PDRect, 0, 0, 100);
我希望它能将页面复制到我传递给函数的TImage.Picture.Bitmap。相反,页面是在桌面上绘制的,这使我认为hBitmap为0.使用调试器确认。
我该如何解决这个问题?
修改
MBo 表示创建后TBitmap已经拥有兼容的位图,因此CreateCompatibleBitmap
可能是多余的。但是我还是不知道应该把什么句子传递给DrawEx。我尝试Bitmap.Handle
,但结果位图是空白的。
我也试过
var
DC: HDC;
...
DC := GetDC(Bitmap.Handle);
try
PDPage.DrawEx(DC, 0, PDRect, 0, 0, 100);
finally
ReleaseDC(Handle, DC);
end;
但这也是在桌面上绘制的。