1

有谁知道一个好的 API,可以从 C++ 中使用,用于使用 RTL 语言(如阿拉伯语和希伯来语)以及复杂的脚本(如泰语和梵文)创建 PDF?我们目前正在使用 Tracker 的 PDF API,它非常出色,但它不处理除 LTR 脚本之外的任何内容,而且似乎 RTL 支持对他们来说并不是真正的优先事项,因为这种支持已经承诺了近 2 年,而且似乎没有即将到来。

4

1 回答 1

1

如果商业 Windows 库是一个有效的选项,您可以尝试使用Amyuni PDF Creator ActiveX。该库提供了用于创建或编辑 PDF 文件的自定义 API。如果您首先将文本对象包装为变体结构中的 unicode,您应该能够在文本对象中设置任何类型的文本。 如果您的应用程序已经支持使用 Windows GDI 进行打印,您可以重复使用此代码并尝试使用Amyuni PDF Converter。这是一个 Microsoft 认证的虚拟打印机驱动程序,可以生成 PDF 文件作为输出,并且可以从打印应用程序完全控制.



对于 Amyuni PDF Converter,有两种从 C++ 使用它的方法,您可以使用库提供的 C++ 头文件,也可以将其用作提供相同功能的 COM 类。更多细节可以在文档中找到。

该库提供了 C#、VB.Net 和 C++ 的示例代码。以下是其中一个示例的摘要版本:

#include "stdafx.h"
#include "CDIntf450.h"
#pragma comment (lib, "CDIntf450.lib")

#define AMYUNI_PRINTER          "My PDF Converter"
#define AMYUNI_LICENSE          "Amyuni Developer Evaluation"
#define AMYUNI_ACTIVATION_CODE  "0ABCCD...567B3"

//Get a handle to Amyuni PDF Converter
HANDLE hPrinter = DriverInit(AMYUNI_PRINTER);
if(hDC == NULL){ /* error handling */ }

//Set the Amyuni PDF Converter as the default printer
CDISetDefaultPrinter ( hPrinter );

//Configure the path for the output file
SetFileNameOptions ( hPrinter, NoPrompt | UseFileName );
SetDefaultFileName (hPrinter,  _T("c:\\temp\\PrintSomeThing.pdf") );

// Activate your license key
EnablePrinter ( hPrinter, AMYUNI_LICENSE, AMYUNI_ACTIVATION_CODE);

HDC hDC = CreateDC( "WINSPOOL" , AMYUNI_PRINTER, NULL, NULL);
if(hDC == NULL){ /* error handling */ }

DOCINFO di;
::ZeroMemory (&di, sizeof(DOCINFO));
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = _T("myDocTitle");
StartDoc(hDC, &di);
StartPage(hDC);

//Print something
TextOutW(hDC, 200, 200, L"هذا هو اختبار"), lstrlenW (L"هذا هو اختبار")));
TextOut(hDC, 0, 400, _T("My PDF App"), lstrlen (_T("My PDF App")));
EndPage(hDC);
EndDoc(hDC);

//Clean Up
DeleteDC(hDC);
RestoreDefaultPrinter( hPrinter );
SetFileNameOptions ( hPrinter, 0 );
DriverEnd( hPrinter );

免责声明 1:我目前在 Amyuni Technologies 工作。
免责声明 2:示例代码中的阿拉伯语文本是从谷歌翻译中获得的,所以如果事实证明是胡说八道,我提前道歉。

于 2013-05-01T13:24:15.343 回答