Как сохранить файл PDF как двоичный

Вопрос:Я работаю над проектом, который использует шаблон PDF. Мне было интересно, возможно ли сохранить файл PDF в виде двоичного файла, а затем воссоздать PDF на более позднем этапе из двоичных данных? Я надеялся, что это поможет сэкономить место, вместо того, чтобы прикрепить файл PDF к проекту, было бы гораздо более удобно хранить его как данные.

Вопрос:

Я работаю над проектом, который использует шаблон PDF.

Мне было интересно, возможно ли сохранить файл PDF в виде двоичного файла, а затем воссоздать PDF на более позднем этапе из двоичных данных?

Я надеялся, что это поможет сэкономить место, вместо того, чтобы прикрепить файл PDF к проекту, было бы гораздо более удобно хранить его как данные.

любое понимание решения было бы очень оценено.

Заранее спасибо

Лучший ответ:

Я очень сомневаюсь, что вы сохранили бы на нем любое пространство, так как вам понадобится какой-то код для “нераспределения” данных, который является PDF файлом, – он может не занимать MUCH-пространство, но, вероятно, это НЕКОТОРЫЕ байты в ваш исполняемый файл. Добавьте к этому, что PDF уже сжат, поэтому вы не получите большой выигрыш от любой формы сжатия или некоторых таких, которые вы можете придумать.

Простым экспериментом относительно того, “насколько меньше чего-то получается”, является его упаковка в zip файле. Если окажется, что он того же размера или немного больше, то он уже сжат.

Используя программу “двоичного дампа” (возможно, потребуется либо написать какой-то код, либо объединить вместе script, либо и то и другое), вы можете иметь большой двоичный код в программе, используя что-то вроде этого

Байты данных (в шестнадцатеричном виде – только образец, а не PDF):

01 3E 78 28 41 FF EE AA …

Данные в стиле C/С++:

unsigned char data[] = «01>x(A377356252»;

Длинные линии могут/должны быть разбиты, например: L

unsigned char data[] = «01>x(A377» «356252»;

Вы можете обнаружить, что это не работает, потому что у компилятора максимальный размер для строк – большинство современных компиляторов устанавливают этот предел достаточно высоким, но стандарт не имеет (из памяти он составляет около 8 КБ как размер строки константа), и если вы компилируете с высокими уровнями предупреждений, компилятор может предупредить: “Эта строка может не работать для всех компиляторов” или что-то в этом роде.

В зависимости от сочетания значений это может быть лучше:

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

(С точки зрения размера сорса пробелы не требуются, поэтому код может быть уменьшен до меньшего размера – не менее 20% – удалив их. Я сохранил их для удобочитаемости)

Вам нужно поэкспериментировать, чтобы найти более эффективную. Но независимо от того, что будет занимать больше места, чем исходный текст. Если это в значительной степени текст, не намного больше. Если это “действительно двоичные данные”, это будет заметно больше.

Быстрый поиск Google:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka10382.html
который, как представляется, ссылается на программу, которая выполняет перевод “двоичных данных на C”.

Код для извлечения двоичных данных в массив без знака 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; }

Оцените статью
Добавить комментарий