3

我正在开发一个使用 PDF 模板的项目。

我想知道是否可以将 PDF 文件存储为二进制文件,然后在稍后阶段从二进制数据重新创建 PDF?

我希望这可以帮助节省空间,而不是在项目中附加 PDF 文件,将其存储为数据就足够了。

任何对解决方案的见解将不胜感激。

提前致谢

4

1 回答 1

3

我非常怀疑您是否会为此节省任何空间,因为您将需要一些代码来“取消存储”作为 PDF 的数据 - 它可能不会占用太多空间,但它可能是可执行文件中的一些字节。此外,PDF 已经被压缩,因此您不会从任何形式的压缩或您可能想到使用的压缩中获得太多收益。

一个关于“某物能变小多少”的简单实验是将其打包成一个 zip 文件。如果事实证明它的大小相同或稍大,那么它已经被压缩了。

使用某种“二进制转储”程序(可能需要编写一些代码,或拼凑一个脚本,或两者兼而有之),您可以通过使用以下内容在程序中拥有一个大的二进制 blob:

数据字节(十六进制 - 只是一个示例,不是 PDF):

 01 3E 78 28 41 FF EE AA ... 

C/C++ 风格的数据:

 unsigned char data[] =
  "\001>x(A\377\356\252";

长行可以/必须被拆分,如下所示:L

 unsigned char data[] =
  "\001>x(A\377"
  "\356\252";

您可能会发现这不起作用,因为编译器对字符串有最大大小 - 大多数现代编译器将限制设置得相当高,但标准没有(从内存中,字符串常量的大小约为 8KB),如果您以高警告级别编译,编译器可能会警告“此字符串可能不适用于所有编译器”或类似的东西。

根据值的组合,它可能会更好:

 unsigned char data[] = 
 { 1, 62, 120, 40, 255, 238, 170 }; 

(从 soruce 大小的角度来看,这些空间不是必需的,因此可以通过删除这些空间来使代码更小 - 至少 20%。为了便于阅读,我将它们保留了下来)

您必须进行试验才能找到更有效的方法。但无论如何,它都会比原文占用更多的空间。如果它主要是文本,则不会很大。如果它是“真正的二进制数据”,它会明显更大。

一个快速的谷歌发现了这个: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ ka10382.html 它似乎链接到一个程序,该程序执行“二进制到C数据”翻译。

将二进制数据提取到无符号字符数组中的代码:

#include <fstream>
#include <iostream>
#include <iomanip>
#include <cstdlib>

void usage()
{
    std::cerr << "bintoc infile outfile" << std::endl;
}

int main(int argc, char **argv)
{
    if (argc != 3)
    {
    std::cerr << "Incorrect number of arguments..." << std::endl;
    usage();
    exit(1);
    }

    std::ifstream in(argv[1], std::ios::binary);
    std::ofstream out(argv[2]);


    if (!in)
    {
    std::cerr << "Could not open " << argv[1] << std::endl;
    exit(1);
    }

    if (!out)
    {
    std::cerr << "Could not open " << argv[1] << std::endl;
    exit(1);
    }

    unsigned char buffer[16];

    out << "unsigned char data[] = " << std::endl << "{" << std::endl;;
    while(in.read(reinterpret_cast<char *>(buffer), sizeof(buffer)))
    {
    for(int i = 0; i < in.gcount(); i++)
    {
        out <<  std::setw(3) << static_cast<unsigned int>(buffer[i]) << ", ";
    }
    out <<  std::endl;
    }
    out << "};" << std::endl;

    return 0;
}
于 2013-05-27T08:32:55.217 回答