Что хороший PDF к преобразователю HTML для Ruby on Rails? [закрытый]

Я пытаюсь преобразовать программно PDF в HTML. До сих пор я использовал pdftohtml, но наши пользователи не довольны результатами.

Вот то, в чем я нуждаюсь:

  • Я использую Ruby on Rails, но любой инструмент, работающий над Unix, работал бы, как я могу назвать его из командной строки. Но конечно хороший драгоценный камень или плагин были бы прекрасны.

  • Я предпочел бы, чтобы это было открытым исходным кодом

  • Это должно быть в состоянии изображения дескриптора

  • Было бы хорошо, если бы была опция отбросить изображения в случае необходимости

  • Это должно быть стабильно

  • Это должно возвратить HTML с расположением близко к исходному PDF (я попробовал pdftohtml, и результат не настолько хорош в большом количестве случаев),

13
задан marcgg 14 December 2009 в 11:40
поделиться

7 ответов

Вот еще пара альтернатив pdftohtml/xpdf:

  • У Adobe есть бесплатный онлайн сервис преобразования PDF в HTML или текст . Может потребоваться минута или две, чтобы получить документ обратно, но я подозреваю, что этот вариант даст вам наилучшие результаты.
  • Существует pdf-reader рубиновый драгоценный камень, который даст вам доступ к внутреннему содержимому PDF-файла. Это будет включать в себя некоторые разработки/расширения с вашей стороны, но вы можете использовать это, чтобы разобрать PDF файл и генерировать красивый HTML. Это может быть проще, чем кажется, если вы заранее знаете, какие типы файлов ваши пользователи конвертируют (например, если они работают со стандартизованными формами).
  • У вас может быть больше вариантов, если вы используете ghostscript (gem найден здесь), чтобы сначала конвертировать PDF в другой формат. Гемм может генерировать изображения (png, jpg и т.д.) из PDF файла, но вы, возможно, повезет, преобразуя его в файл PostScript, так как там, кажется, миллион "PostScript-to-[вставить формат здесь]" преобразователей.
11
ответ дан 1 December 2019 в 22:39
поделиться

Если все остальное не удается, вы можете превратить каждую страницу в изображение (с помощью магического изображения или аналогичного) и вывести на экран изображения, а-ля http://books.google.com или http://safari.oreilly.com. Это будет полоса пропускания, но вы получите верность оригиналу.

.
3
ответ дан 1 December 2019 в 22:39
поделиться

Попробуйте использовать попплер или xpdf. Но для этого нужна какая-то магия и привязка.

0
ответ дан 1 December 2019 в 22:39
поделиться

Это не самый красивый список, но вы можете посмотреть на .installed.cfg в каталоге buildout.

Для каждой детали отображаются опции, о которых она знает. (Почему-то несколько частей часто показываются несколько раз).

-121--4196167-

Поскольку вы отметили это как C++, стоит отметить, что существует несколько лучший способ, чем макрос в стиле C:

template <class T, size_t N>
size_t countof(const T &array[N]) { return N; }

Это имеет то преимущество, что если вы случайно попытаетесь передать ему что-то, кроме массива, код просто не будет компилироваться (тогда как передача указателя на макрос C будет компилировать, но произведет плохой Недостаток заключается в том, что это не дает вам постоянной времени компиляции, поэтому вы не можете сделать что-то подобное:

int a[20];

char x[countof(a)];

В C++ 11 или более поздней версии можно добавить constexpr , чтобы получить константу времени компиляции:

template <class T, size_t N>
constexpr size_t countof(const T &array[N]) { return N; }

Если вы действительно хотите поддерживать то же самое на старых компиляторах, есть способ, первоначально придуманный Иваном Джонсоном, AFAIK:

#define COUNTOF(x)  (                                           \
  0 * sizeof( reinterpret_cast<const ::Bad_arg_to_COUNTOF*>(x) ) +  \
  0 * sizeof( ::Bad_arg_to_COUNTOF::check_type((x), &(x))      ) +  \
  sizeof(x) / sizeof((x)[0])  )                                  


class Bad_arg_to_COUNTOF
{
public:
   class Is_pointer;
   class Is_array {};  
   template<typename T>
   static Is_pointer check_type(const T*, const T* const*);
   static Is_array check_type(const void*, const void*);
};

Используется значение sizeof (x )/sizeof (x [0]) для вычисления размера, как это делает макрос C, поэтому он дает постоянную времени компиляции. Разница в том, что сначала используется магия шаблона, чтобы вызвать ошибку компиляции, если переданное вами имя не является именем массива. Это происходит путем перегрузки check_type, чтобы вернуть неполный тип для указателя, но полный тип для массива. Тогда (действительно сложная часть) она вообще не вызывает эту функцию - она просто принимает размер типа, который функция возвращает, который равен нулю для перегрузки, которая возвращает полный тип, но не допускается (принудительная ошибка компиляции) для неполного типа.

IMO, это довольно классный пример метапрограммирования шаблонов - хотя во всей честности, результат своего рода бессмысленен. Этот размер действительно необходим только в качестве постоянной времени компиляции, если используются массивы, чего обычно следует избегать в любом случае. Используя std:: vector , можно задать размер во время выполнения (и при необходимости изменить размер вектора).

-121--1205877-

Я потратил некоторое время на работу над исследовательским проектом, который включал в себя использование PDF-файлов в качестве входных данных. То, что вы просите, это просто очень сложная задача, и ни одно программное обеспечение не сделает это идеально. В то время как HTML имеет некоторую структуру, как < p > , PDF является чисто презентационным. В HTML-документе будет написано: "Это абзац. Это изображение ". и представление интерпретируется из этого. В документе PDF по существу будет сказано: "Этот символ должен быть визуализирован в позиции X, Y. этот следующий символ будет визуализирован в положении "... и т.д. Так что даже построить абзацы из этого может быть трудно.

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

Возможно ли, что вы можете работать с другим форматом или снизить свои ожидания? Ты мог бы сделать то, что предлагает Уэйн,но тогда это не на самом деле HTML (и это не доступно - это забота для вас?). Это может быть просто то, с чем ты живешь.

2
ответ дан 1 December 2019 в 22:39
поделиться
4781837-

Вы можете попробовать http://www.pdf-to-html-word.com/pdf-to-html который работает действительно хорошо. Я заплатил за это после проверки его функциональности. У вас есть бесплатная поездка, чтобы проверить его. Или используйте Acrobat Pro и сохранить как HTML с CSS. Это тоже работает. Но это боль в **, чтобы сделать с кучей файлов.

0
ответ дан 1 December 2019 в 22:39
поделиться

Можете попробовать. Я сделал первый шаг, обернув Ruby вокруг утилиты pdftohtml. Gem доступен здесь: http://gemcutter.org/gems/pdftohtmlr

0
ответ дан 1 December 2019 в 22:39
поделиться

mysql эквивалент верхнего и вы можете найти больше о LIMIT в MySql Doc

-121-2321892-

(1) Обычно это позволяет поддерживать бизнес логику и пользовательский интерфейс отдельно. Это также позволяет позже иметь, например, как интерфейс пользователя SaaS на основе браузера, так и режим локальной сетевой работы в стиле рабочего стола и по-прежнему совместно использовать весь логический код приложения.

(2) Отказ от использования сокетов TCP/IP. Обычно приложение и GUI осуществляют связь с использованием передачи событий и/или сообщений. Например, когда приложение хочет уведомить GUI о том, что что-то происходит, оно создает синтетическое событие, которое затем перемещается в очередь событий GUI. Если приложение также основано на событиях, графический интерфейс пользователя может взаимодействовать с ним, размещая события. Для неблокировочных быстрых операций GUI может вызвать логический код приложения напрямую, но тогда вызов должен быть гарантированно возвращен быстро. Для более медленных операций для их обработки в любом случае необходим отдельный поток. Этот поток может быть тем, который обрабатывает события на стороне приложения, или при необходимости его можно создать как рабочий поток.

Продукт нашей компании имеет пользовательский интерфейс поверх Eclipse IDE, но часть логики приложения написана на C++. Эти две части взаимодействуют по CORBA, т.е. в основном по асинхронному механизму событий. Мы были довольны этим решением.

В меньшем масштабе приложения GUI обычно разделяют пользовательский интерфейс и логику приложения, используя абстракции, такие как модель-ракурс-контроллер (MVC).

(3) Всегда трудно интегрировать компоненты, написанные в два разных компонента. Я думаю, что вы должны это сделать, только если у вас есть очевидное преимущество платформы. Например, мы получаем выгоду от компонентов IDE Eclipse, тогда как приложение получает выгоду от необработанной скорости C++.

(4) GUI на основе браузера великолепны, но интеграция с бизнес-логикой страдает от задержек, а режим веб-серверов без состояния делает архитектуру громоздкой, если у вас действительно есть приложение в стиле рабочего стола. Графический интерфейс пользователя на основе браузера подходит для приложений «программное обеспечение как услуга», поскольку они не требуют установки пользователем и могут быть обновлены разработчиком продукта по желанию, но если вы не планируете предлагать свой продукт как продукт «программное обеспечение как услуга» (a la, например, Salesforce).

(5) Если ваша логика приложения кроссплатформенна, я постараюсь сделать также кроссплатформенный интерфейс пользователя. В противном случае для тех платформ, где поддерживается только логика приложения, может потребоваться установить две операционные системы: одну для запуска пользовательского интерфейса и одну для запуска логики приложения. Существуют хорошие кросс-платформенные рамки пользовательского интерфейса, по крайней мере,

  • AJAX/браузер UI
  • Trolltech/Nokia Qt
  • Eclipse (SWT)
  • Java Swing (hmm...)
-121--1662215-

После использования PDPDPPмой любимый прямо сейчас)

http://www.scribd.com/developers/api

В конце концов, я, вероятно, буду использовать pdftohtml, чтобы просто извлечь текстовое содержимое pdf-файла и api scribd для отображения исходного файла на странице пользователя

0
ответ дан 1 December 2019 в 22:39
поделиться