HTML к PDF по сравнению с Программно созданием PDF через PHP

Если бы можно различать количеством параметра, то что-то вроде этого работало бы:

Public Function Morph(ParamArray Args())

    Select Case UBound(Args)
    Case -1 '' nothing supplied
        Morph = Morph_NoParams()
    Case 0
        Morph = Morph_One_Param(Args(0))
    Case 1
        Morph = Two_Param_Morph(Args(0), Args(1))
    Case Else
        Morph = CVErr(xlErrRef)
    End Select

End Function

Private Function Morph_NoParams()
    Morph_NoParams = "I'm parameterless"
End Function

Private Function Morph_One_Param(arg)
    Morph_One_Param = "I has a parameter, it's " & arg
End Function

Private Function Two_Param_Morph(arg0, arg1)
    Two_Param_Morph = "I is in 2-params and they is " & arg0 & "," & arg1
End Function

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

Public Function MorphBySig(ParamArray args())

Dim sig As String
Dim idx As Long
Dim MorphInstance As MorphClass

    For idx = LBound(args) To UBound(args)
        sig = sig & TypeName(args(idx))
    Next

    Set MorphInstance = New MorphClass

    MorphBySig = CallByName(MorphInstance, "Morph_" & sig, VbMethod, args)

End Function

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

8
задан Bozho 28 November 2009 в 13:05
поделиться

6 ответов

Я могу порекомендовать Zend_Pdf , который является программным методом согласно вашей классификации.

Абстракция HTML - это хорошо, но я не верю, что у вас есть все возможности и управление полным API рисования на основе геометрии. Остерегайтесь таких библиотек, как fpdf, которые не поддерживают UTF-8 из коробки, и используйте парсер для бедняков для «преобразования» HTML в PDF.

Что касается вашего приложения, я создал систему, которая генерирует шаблонные счета-фактуры. Мои пользователи могут загрузить шаблон PDF, который извлекает Zend_Pdf. Этот шаблон затем используется для каждой страницы сгенерированного счета, что позволяет легко настраивать его.

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

2
ответ дан 5 December 2019 в 21:20
поделиться
class Application {
    protected static $_singletonFoo=NULL;

    public static function foo() {
        if(NULL === self::$_singletonFoo) {
            self::$_singletonFoo = new Foo;
        }
        return self::$_singletonFoo;
    }

}

Я бы так и поступил. Он создает объект по запросу:

Application::foo()->bar();

Я так и делаю, он соблюдает принципы ООП, в нем меньше кода, чем то, что вы делаете сейчас, и объект создается только тогда, когда это требуется коду в первую очередь время.

Примечание : то, что я представил, даже не является настоящим одноэлементным шаблоном. Синглтон допускает только один экземпляр самого себя, определяя конструктор (Foo :: __ constructor ()) как закрытый. Это только «глобальная» переменная, доступная для всех экземпляров «Приложения». Вот почему я думаю, что его использование правильно, поскольку оно НЕ игнорирует хорошие принципы ООП. Конечно, как и все в мире, этим «шаблоном» не следует злоупотреблять!

Я видел, как он используется во многих фреймворках PHP, в том числе в Zend Framework и Yii. И вы должны использовать фреймворк. Я не собираюсь говорить вам, какой именно.

Приложение Для тех из вас, кто беспокоится о TDD , вы все равно можете сделать некоторую проводку для внедрения зависимостей. Это может выглядеть так:

class Application {
        protected static $_singletonFoo=NULL;
        protected static $_helperName = 'Foo';

        public static function setDefaultHelperName($helperName='Foo') {
                if(is_string($helperName)) {
                        self::$_helperName = $helperName;
                }
                elseif(is_object($helperName)) {
                        self::$_singletonFoo = $helperName;
                }
                else {
                        return FALSE;
                }
                return TRUE;
        }
        public static function foo() {
                if(NULL === self::$_singletonFoo) {
                        self::$_singletonFoo = new self::$_helperName;
                }
                return self::$_singletonFoo;
        }
}

Здесь достаточно возможностей для улучшения. Это просто PoC, используйте ваше воображение.

Почему это так? Что ж, в большинстве случаев приложение не будет проходить модульное тестирование, оно будет запущено , надеюсь, в производственной среде . Сила PHP - в его скорости. PHP НЕ является и никогда не будет «чистым языком ООП», как Java.

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

Стереотипные "правила" вроде " пользователь может разработать шаблон так, как он считает нужным, и вы не будете нужны, когда потребуется изменить дизайн. (И его нужно будет изменить в один прекрасный день.) Программист вступает в игру только тогда, когда вставленные данные нужно изменить или расширить. Это огромная нагрузка для вас.

3
ответ дан 5 December 2019 в 21:20
поделиться

Hi you have two options. You can use dompdf, which enables you to design your document as a regular html document and style it with css. You can turn this document into pdf. My experiences were good. I render a regular html page using Zend_View and turn this into pdf. This way you have an extremely flexible template, beacuse you can make all kind of display decisions in your html-generating view.

→ see the list of css-compatability.

Alternatively you could use livedocx. This also allows for a template based approach, but more rigidly and html-less. A integration for Zend Framework is on its way.

1
ответ дан 5 December 2019 в 21:20
поделиться

Я также рекомендую конвертировать HTML в PDF:

  • Это легче реализовать
  • Легче изменить макет / дизайн позже
  • Вы, вероятно, могли бы повторно использовать некоторый html файла страница

Когда я однажды создал генерацию PDF для веб-сайта, я использовал html2ps , а затем преобразовал постскриптум в PDF позже.

0
ответ дан 5 December 2019 в 21:20
поделиться

Предлагаю программное форматирование.

В мире .net у меня был явно негативный опыт использования конвертеров html в pdf. Кажется, они делятся на 2 категории:

Те, которые «анализируют» ваш html и пытаются превратить его в pdf. В них часто отсутствуют некоторые действительно фундаментальные функции, такие как таблицы стилей и поддержка чего угодно, кроме макета на основе таблиц.

Те, которые «распечатывают» ваш HTML-код на изображение и вставляют его в PDF-файл. Они действительно могут создать прилично выглядящий документ. Кажется, они работают, связывая браузер с библиотекой, что вызывает проблемы с потоками и низкую производительность.

У меня был посредственный опыт работы с прямым API-интерфейсом pdf, но php, похоже, имеет несколько значительно лучших библиотек в этом отношении.

0
ответ дан 5 December 2019 в 21:20
поделиться

У меня был достаточный опыт работы со всеми тремя подходами:

  1. Создание документа программно с использованием TCPDF (который, хотя и был производным от FPDF, ДЕЙСТВИТЕЛЬНО поддерживает UTF-8 из коробки). Хотя я большой поклонник Zend Framework, необходимо отметить, что Zend_Pdf еще НЕ достаточно богат набором функций, чтобы его можно было использовать таким образом.

  2. Графический дизайнер создает шаблон, загружает его с помощью Zend_Pdf, а затем добавляет к нему дополнительный контент. Zend_Pdf (1.10.2 - 1.10.7) в этом случае работал довольно хорошо, ЗА ИСКЛЮЧЕНИЕМ, когда при попытке создать экземпляр новой страницы и добавить ее в документ возникало множество ошибок.

  3. Преобразование из HTML в PDF с помощью htmldoc. Этот подход был плохим, но в основном из-за ограничений в htmldoc.

Я не использовал TCPDF для конвертации HTML в PDF, но, судя по общему качеству кода, я думаю, что он вполне справится со своей задачей. (Я действительно довел TCPDF до предела, включая рендеринг графически насыщенных документов в наборах символов RTL, китайском языке и т. д., и он работал безупречно). Поэтому, если вы решите сделать это программно, я бы порекомендовал использовать TCPDF, но если у вас есть хороший шаблон от графического дизайнера и вы намерены просто добавить что-то сверху, загрузка его с помощью Zend_Pdf и модификация оттуда — разумный выбор (хотя вы все равно в конечном итоге реализуете перенос слов и некоторые другие базовые вещи).

1
ответ дан 5 December 2019 в 21:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: