1. 程式人生 > >在MFC專案中使用Quick PDF Library Lite讀寫pdf檔案

在MFC專案中使用Quick PDF Library Lite讀寫pdf檔案

簡介

  Debenu Quick PDF Library是一個強大的PDF控制元件庫,可以幫助開發者在自己的應用程式中新增處理PDF檔案的功能,僅僅需要幾行程式碼就可以建立,渲染,列印,加強安全,合併,分割和操作PDF檔案。它包含超過900個函式,支援C,C++,C#,Delphi(version 4 to XE5),Objective-C,Python,PHP,Visual Basic,VB.NET,ASP,PowerBASIC,Pascal和其它語言,包括了ActiveX,DLL,LIB,Delphi和Dylib等版本。
  Debenu Quick PDF Library Lite是原控制元件庫的免費精簡版,提供了常用的功能。本文總結了在MFC專案中使用該庫的常用方法,程式設計環境為VS2008 SP1。

安裝

  首先到官網下載該庫,官網地址為:http://www.debenu.com/。本文所使用的版本為11.14,下載後得到一個exe檔案:debenu_quick_pdf_library_lite_en.exe。雙擊exe檔案即可安裝控制元件庫,安裝過程中會要求輸入安裝目錄,選擇合適的目錄完成安裝。
  安裝完成後開啟剛才所選擇的目錄,可以看到以下目錄與檔案。

<Import>
<Samples>
Debenu Quick PDF Library 11.14 Reference Guide.pdf
DebenuPDFLibrary64Lite1114.dll
DebenuPDFLibrary64Lite1114.tlb
DebenuPDFLibraryLite1114.dll
DebenuPDFLibraryLite1114.tlb
GettingStarted.pdf
license.pdf
readme.txt
reasons_to_upgrade.pdf
uninstall.exe

  檔案GettingStarted.pdf介紹了在使用該控制元件庫之前需要做的一些準備工作。首先以管理員身份執行命令提示符並切換到安裝目錄下,然後輸入以下命令完成控制元件的註冊。

regsvr32 DebenuPDFLibraryLite1114.dll

  上述命令註冊的是32位版本的控制元件,如需使用64位版本,將命令中的DebenuPDFLibraryLite1114.dll替換為DebenuPDFLibrary64Lite1114.dll即可。該版本控制元件庫的類名為DebenuPDFLibraryLite1114.PDFLibrary。類名中的1114代表控制元件的版本號,不同版本的控制元件庫類名不同。
  控制元件註冊完成後就可以使用了。以Microsoft Visual Studio 2008為例,首先開啟一個MFC專案,然後在控制元件庫安裝目錄下的Import\CPlusPlus

資料夾中找到如下兩個檔案並複製到MFC專案的原始碼目錄下。

DebenuPDFLibraryLite1114.h
DebenuPDFLibraryLite1114.cpp

  接著將這兩個檔案新增到MFC專案中,新增完成後如果直接編譯會報錯。

1>e:\projects\example\example\debenupdflibrarylite1114.cpp(455) : fatal error C1010: 在查詢預編譯頭時遇到意外的檔案結尾。是否忘記了向源中新增“#include "stdafx.h"”?

  解決方法是在VS2008的解決方案資源管理器中右擊DebenuPDFLibraryLite1114.cpp檔案,在彈出的右鍵選單中選擇屬性,開啟屬性頁對話方塊,依次選擇配置屬性->C/C++->預編譯頭,將建立/使用預編譯頭選項修改為不使用預編譯頭
  除了以上錯誤外,還會出現兩個警告。

1>e:\projects\example\example\debenupdflibrarylite1114.cpp : warning C4819: 該檔案包含不能在當前內碼表(936)中表示的字元。請將該檔案儲存為 Unicode 格式以防止資料丟失
1>e:\projects\example\example\debenupdflibrarylite1114.h : warning C4819: 該檔案包含不能在當前內碼表(936)中表示的字元。請將該檔案儲存為 Unicode 格式以防止資料丟失

  解決方法是在VS2008中分別開啟兩個檔案debenupdflibrarylite1114.hdebenupdflibrarylite1114.cpp,按Ctrl+A選中全部內容,然後在選單欄選擇編輯->高階->設定選定內容的格式,即可轉換檔案編碼,儲存並重新編譯後警告就消失了。
  編譯成功後在需要使用該控制元件庫的地方包含標頭檔案DebenuPDFLibraryLite1114.h並定義類DebenuPDFLibraryLite1114的物件即可使用相關函式處理pdf檔案。

示例程式

  在控制元件庫的安裝目錄下有一個Samples資料夾,其中包含了一些使用VBScript語言呼叫該控制元件庫的例子,本文使用C++語言實現了相應的功能。更多功能可以參考安裝目錄下的Debenu Quick PDF Library 11.14 Reference Guide.pdf檔案。

Hello World

  建立一個新的pdf檔案並將文字Hello world!寫入檔案中。

DebenuPDFLibraryLite1114 pdf;
pdf.DrawText(100, 500, _T("Hello world!"));
pdf.SaveToFile(_T("hello-world.pdf"));

Draw Text

  建立一個新的pdf檔案並在其中寫入文字。

DebenuPDFLibraryLite1114 pdf;

// 設定頁面左上角為座標系原點
// 0 左下角
// 1 左上角
// 2 右上角
// 3 右下角
// 其他值 左下角
pdf.SetOrigin(1);

// 在頁面指定位置繪製文字
pdf.DrawText(100, 200, _T("Hello world!"));

// 在指定位置的文字框中繪製文字
// Options = 0 垂直居中對齊
// Options = 1 垂直頂部對齊
// Options = 2 垂直底部對齊
// Options = 3 垂直居中對齊,不換行
// Options = 4 垂直頂部對齊,不換行
// Options = 5 垂直底部對齊,不換行
pdf.DrawTextBox(350, 150, 200, 200, _T("This text was drawn ")
    _T("using the DrawTextBox function. Similar to the DrawText ")
    _T("function except that the alignment can be specified and ")
    _T("line wrapping occurs."), 1);

// 設定文字顏色
pdf.SetTextColor(0.9, 0.2, 0.5);

// 設定文字大小
pdf.SetTextSize(30);

pdf.DrawText(100, 100, _T("Big and Colorful."));

pdf.SaveToFile(_T("text.pdf"));

Fonts and Text

  建立一個新的pdf檔案並使用不同的字型寫入文字。

DebenuPDFLibraryLite1114 pdf;

// 為文件新增字型
// StandardFontID = 0 Courier
// StandardFontID = 1 CourierBold
// StandardFontID = 2 CourierBoldOblique
// StandardFontID = 3 CourierOblique
// StandardFontID = 4 Helvetica
// StandardFontID = 5 HelveticaBold
// StandardFontID = 6 HelveticaBoldOblique
// StandardFontID = 7 HelveticaOblique
// StandardFontID = 8 TimesRoman
// StandardFontID = 9 TimesBold
// StandardFontID = 10 TimesItalic
// StandardFontID = 11 TimesBoldItalic
// StandardFontID = 12 Symbol
// StandardFontID = 13 ZapfDingbats
// 返回值 0 新增失敗 其他值 字型ID
int fontID1 = pdf.AddStandardFont(0);

// 選擇字型
pdf.SelectFont(fontID1);

// 在頁面指定位置繪製文字
pdf.DrawText(100, 700, _T("Courier"));

int fontID2 = pdf.AddStandardFont(1);
pdf.SelectFont(fontID2);
pdf.DrawText(100, 650, _T("CourierBold"));

int fontID3 = pdf.AddStandardFont(2);
pdf.SelectFont(fontID3);
pdf.DrawText(100, 600, _T("CourierBoldOblique"));

int fontID4 = pdf.AddStandardFont(3);
pdf.SelectFont(fontID4);
pdf.DrawText(100, 550, _T("CourierOblique"));

int fontID5 = pdf.AddStandardFont(4);
pdf.SelectFont(fontID5);
pdf.DrawText(100, 500, _T("Helvetica"));

pdf.SaveToFile(_T("different-fonts.pdf"));

Set Document Properties

  建立一個新的pdf檔案並設定檔案屬性。

DebenuPDFLibraryLite1114 pdf;

// 在頁面指定位置繪製文字
pdf.DrawText(50, 500, _T("Open this PDF in Adobe Reader ")
    _T("and press Ctrl + D to see the document properties for this PDF."));

// 設定檔案屬性
// 0 PDF版本
// 1 作者
// 2 標題
// 3 主題
// 4 關鍵字
// 5 生成器
// 6 建立工具
// 7 建立時間
// 8 最近更新時間
// 9 XMP dc:subject (看不懂)
// 返回值 0 失敗 1 成功
pdf.SetInformation(1, _T("Debenu"));
pdf.SetInformation(2, _T("Sample Document Properties"));

pdf.SaveToFile(_T("set-document-properties.pdf"));

Image to pdf

  建立一個新的pdf檔案並將影象寫入檔案。

DebenuPDFLibraryLite1114 pdf;

// 從檔案中載入影象
pdf.AddImageFromFile(_T("image.png"), 0);

// 獲取影象的寬與高
int lWidth = pdf.ImageWidth();
int lHeight = pdf.ImageHeight();

// 設定所選文件的頁面大小
pdf.SetPageDimensions(lWidth, lHeight);

// 繪製圖像
pdf.DrawImage(0, lHeight, lWidth, lHeight);

pdf.SaveToFile(_T("image.pdf"));

  建立一個新的pdf檔案並將Web連結寫入檔案。

DebenuPDFLibraryLite1114 pdf;

// 設定頁面左上角為座標系原點
pdf.SetOrigin(1);

// 新增Web連結
// Options:0 無邊框 1 有邊框
pdf.AddLinkToWeb(200, 100, 60, 20, _T("http://www.debenu.com"), 1);

// 在連結區域內繪製文字提示有連結存在
pdf.DrawText(205, 114, _T("Click me!"));

pdf.SaveToFile(_T("web-link.pdf"));

其他程式

在指定位置新增水印

DebenuPDFLibraryLite1114 pdf;

// 載入pdf檔案
pdf.LoadFromFile(_T("license.pdf"), _T(""));

// 選擇指定頁面
pdf.SelectPage(2);

// 設定頁面左上角為座標系原點
pdf.SetOrigin(1);

// 載入png影象
// Option = 6 表示載入影象時包含alpha通道
pdf.AddImageFromFile(_T("image.png"), 6);

pdf.DrawImage(100, 100, pdf.ImageWidth(), pdf.ImageHeight());

pdf.SaveToFile(_T("image_water.pdf"));