Google 在 BSD 3-Clause 许可证下开源了 Chrome 的 PDF 渲染引擎 PDFium。不同于 Mozilla 基于 JavaScript 的 PDF.js。谷歌采用福昕的 PDF 技术为其 PDF 开源项目提供开源 PDF 渲染引擎。现在,通过福昕 SDK,PDF 开发人员使用PDF 源码时可以更加简单,福昕 SDK 提供了可定制的 PDFium 源码。PDFium 源码与福昕其他强大的 PDF SDK 集成所需的特殊接口、及时高效的支持和专业的服务,让客户使用开源项目时更加自信从容。
下面我们来体验一下这个开源组件的使用。
1. Lazarus 中安装 PDFium
方法同样适用于 Delphi 和 CodeTyphon。
首先在网上下载 PDFium 的源代码,如:
Winsoft PDFium Component Suite 5.4 for 5-10.3 FULL SOURCE
下载后解压缩,其文件夹中应该包含各个版本的安装包,图示如下:
包括 Delphi 各个版本、Lazarus 和 Typhon 的组件包。
在 Lazarus 中安装非常简单,将解压后的文件夹复制到 Lazarus 的安装目录,打开 Lazarus ,然后选择 Package -> Open Package File,选择 PDFium 目录中 Lazarus 下的包文件名 pdfiump.lpk,打开包后如下图所示:
从上图中可以看到缺少了两个 pas 源代码文件,此时,在文件名上右键,选择 Remove File,然后在 Files 上右击,选择 Add Files From File System,然后在 PDFium 目录中的 Source 目录选择 PDFiumE.pas 和 PDFium.pas,弹出对话框中提示源代码的位置,选择 Yes,最后选择安装即可。
安装完成后,系统会自动重新启动 Lazarus,启动后即可看到组件,如下图所示:
此时,我们就可以使用 PDFium 组件来进行一些 Pdf 文件的操作。
PDFium 组件包包含两个组件: TPdfView 与 TPdf,其中 TPdfView 用于显示 TPdf 中的文档。
2. TPdf 组件
TPdf 组件指具体的 Pdf 文档。其常用属性如下:
- Active
property Active: Boolean;
打开或关闭选定的PDF文档。
- FileName
property FileName: string;
PDF文件名,应指定具体文件路径及文件名。
- Password
property Password: string;
PDF文件的密码。
- PageNumber
property PageNumber: Integer;
文档的当前页面。值必须是1到 PageCount 之间。
- PageCount
property PageCount: Integer;
文档中的总页数。只读属性。
该组件的常用方法如下:
- LoadDocument
procedure LoadDocument(Data: TMemoryStream);
从内存中打开并加载PDF文档。
参数:
Data 内存数据。
- RenderPage
function RenderPage(Left, Top, Width, Height: Integer; Rotation: TRotation = ro0; Options: TRenderOptions = []; Color: TColor = clWhite): TBitmap;
将页面内容转换为位图。
参数: Left 、Top 左上角坐标,Width 、Height 宽度和高度.
Rotation 页面旋转。
type TRotation = (ro0, ro90, ro180, ro270);
PDF 页面旋转。 页面只能按旋转顺时针旋转。
ro0 无页面旋转
ro90 页面顺时针旋转 90 度
ro180 页面顺时针旋转 180 度
ro270 页面顺时针旋转 270 度
Options 页面呈现标志。
type TRenderOptions = set of TRenderOption;
页面呈现标志。
reAnnotations 渲染注解
reLcd 为 LCD 显示优化的文本渲染
reNoNativeText 不要使用某些平台上提供的本机文本输出
reGrayscale 灰度输出
reDebugInfo 设置是否要获取一些调试信息
reNoCatchException 设置是否要不捕获异常
reLimitCache 限制图像缓存大小
reHalftone 始终使用半色调进行图像拉伸
rePrinting 渲染打印
reReverseByteOrder 以相反的字节顺序呈现; 此标志仅在渲染到位图时启用
reNoSmoothText 禁用文本上的抗锯齿
reNoSmoothImage 禁用图像上的抗锯齿
reNoSmoothPath 禁用路径上的抗锯齿
Color 背景色。
返回值: 转换后的位图
3.示例
创建 Application 项目,在窗体上放置一个 Panel 组件,设置 Caption 为 '',Align 为 alTop。
在窗体上放置 TPdfView 组件PdfView1和 TPdf 组件Pdf1,并设置 PdfView1 的 Pdf 属性指向Pdf1 ,将 PdfView1 的 Align 属性设置为 alClient。
窗体的创建事件代码如下:
procedure TForm1.FormCreate(Sender: TObject);
begin
//设置打开的PDF文件路径
Pdf1.FileName := 'test.pdf';
//设置打开的页数
PdfView1.PageNumber := 1;
//显示PDF
PdfView1.Active := True;
end;
在 Panel 组件上放置一个 Button 组件,设置 Caption 为"保存为图片",编写代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
ABitmap: TBitmap;
begin
// 循环所有PDF页面
for i := 1 to Pdf1.PageCount do
begin
//选择PDF文档的页面
Pdf1.PageNumber := i;
//转换成 bmp(pdf中的屏幕像素数是72)
ABitmap := Pdf1.RenderPage(0, 0, Round(Screen.PixelsPerInch * Pdf1.PageWidth / 72.0), Round(Screen.PixelsPerInch * Pdf1.PageHeight / 72.0));
try
ABitmap.SaveToFile(IntToStr(i) + '.bmp');
finally
ABitmap.Free;
end;
end;
end;
在 Panel 组件上放置一个 Button 组件,设置 Caption 为"打印",编写代码如下:
添加:uses Printers
procedure TForm1.Button2Click(Sender: TObject);
var
i: Integer;
ABitmap: TBitmap;
begin
// 开始打印
Printer.BeginDoc;
try
// 循环所有PDF页面
for i := 1 to Pdf1.PageCount do
begin
if i > 1 then
Printer.NewPage;
// 选择 PDF 文档的页面
Pdf1.PageNumber := i;
// 将页面内容转换为 bmp
ABitmap := Pdf1.RenderPage(0, 0, Printer.PageWidth, Printer.PageHeight, ro0, [rePrinting]);
// 打印 bmp
Printer.Canvas.StretchDraw(Printer.Canvas.ClipRect, ABitmap);
end;
finally
Printer.EndDoc;
end;
end;
在 Panel 组件上放置一个 Button 组件,设置 Caption 为"打开",编写代码如下:
procedure TForm1.Button3Click(Sender: TObject);
var
AMemory: TMemoryStream;
begin
// 关闭已打开的PDF文件
Pdf1.Active := False;
// 加载PDF文件到流中
AMemory := TMemoryStream.Create;
AMemory.LoadFromFile('test.pdf');
// 加载流中的PDF
Pdf1.LoadDocument(AMemory);
// 设置打开的页数为倒数第2页
PdfView1.PageNumber := Pdf1.PageCount-1;
//显示PDF
PdfView1.Active := True;
end;
打开 按钮的操作是通过流加载文档。
运行程序前,需要将 pdfium.dll 文件复制到 Application 所在目录。
本文暂时没有评论,来添加一个吧(●'◡'●)