外壳 (Wrapper)
Wrapper 为用户提供了一种保存与 PDF 文档相关的数据的方法。例如,在打开一个加密未授权的 PDF 文档,用户会看到错误信息提示其没有权限访问该文档。在这种情况下,使用 wrapper,用户即使无法访问 PDF 中的内容,但仍然可以访问该文档的 wrapper 数据。Wrapper 数据可用来提供信息给用户,比如文档的解密方法。
打开包含 wrapper 数据的 PDF 文档
c++
#include "include/common/fs_common.h"
#include "include/pdf/fs_pdfdoc.h"
#include "include/pdf/fs_pdfpage.h"
#include "include/common/fs_render.h"
using namespace foxit;
using namespace foxit::common;
using foxit::common::Library;
using namespace pdf;
using namespace common::file;
// file_name is PDF document which includes wrapper data.
PDFDoc doc(file_name);
ErrorCode code = doc.Load();
if (code != foxit::e_ErrSuccess) {
return false;
}
if(!doc.IsWrapper()){
return false;
}
int64 offset = doc.GetWrapperOffset();
FileReader file_reader(offset);
file_reader.LoadFile(String::FromUnicode(file_name));
...
C
#include "include/fs_basictypes_c.h"
#include "include/fs_common_c.h"
#include "include/fs_pdfdoc_c.h"
#include "include/fs_pdfpage_c.h"
#include "include/fs_render_c.h"
// file_name is PDF document which includes wrapper data.
FS_PDFDOC_HANDLE doc;
FSDK_PDFDoc_Create0(input_file, &doc);
FSErrorCode code = FSDK_PDFDoc_Load(doc_wrapper, NULL);
if (e_FSErrSuccess) {
FSDK_PDFDoc_Release(doc);
return false;
}
FS_BOOL return_iswrapper;
FSDK_PDFDoc_IsWrapper(doc, &return_iswrapper);
if(!return_iswrapper){
return false;
}
FS_INT64 offset;
FSDK_PDFDoc_GetWrapperOffset(doc, &offset);
FileReader file_reader(offset);
file_reader.LoadFile(file_name);
...
java
import com.foxit.sdk.common.fxcrt.FileReaderCallback;
import com.foxit.sdk.pdf.PDFDoc;
import com.foxit.sdk.pdf.WrapperData;
...
PDFDoc doc = new PDFDoc(file_name);
int code = doc.load(null);
if (code != e_ErrSuccess) {
return;
}
if (!doc.isWrapper()) {
return;
}
int offset = doc.getWrapperOffset();
FileReader file_reader = new FileReader(offset);
file_reader.LoadFile(file_name);
PDFDoc doc_real = new PDFDoc(file_reader, false);
code = doc_real.load(null);
if (code != e_ErrSuccess) {
return;
}
...
py
import sys
import site
if sys.version_info.major == 2:
_PYTHON2_ = True
else:
_PYTHON2_ = False
if _PYTHON2_:
#replace with the python2 lib path
site.addsitedir('../../../')
from FoxitPDFSDKPython2 import *
else:
from FoxitPDFSDKPython3 import *
# file_name is PDF document which includes wrapper data.
doc = PDFDoc(file_name)
code = doc.Load()
if code != e_ErrSuccess:
return False
if not doc.IsWrapper():
return False
offset = doc.GetWrapperOffset()
file_reader = FileReader(offset)
file_reader.LoadFile(file_name)
...
objc
#include "FSPDFObjC.h"
...
FSPDFDoc *doc = [[FSPDFDoc alloc] initWithPath:file_name];
FSErrorCode code = [doc load:nil];
if (code != FSErrSuccess) {
return -1;
}
if (![doc isWrapper]) {
return -1;
}
long long offset = [doc getWrapperOffset];
FSFileRead *file_reader = [[FSFileRead alloc] initWithSourceFilePath:file_name offset:offset];
FSPDFDoc *doc_real = [[FSPDFDoc alloc] initWithFile_read:file_reader is_async:NO];
code = [doc_real load:nil];
if (code != FSErrSuccess) {
return -1;
}
...
js
const FSDK = require("@foxitsoftware/foxit-pdf-sdk-node");
// file_name is PDF document which includes wrapper data.
let doc = new FSDK.PDFDoc(file_name);
let code = doc.Load("");
if (code != FSDK.e_ErrSuccess) {
return false;
}
if(!doc.IsWrapper()){
return false;
}
let offset = doc.GetWrapperOffset();
let file_reader = new FileReader(offset);
file_reader.LoadFile(file_name);
let reader_callback = new FSDK.FileReaderCallback(file_reader);
...
csharp
using foxit;
using foxit.common;
using foxit.common.fxcrt;
using foxit.pdf;
using foxit.pdf.graphics;
using foxit.pdf.objects;
// Assuming PDFDoc doc has been loaded.
// file_name is PDF document which includes wrapper data.
PDFDoc doc = new PDFDoc(file_name);
ErrorCode code = doc.Load(null);
if (code != ErrorCode.e_ErrSuccess)
{
return;
}
if (!doc.IsWrapper())
{
return;
}
long offset = doc.GetWrapperOffset();
FileReader file_reader = new FileReader(offset);
file_reader.LoadFile(file_name);
...