我正在尝试使用Debenu (Foxit) Quick PDF Library(适用于iOS)将PKCS#7数字签名嵌入到PDF中。根据他们提供的示例代码,我将不得不在PDF文件字节数组中写入签名(以十六进制格式)。这是用C#编写的示例代码:
public int Sign(string pdfLocation, byte[] hexSignature, int signaturePlaceholderLength, int signaturePlaceholderStartPosition)
{
if (hexSignature.Length < signaturePlaceholderLength)
{
// Write the signature into the placeholder
using (BinaryWriter writer = new BinaryWriter(new FileStream(pdfLocation, FileMode.Open)))
{
writer.BaseStream.Seek(signaturePlaceholderStartPosition, SeekOrigin.Begin);
writer.BaseStream.Write(hexSignature, 0, hexSignature.Length);
}
}
else
{
AddLog("Error: digital signature is larger than the placeholder size");
}
}
我无法在Swift中编写相同的算法,因为我不知道如何将签名写入我的PDF Data
对象:
func sign(pdfDocument: Data, hexSignature: String, signaturePlaceholderLength: Int, signaturePlaceholderStartPosition: Int) {
if hexSignature.count < signaturePlaceholderLength {
// how can I add hexSignature inside pdfDocument on signaturePlaceholderStartPosition?
}
}
我看到了Data.write
函数,但是它将数据的内容写到了一个位置。
还有Data.insert
会在指定位置插入UInt8
,但我的签名是String
(十六进制)。
我尝试搜索Swift insert String inside Data object
,但找不到任何有用的信息。
那么,我是否误解了Data
对象以及如何在Swift上使用它们?我是否需要将签名转换为Data
可以处理的内容?还是有一些辅助类需要在Data
对象中插入新数据?
答案 0 :(得分:0)
为什么不只将hexSignature更改为[UInt8]? 因为这就是您在C#中所做的
let hexSignatureBytes: [UInt8] = Array(hexSignature.utf8)