我正在开发一个使用PDF模板的项目。
我想知道是否可以将PDF文件存储为二进制文件,然后在二进制数据的后期重新创建PDF?
我希望这有助于节省空间,而不是必须在项目中附加PDF文件,将其存储为数据就足够了。
非常感谢对解决方案的任何见解。
提前致谢
答案 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;
}