Каковы различные подходы для создания PDF-файлов? - PullRequest
2 голосов
/ 31 декабря 2010

У меня есть идея для приложения, которое будет брать некоторый флэш-контент, который содержит графику и изображения, такие как различные геометрические фигуры и многоугольники, и несколько случайных изображений, и конвертировать их в PDF.для использования несколькими пользователями я хочу, чтобы этот процесс был быстрым и масштабируемым.Одно возможное решение, о котором я мог бы подумать, - это маленький флэш-клиент с возможностью сборки вышеупомянутой графики и изображений.Сгенерируйте какой-нибудь XML, отправьте его на сервер, на котором запущен процесс Java, который может отрисовывать PDF с помощью iText.

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

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

  1. Нет ограничений на Flash-клиент, потому что механизм рендеринга PDF.
  2. Масштабируемость для нескольких пользователей
  3. Скорость и эффективность
  4. Наименьшее количество сериализации / десериализации

Буду признателен, если вы поделитесь своей идеей технологического стека.Большое спасибо!

PS: Я был бы признателен, если бы вы не увязли в моем Flash >> XML >> Java подходе.Я считаю, что это один из многих подходов, которые могут быть приняты.

Ответы [ 4 ]

3 голосов
/ 31 декабря 2010

Если вариант создания PDF в браузере с использованием Flash - вариант, рассмотрите возможность использования AlivePdf.Если нет, то посмотрите XSL: FO, мы используем его для преобразования на стороне сервера в PDF.

1 голос
/ 31 декабря 2010

Существует pdflib для PHP и FPDF (также для PHP).

1 голос
/ 31 декабря 2010

Я считаю, что iText генерирует PDF-файлы в коде Java. Он может использовать или не использовать XML в качестве источника данных; POJOs будут делать то же самое.

Другой способ - XSL-FO. Требуется источник данных XML и таблица стилей XSL-FO для преобразования XML и создания PDF. Apache Xalan (или любая другая библиотека XSL-T) может сделать это за вас.

«Быстрый» и «масштабируемый» может потребовать большего, чем эти. Загрузка большого количества изображений - это процесс, который имеет свои временные рамки и оптимизации, которые не имеют ничего общего с PDF-файлами.

0 голосов
/ 31 декабря 2010

То есть вы также готовы рассмотреть других клиентов?Похоже, у вас есть приложение для рисования для детей, и вы хотите сгенерировать что-то, что сохранит состояние их рисунка на данный момент.

Посмотрим правде в глаза, XML не так эффективен.Это не его цель.Он может быть читаем как на компьютере, так и на человеке, проверяется и т. Д. И т. Д.

Вместо этого, как насчет веб-страницы на основе <Canvas>, которая отправляла состояние этого холста на сервер в JSON (меньше байтов и меньше работы для сборки)их).Сервер может тогда работать на любой адской библиотеке / языке, который он хочет.Множество библиотек JSON-> my-language.

Ваш выбор в библиотеках PDF будет ограничен только тем, что установлено на вашем сервере.Вы также сказали, что хотите сделать как можно меньше чтения / записи.

Наиболее эффективной из возможных настроек будет иметь частичный PDF-файл только для чтения, уже загруженный в память с учетом минимальных последствий изменений холста (включаяизображений).Каждый сеанс будет дублировать этот частичный PDF, преобразовывать графические команды JSON в PDF и сохранять PDF.

Чтобы минимизировать структурные изменения в PDF, вам необходимо использовать встроенные изображения.Отсутствие новых объектов в PDF означает, что вам вообще не нужно менять таблицу перекрестных ссылок (пока вы не добавите шрифты или не захотите повторно использовать существующее изображение).Вы могли бы создать словарь "информация о документе", дополненный определенным количеством пробелов между объектами, чтобы вы могли заполнить его, не изменяя смещения байтов (что заставило бы вас пересчитывать таблицу внешних ссылок).

Вы можете илиможет не нужно возиться с размером страницы ... мы просто говорим здесь об одной странице, верно?

Так что PDF будет выглядеть примерно так ...

%%PDF-1.6
<3-4 random high order bytes to convince folks that we're a binary stream>
1 0 obj
<</Type/Catalog/Pages 2 0 R>>
endobj
2 0 obj
<</Type/Pages/Count 1/Kids[3 0 R]>>
endobj
3 0 obj
<</Type/Page/Contents 4 0 R/MediaBox[0 0 612 792]/Parent 2 0 R>>
endobj
5 0 obj
<</Type/DocInfo/Author()  --<insert big whitespace gap here>-- 
/Title() --<ditto>--
/Subject() --<ditto>--
/Keywords() --<ditto>--
/Creator(My app's Name)
/Producer(My pdf library's name)
/CreationDate(encodedDateWhenThisTemplateWasBuilt) D:YYYYMMDDHHMMSS-timeZoneOffset
/ModDate() --<another, smaller whitespace gap>--
>>
4 0 obj
<</Filter/SeveralDifferentFiltersAvailable/Length --<byte length of the stream in this file>-->>
stream

И вашШаблон останавливается там.У вас будет похожий шаблон «конец PDF», который будет выглядеть примерно так:

endstream
endobj
xref
0 6
0000000000 65535 f 
0000000010 00000 n
0000000025 00000 n
0000000039 00000 n
0000000097 00000 n
0000000050 00000 n
trailer
<</Root 1 0 R/Size 6/Info 5 0 R>>
startxref
--<some white space>--
%%EOF

Столбцы чисел в конце неверны.Первый столбец - это смещение в байтах этого конкретного объекта (и я не собираюсь считать байты только сейчас, спасибо).Второй столбец в значительной степени не имеет значения.

Приложение для заполнения PDF должно знать:

  1. Смещение байтов всего, что вы намереваетесь заполнить в первом шаблоне.
    1. Все поля «doc info», которые, кстати, не являются обязательными.Ключ / Info и словарь, на который он указывает, являются необязательными в этом отношении.Вы можете дернуть их, если хотите.
    2. ключ / Length потока контента.Это должна быть длина байта пост-фильтра самого потока.
  2. Как преобразовать JSON в команды рисования pdf.Если вы хотите немного обмануть, вы можете использовать класс PdfContentByte iText [Sharp], использовать его команды рисования, а затем получить готовый поток байтов и вставить его в свой PDF.Убедитесь, что вы используете встроенные изображения или вся эта схема идет прямо в окно.Возможно, есть и другие библиотеки, которые вы могли бы аналогичным образом обработать, если бы почувствовали необходимость.Или вы можете просто прочитать спецификации PDF и свернуть свои собственные.Вы будете придерживаться довольно ограниченного подмножества синтаксиса содержимого PDF.
  3. Смещение в байтах слова "xref" от начала файла.Вы можете рассчитать это: LengthOfInitialTemplate + LengthOfContentStream + OffsetFromStartOf2ndTemplateTo'xref '.
  4. Смещение в байтах строки ниже «startxref», где вы пишете выше вычисленное смещение байтов «xref»

Вы не станете намного эффективнее этого.Вы бы прочитали в своих шаблонах один раз.Считайте / рассчитайте смещение байтов, которое вам нужно один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...