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