2019年4月5日 星期五

在 Windwos Server 2019 上使用 ABCpdf

依照 PDF Component Comparison Chart 的比較表,可以知道要執行 ABCpdf 7 需要安裝 DotNet 3.5。
ABCpdf 版本 相關特色
ABCpdf 7、ABCpdf 8 Requires .NET 2.0 or Later
Dynamic Linking into .NET 3.0 / 3.5 if Available
ABCpdf 9 之後Requires .NET 4.0 or Later

在 Windwos Server 2019 上,可以直接安裝最新版的 ABCpdf 11,在使用上當然是最省事的。但是網站若使用 [NET v2.0] 的應用程式集區,就無法使用 ABCpdf 11 ,必須使用 ABCpdf 7/8,例如 ABCpdf  7.0.42 。

在安裝 ABCpdf 7 之前,必須先安裝 [.NET Framework 3.5 (包括 .NET 2.0 和 3.0)],否則會出現下面的錯誤提示。


不過,無法使用新增角色來安裝 DotNet 3.5,先連上 2019 的 DVD,再執行下述指令
DISM /Online /NoRestart /Enable-Feature /all /FeatureName:NetFx3 /Source:D:\sources\sxs 

然後,以系統管理員身分執行 ABCpdf 7 的安裝程式 Installer.msi,否則裝到最後,會出現下面的錯誤提示。因此本文的主要目標,是在 Windwos Server 2019 上安裝 ABCpdf 7,並且能在 PHP 中使用。


測試時,安裝 Windwos Server 2019 的光碟資訊如下
  • 版本: 10.0.17763.1
  • 映像版本: 10.0.17763.107

基本設定

在新增的 IIS 伺服器的角色後,還需裝 ASP、ASP.NET 3.5、ASP.NET 4.7、CGI。

另外,要設定一下目錄的權限,其中 wwwroot、temp 目錄要可以匿名讀取。

還有,必須使用 32位元的 PHP,才能使用。
在 FastCgi 新增 PHP 的程式,然後在 [處理常式對應] 中,新增 [模組對應]。

手動安裝及設定 ABCpdf 7

雖然已確定可以在 Windwos Server 2019 上,可以直接安裝 ABCpdf 7,但最早的手動安裝的測試還是留下來,供作參考。

剛開如測試時,在 Windwos Server 2019 上,無法直接安裝 ABCpdf 7,因此在其他 OS 上裝好,例如 Windwos Server 2003,然後將所需的檔案 copy 過來。 

[Default Web Site] 是使用 [DefaultAppPool],其為使用  [.NET CLR 版本 v4.0.30319],無法使用 ABCpdf 7。

必須建立 [新增應用程式],使用 [NET v2.0] 的應用程式集區,並且在 [進階設定] 中,將 [啟用32位元應用程式] 改成 True。

然後在新建的應用程式目錄下,建立 [bin] 目錄,並且將 ABCpdf.DLL, ABCpdfCE7.dll 兩個目錄,copy 到 bin 的目錄下。如此,ASP.NET 即可執行。

ASP.NET 的測試程式
<%@ Page LANGUAGE="VBscript" Aspcompat="false" Debug="true" Trace="false" %>
<%@ Import Namespace="WebSupergoo.ABCpdf7" %>
<%
 Dim theDoc = new Doc()
 Dim license = "License: " & theDoc.License & "<br>" 
 Response.write(license)
%>

ASP 的測試程式
<%
Set theDoc = Server.CreateObject("ABCpdf7.Doc")
license = "License: " & theDoc.License & "<br>"
Response.write license
%>

為了方便 ASP 除錯,把偵錯內容都打開來。執行上述 ASP 程式,出現錯誤如下。
伺服器物件 錯誤 'ASP 0177 : 800401f3'
Server.CreateObject 失敗
/dotnet20/pdf.asp, 行2
800401f3

到已安裝 ABCpdf 7 的 OS 中,把安裝的程式 copy 到 [c:\ProgramFiles(x86)\WebSupergoo\ABCpdf .NET 7.0\] 下。執行 PDFSettings.exe,輸入序號。

然後,修改 [ASP and COM] 目錄下的 register.bat,把 %ProgramFiles% 改成 %ProgramFiles(x86)%,然後執行,用來把 DLL 註冊到 registry。再執行 ASP 程式,即可顯示正確的結果
License: Professional License
PHP 的測試程式如下
<?php
// 啟始方式 1
$theDoc = new COM("ABCpdf7.Doc", null, CP_UTF8);
// 啟始方式 2
/*
$theDoc = new DOTNET("ABCpdf, Version=7.0.4.2, Culture=neutral, PublicKeyToken=a7a0b3f5184f2169", 
                  "WebSupergoo.ABCpdf7.Doc", CP_UTF8
              );
*/
$license = "License: " . $theDoc->License . "<br>";
echo $license; 

執行後,會出現下述錯誤
Fatal error: 
Uncaught Error: Class 'COM' not found in 
C:\inetpub\wwwroot\dotnet20_dir\pdf.php:2 
Stack trace: 
#0 {main} thrown in C:\inetpub\wwwroot\dotnet20_dir\pdf.php on line 2
修改 php.ini
; Directory in which the loadable extensions (modules) reside.
; On windows:
extension_dir = "ext"

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
extension=php_com_dotnet.dll

再次執行,錯誤變成
Fatal error: 
Uncaught com_exception: Failed to create COM object `ABCpdf7.Doc': 
in C:\inetpub\wwwroot\dotnet20_dir\pdf.php:2 
Stack trace: 
#0 C:\inetpub\wwwroot\dotnet20_dir\pdf.php(2): com->com('ABCpdf7.Doc', NULL, 65001) 
#1 {main} thrown in C:\inetpub\wwwroot\dotnet20_dir\pdf.php on line 2

到安裝了 ABCpdf 7 的系統中,將 [c:\Windows\assembly\GAC_MSIL\] 的 [ABCpdf\7.0.4.2__a7a0b3f5184f2169],copy 到新的系統中。
原來的目錄下,只有 ABCpdf.DLL,還必須把 ABCpdfCE7.dll 也 copy 進到此目錄。

執行之後,即可顯示正確的結果。


ABCpdf 8 和 ABCpdf 11 可以同時安裝,但必須先裝 ABCpdf 8,再裝 ABCpdf 11,才可以。

安裝字型,如 barcode 字型,只要選擇 "為所有使用者安裝" 即可。

沒有留言:

張貼留言

網誌存檔