【问题标题】:how to create a pdf file contain different layers [closed]如何创建包含不同图层的pdf文件[关闭]
【发布时间】:2013-01-23 07:52:13
【问题描述】:

我的意思是使用 c 或 c++ 库。操纵。以前我使用cairo lib,成功创建pdf文件,但没有图层。现在我想创建具有多个图层的 pdf 文件。

谢谢

【问题讨论】:

  • 您希望 有什么行为? PDF 不明确支持相互堆叠的独立图形空间。不过,它确实知道可选内容组(可以动态可见或不可见的图形集合)。此外,它允许一个页面的多个内容流,您可以尝试通过使用 q 和 Q 运算符保持彼此独立。
  • 我的目标就像你说的可以控制图层的可见或不可见。能详细解释一下吗?
  • 我只能指向 PDF 规范 ISO 32000-1:2008,第 8.11.2 节 可选内容组。我不知道哪些 C++ 库支持它们,但 OCG 支持 是您必须注意的。

标签: c++ pdf layer


【解决方案1】:

您可以创建(也可以阅读和编辑)PDF 图层(也知道可选内容组),如PDFLayers 示例中所示,该示例也包含在PDFNet SDK 中。

以下是相关代码:

    PDFNet.Initialize();
    PDFDoc doc;

    // Create three layers...
    OCG::Group image_layer = CreateLayer(doc, "Image Layer");
    OCG::Group text_layer = CreateLayer(doc, "Text Layer");
    OCG::Group vector_layer = CreateLayer(doc, "Vector Layer");

    // Start a new page ------------------------------------
    Page page = doc.PageCreate();

    ElementBuilder builder; // ElementBuilder is used to build new Element objects
    ElementWriter writer;   // ElementWriter is used to write Elements to the page  
    writer.Begin(page);     // Begin writing to the page

    // Add new content to the page and associate it with one of the layers.
    Element element = builder.CreateForm(CreateGroup1(doc, image_layer.GetSDFObj()));
    writer.WriteElement(element);

    element = builder.CreateForm(CreateGroup2(doc, vector_layer.GetSDFObj()));
    writer.WriteElement(element);

    // Add the text layer to the page...
    if (false)  // set to true to enable 'ocmd' example.
    {
        // A bit more advanced example of how to create an OCMD text layer that 
        // is visible only if text, image and path layers are all 'ON'.
        // An example of how to set 'Visibility Policy' in OCMD.
        Obj ocgs = doc.CreateIndirectArray();
        ocgs.PushBack(image_layer.GetSDFObj());
        ocgs.PushBack(vector_layer.GetSDFObj());
        ocgs.PushBack(text_layer.GetSDFObj());
        OCG::OCMD text_ocmd = OCG::OCMD::Create(doc, ocgs, OCG::OCMD::e_AllOn);
        element = builder.CreateForm(CreateGroup3(doc, text_ocmd.GetSDFObj()));
    }
    else {
        element = builder.CreateForm(CreateGroup3(doc, text_layer.GetSDFObj()));
    }
    writer.WriteElement(element);

    // Add some content to the page that does not belong to any layer...
    // In this case this is a rectangle representing the page border.
    element = builder.CreateRect(0, 0, page.GetPageWidth(), page.GetPageHeight());
    element.SetPathFill(false);
    element.SetPathStroke(true);
    element.GetGState().SetLineWidth(40);
    writer.WriteElement(element);

    writer.End();  // save changes to the current page
    doc.PagePushBack(page);

    // Set the default viewing preference to display 'Layer' tab.
    PDFDocViewPrefs prefs = doc.GetViewPrefs();
    prefs.SetPageMode(PDFDocViewPrefs::e_UseOC);

    doc.Save("my.pdf", SDFDoc::e_linearized, 0);

注意:我是 PDFNet 开发人员。

【讨论】:

  • 谢谢,这是试用版。以前的版本可能需要商业许可。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
相关资源
最近更新 更多