RPG iSeries从Java函数中提取byte[]格式的PDF并将其写入IFS



我正在RPGLE中准备一个程序,该程序将使用Java函数返回精美的PDF文件。我想在RPGLE中获取PDF,并在IFS上创建一个PDF文件。

目前,Java程序以byte[]格式返回PDF。然后,我在RPG中将byte[]作为char,并尝试用它创建流文件。但是PDF已经损坏,我无法通过Adobe Reader打开它。。。

以下是创建流文件的Java过程和代码的原型:

D GetPDF    PR    A ExtProc(*Java:'PDF':'get') Len(16773100) CCSID(*HEX)
Dcl-S wkPDFTxt Char(16773100) CCSID(*HEX);
wkPDFTxt = GetPDF();

fd = open(filePath
:O_CREAT + O_EXCL + O_WRONLY + O_CCSID + O_INHERITMODE
:S_IRUSR
:65535);
write(fd: %addr(wkPDFTxt): %Len(%Trim(wkPDFTxt));
close(fd)

任何熟悉PDF创建的人都可以帮助我如何实现这一点?我认为将byte[]作为char[((并将其写入UTF8中的流文件是可行的,但事实并非如此。

我找到了打开/写入/关闭函数。它们是UNIX类型的集成文件系统API。

当文件已经存在时,CCSID就是文件CCSID。参数中指定的CCSID只是创建文件时使用的CCSID。它应该是1208(UTF-8(或819(ASCII(,即使PDF是二进制格式。也许您应该使用819,因为这似乎是您从Java方法中得到的。

不执行转换。根据文件

如果未指定O_TEXTDATA,则数据将作为二进制处理。数据从文件中读取并写入文件,无需任何转换。应用程序负责处理数据。

您必须确保数据采用所需的格式。文档有点混乱,因为第四个参数被称为转换ID,文档说

当创建新文件时,指定或派生的CCSID被假定为文件中数据的CCSID。该CCSID在文件创建过程中与文件相关联。

标点符号可能有误。为了与文档的其余部分保持一致,它应该是

指定或派生的CCSID被假定为文件中数据的CCSID。当创建新文件时,该CCSID在文件创建过程中与该文件相关联。

在任何情况下,您都没有O_TEXTDATA(也不应该(,所以由于源CCSID看起来像是819(这对于美国的windows文件来说是正常的(,您应该将CCSID设置为819,并按照您获得的方式写入数据。

可能是编码问题。。。wkPDFTxt是char((,因此是EBCDIC。如果您>=V7R2中,您可以通过在声明中添加来强制使用UTF8

Dcl-S wkPDFTxt Char(16773100) CCSID(*UTF8);

是否可以在java端编写流,并用十六进制与RPG文件进行比较?

如果您处理的是像PDF这样的二进制对象,CCSID(65535(或CCSID(*HEX(似乎更合适。

我会将其添加到PR和wkPDFTxt的声明中,尽管wkPDFbuffer是一个更合适的名称。

此外,当您打开流文件时,您将希望使用65535而不是1208

最后,Java方法的PR看起来有点可疑,查看您正在调用的Java方法的签名可能会有所帮助,以确保正确执行。

最新更新