如何将pdf文件存储为二进制文件

时间:2013-05-27 08:29:02

标签: c++

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

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

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

非常感谢对解决方案的任何见解。

提前致谢

1 个答案:

答案 0 :(得分:3)

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

一个简单的实验是“将某些东西变得更小”是将其打包成一个zip文件。如果事实证明它的大小相同或略大,那么它已经被压缩了。

使用某种类型的“二进制转储”程序(可能需要编写一些代码,或者拼凑一个脚本,或两者兼而有之),你可以使用类似的东西在程序中拥有一个大的二进制blob: / p>

数据字节(十六进制 - 只是一个样本,而不是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 }; 

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

你必须尝试找出更有效的方法。但无论如何,它将占用比原始文本更多的空间。如果它主要是文本,而不是更大。如果它是“真正的二进制数据”,它将明显变大。

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

将二进制数据提取到unsigned char数组的代码:

#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;
}