我正在使用PDFium,并且成功创建了子类型FPDF_ANNOT_TEXT和FPDF_ANNOT_HIGHLIGHT的注释。
它们在Chrome,Opera,Microsoft Edge,Adobe Acrobat Reader,Foxit Reader中都能很好地显示,但在Mozilla Firefox(使用PDF.js)中却完全不显示。问题似乎是因为PDF.js要求/ AP条目(外观流)才能呈现注释 [PDF Reference 1.7第606页。]
这是PDF.js [https://github.com/mozilla/pdf.js/issues/6810]的一个已知问题,但是,如问题报告中所述,“…/ AP在PDF 2.0中是必需的,除了弹出,投影或链接...”。
此条目在PDF版本1.7中仍然是可选的,但我希望能够将其添加到我的注释中。我在PDFium文档和各种博客中进行了大量研究,但没有找到任何可靠的解决方案。
在PDFium FPDF_annot.h中,有一个FPDFAnnot_SetAP()方法可在注释的字典中添加外观字符串,但是我找不到任何有关如何格式化作为第三个参数传递的字符串的文档。 在他们的fpdf_annot_embeddertest.cpp中,有关于如何设置和获取/ AP条目的示例,但它们仅仅是为了测试方法的功能而不是生成有效的PDF输出的示例。
任何人都有使用PDFium库使用/ AP条目创建注释的经验,可以带我进入一个功能简单的示例,使我的注释符合PDF 2.0规范(以及Mozilla Firefox问题)?
这是我到目前为止使用PDFium创建突出显示注释的代码段:
int main(int argc, char *argv[])
{
FPDF_InitLibrary();
FPDF_STRING test_doc = "myTest.pdf";
FPDF_DOCUMENT doc = FPDF_LoadDocument(test_doc, NULL);
if (!doc) {
qWarning() << " error loading PDF file";
return 1;
}
FPDF_PAGE page = FPDF_LoadPage(doc, 0);
if (!page) {
qWarning() << " error loading first page";
return 1;
}
FPDF_ANNOTATION highlightAnnot = FPDFPage_CreateAnnot(page, FPDF_ANNOT_HIGHLIGHT);
if (highlightAnnot) {
// Set the annotation rectangle.
FS_RECTF rect;
rect.left = 72;
rect.bottom = 504;
rect.right = 132;
rect.top = 520;
if(!FPDFAnnot_SetRect(highlightAnnot, &rect)) {
qWarning() << " error in FPDFAnnot_SetRect()";
}
// When using AP this function should not be used. See doc in FPDF_annot.h
if(!FPDFAnnot_SetColor(highlightAnnot, FPDFANNOT_COLORTYPE_Color, 255, 255, 0, 255)) {
qWarning() << " error in FPDFAnnot_SetColor()";
}
// Append a new set of quadpoints.
FS_QUADPOINTSF new_quadpoints;
new_quadpoints.x1 = 72.f;
new_quadpoints.y1 = 520.f;
new_quadpoints.x2 = 132.f;
new_quadpoints.y2 = 520.f;
new_quadpoints.x3 = 72.f;
new_quadpoints.y3 = 504.f;
new_quadpoints.x4 = 132.f;
new_quadpoints.y4 = 504.f;
if(!FPDFAnnot_AppendAttachmentPoints(highlightAnnot, &new_quadpoints)) {
qWarning() << " error FPDFAnnot_AppendAttachmentPoints()";
}
}
FPDF_ClosePage(page);
// writing file with FPDF_SaveAsCopy()
...
FPDF_DestroyLibrary();
return retCode;
}