Free Support Forum - aspose.com

Aspose.Words C++ 20.10, 如何把System::IO::MemoryStream转成我们自己的类型,比如vector<unsigned char>,

您好,我正在使用Aspose.words C++ linux 20.10, 将words保存成jpg的功能,但是我不想生成文件,想用内存数组去存数据,然后将数据进行base64转换。现在该如何将System::IO::MemoryStream转成vector呢?部分代码如下
auto doc1 = System::MakeObject(System::String("./2pages.docx"));

    auto options = System::MakeObject<Aspose::Words::Saving::ImageSaveOptions>(Aspose::Words::SaveFormat::Jpeg);

    options->set_PageCount(1);

    // Save each page of the document as Jpeg.
    std::cout << "page: " << doc1->get_PageCount() << std::endl;
    for (int i = 0; i < doc1->get_PageCount(); i++)

    {

            options->set_PageIndex(i);
            auto dstStream = System::MakeObject<System::IO::MemoryStream>();

            std::string dest;


            doc1->Save(dstStream, options);
            base64_encode(dstStream->ToArray(),dest);
    }

@pangchendong,

我们已将您的要求记录在我们的问题跟踪系统中。 您的票号是WORDSCPP-1032。 我们将进一步调查此要求的详细信息,并让您随时了解链接问题的状态。

@pangchendong,

有两种方法可以实现此目的:

1 MemoryStream::ToArray() - 它创建内存流内部缓冲区的副本:

auto buffer = dstStream->ToArray();
base64_encode(buffer->data(), dest);

2 MemoryStream::GetBuffer() - 它返回对内存流内部缓冲区的引用,但返回的缓冲区大于实际内存流内容。

auto internal_buffer = dstStream->GetBuffer();
base64_encode(internal_buffer->data(), dstStream->get_Length(), dest);

第一种解决方案更易于使用,但是会消耗更多的内存(它会分配其他向量)。

非常感谢,我用第一种方法解决了问题。但在项目中对aspose库的使用比较困难。例如我要把一个图片的vector数组转成aspose的document类型,必须先将vector转化为aspose的流类型,才能转化为document类型。而这文档是没有对应的例子。还有一个问题,aspose 20.10是用C++哪个标准实现的,c++11或者更新的标准,这个关乎到我的项目是否兼容的问题。

@pangchendong,

Aspose.Words for C ++使用C ++ 14标准,因为它取决于在C ++ 11中不起作用的模板功能。

你好,我在使用c++库的时候,存在内存泄露,但是我不确定是库的问题,还是我忘记调用aspose的释放内存的接口了。能否告知我没有调用哪个接口? 代码如下
startTime = clock();

apply_license_from_file();


endTime = clock();


base64_string_vec.clear();

std::cout << "the size of vec: " << base64_string_vec.size() << std::endl;

std::cout << "apply_license cost: " << (double)(endTime-startTime)/CLOCKS_PER_SEC << "s" << std::endl;



startTime = clock();


System::ArrayPtr<uint8_t> Bytes =  System::MakeArray<uint8_t>(word_body);

auto byteStream = System::MakeObject<System::IO::MemoryStream>(Bytes);

auto doc = System::MakeObject<Document>(byteStream);

byteStream->Close();

auto options = System::MakeObject<Aspose::Words::Saving::ImageSaveOptions>(Aspose::Words::SaveFormat::Jpeg);

auto dstStream = System::MakeObject<System::IO::MemoryStream>();

options->set_PageCount(1);
options->set_Resolution(resolution);


for (int i = 0; i < doc->get_PageCount(); i++)
{

    options->set_PageIndex(i);

    std::string dest;


    doc->Save(dstStream, options);

    base64_encode(dstStream->ToArray()->data(),dest);
    //doc->Save(System::String("./des/" + std::to_string(i) + ".jpg"), options);
    
   base64_string_vec.push_back(dest);

}

dstStream->Close();

endTime = clock();

std::cout << "buf to jpg to base64 cost: " << (double)(endTime-startTime)/CLOCKS_PER_SEC << "s" << std::endl;

return 0;

@pangchendong,

请ZIP并将您输入的Word文档(您遇到此问题)上传到此处进行测试。 然后,我们将对此进行调查,并为您提供更多信息。

Here is the demo with source code.
链接: https://pan.baidu.com/s/1pbFvLnPRHYAm8tqR_lh04w 提取码: qi8k 复制这段内容后打开百度网盘手机App,操作更方便哦

Sorry, pls follow this link 链接: https://pan.baidu.com/s/1X9S8O-BgVw3pkxuOtxm9hQ 提取码: v4hg 复制这段内容后打开百度网盘手机App,操作更方便哦

@pangchendong,

恐怕您共享的两个链接都无法正常工作。 我们无法找到/下载您共享的文件。 请查看以下屏幕截图。404 error.png (17.8 KB)

您可以将文档压缩并附加到该论坛中。 如果您的.zip文件大小大于此论坛中的附件限制,则可以将ZIP文件上传到Dropbox或Google驱动器或任何其他文件托管服务,并在此处共享下载链接进行测试。

我把代码放在gitlab上了,这是链接地址https://gitlab.com/chendong.pang/demo_aspose_test

@pangchendong,

我们已在问题跟踪系统中记录了此问题。 您的票号是WORDSCPP-1035。 我们将进一步调查该问题的详细信息,并将使您随时了解链接问题的状态。 很抱歉给您带来不便。

这个问题有任何进展吗,能否告知一下

能否告知一下这个问题的进展?

@pangchendong,

不幸的是,WORDSCPP-1035尚未解决。 此问题当前正在等待分析,正在排队。 目前没有估算值。 在以后的Aspose.Words for C ++版本中解决此问题后,我们会通过此论坛线程通知您。 对于给您带来的不便,我们深表歉意。