来自PDF文档的快照图像

5

我想从PDF文档中的任意页面(不一定是第一页)制作快照图像。 有免费的工具可以做到这一点吗? 我正在使用Delphi。
谢谢
史蒂文

6个回答

5
你可以使用pdftk和ImageMagick/Ghostscript两步操作来完成这个任务。
第一步:创建一个包含你感兴趣页面的新pdf文件。
pdftk.exe file.pdf cat 2 output page2_only.pdf

步骤2:将新的pdf转换为jpg格式:
convert -geometry 1600x1600 -density 200x200 -quality 100 page2_only.pdf page_snapshot.jpg

convert是ImageMagick的一个命令。

要使用此命令,需要安装Ghostscript。在我的测试中,convert会抱怨PDF格式无效,这是由pdftk引起的,但似乎不会影响输出结果。


1
你可以使用[]告诉imageMagick只转换你想要的页面,类似于convert -geometry 1600x1600 -density 200x200 -quality 100 file.pdf[2] page_snapshot.jpg - isalgueiro
对我来说,只需要输入convert -density 600 input.pdf output.jpg就足够了。 - Joerg S

1

这里有一些关于管理PDF的Delphi相关工具的比较: 前9名PDF管理工具。 到目前为止,我自己从未使用过其中任何一个,因此无法给出建议。

还有PDFlib Lite是开源的。

P.S.:你能否澄清一下你想要一个"一次性"(手动)解决方案还是编程解决方案?你在问题中提到了Delphi,但在对Pieter van Wyk的评论中,你似乎对手动解决方案感到满意。对于手动解决方案,像其他人一样,我建议使用Ghostscript(引擎)与Ghostview(UI)。Ghostscript有一个API可以被Delphi访问,但将其部署到商业程序中可能存在问题(大小、许可证等)。

§ 首先需要安装Ghostscript,然后再安装Ghostview。打开你的PDF文件,选择菜单栏中的“文件”/“转换”/“设备”选项,选择pdfwrite(或其他你需要或喜欢的图像格式),选择分辨率(72对于屏幕足够),选择页码,点击“确定”,选择文件夹和文件名,保存即可完成。


0

Steven

我几年前也遇到了同样的问题,唯一可靠的解决方案是购买Acrobat Professional(7),使用它来提取页面,将其复制到剪贴板,然后从中创建缩略图。我非常想知道是否有免费的方法可以从pdf文档中提取页面。

    procedure TFormMain.LoadPDFDoc(Filename: TFilename; var Bitmap: TBitmap);
var
  PDPage : variant;
  PdApp, PdDoc, PdRect: variant;
begin
  try

    PdApp  := CreateOleObject('AcroExch.App');
    PdDoc  := CreateOleObject('AcroExch.PDDoc');
    PdRect := CreateOleObject('AcroExch.Rect');

    //Open the pdf document
    PDDoc.Open(FileName);
    PDPage := PDDoc.AcquirePage(0);

    //Define the rectangle to fit the page
    PDRect.Top    := 0;
    PDRect.Left   := 0;
    PDRect.Right  := PDPage.GetSize.x;
    PDRect.Bottom := PDPage.GetSize.y;

    //Set the bitmap proportions
    with Bitmap do
      begin
        Width  := PDRect.Right;
        Height := PDRect.Bottom;
      end;

    //Copy the rectangle to the ClipBoard
    PDPage.CopyToClipboard(PDRect, 0, 0, 100);
    if not VarIsEmpty(PDPage) then
      PDPage := UnAssigned;

    //Close the pdf document
    PDDoc.Close;

    //Paste the image from the clipboard
    with Bitmap do
      begin
        LoadFromClipboardFormat(CF_BITMAP, ClipBoard.GetAsHandle(CF_BITMAP), 0);
        PixelFormat := pf24Bit;
        HandleType := bmDIB;
      end;

  Except on E: Exception do
    ShowMessage(E.Message);
  end;
end;

敬礼,Pieter


谢谢Pieter,到目前为止是最好的答案!(嗯...因为目前只有一个答案 :-)).
我在我的系统上安装了Acrobat,所以我可以测试代码。运行良好。(但目标系统上可能没有Acrobat)。
我们会看看是否有人提出更便宜的替代方案。在此期间,再次感谢。HANWE
- stevenvh
1
看起来很傻,而且通过剪贴板传递图像浪费了很多时间。难道没有一种直接将它复制到位图的方法吗? - Joris Groosman

0

使用命令行运行Ghostscript(没有ActiveX组件可用) gswin32c.exe .... 参数.....(请参阅文档,非常容易)


0

你可以考虑一下The QuickPDF Library。我已经使用这个库大约5年了。它有一个很好的支持群体,他们在原始出版商长期痛苦的放弃之后一直支持着它,现在由PDF世界中多年重要人物Karl De Abrew支持。他们在下载页面上提供了可下载的产品参考手册,我想他们还有类似于ClonePage之类的东西。无论如何,如果您在手册中找不到答案,请联系他们的支持,您可能会得到一个完整的解释,以实现您想要做的事情。

哎呀。我刚刚注意到需要“免费”。他们的工具箱价格相当合理,249美元,如果你的项目是你将要销售的东西,那么至少对你的用户来说是免费的或者不必另外收费。

杰克


使用QuickPDF库已经8年了,每次需要花费1500美元,那是原来的6倍,实在是太贵了,至少对于我来说是这样。(相当于每年25%的通货膨胀率。) - Joris Groosman

0

如果您不需要高分辨率的快照,您可以使用Acrobat的ActiveX组件在特殊表单(全屏,无边框)中打开pdf文件,导航到页面,然后获取屏幕截图。您可以立即关闭该表单,以便它只是闪现并消失。

在Windows上也可以使用ImageMagick,它具有非常简单的命令,您可以在(隐藏的情况下,使用ShellExec)中调用这些命令,创建JPEG(或任何其他图像类型)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接