在writeHTML

时间:2018-11-06 16:15:27

标签: html tcpdf

enter image description here

我在TCPDF下使用writeHTML生成页面。我的页面由3个区块(顶部,中间,底部)组成。我将顶部的旋转180度,中间的旋转90度。 最后一页必须为A4横向。

它工作正常(如您在快照中所示),除了一个小细节:中间部分旋转90°,这意味着在旋转之前,该部分的高度高于A4景观的高度。

我发现即使中间的一块块高度很高(旋转前)也能正确显示,唯一的方法是使用A3纵向页面进行旋转。如图所示。

有2个问题:

  • 有其他想法吗?

  • 如果没有其他选择,是否可以以A3纵向(使用WriteHTML)和AFTER生成PDF,裁剪页面以仅保存(输出)页面的顶部,因此A4风景? (使用TCPDF,而不是“手动”)

对于那些感兴趣的人:由于我有动态数据,因此我每次都需要搜索旋转中心,并且必须对bootom块应用平移,因为它在旋转后会与中间块对齐。为此,我在HTML模板上添加“ tcpdf method”标签,执行writeHTML,该HTML调用函数GetX,GetY并保存坐标。旋转以及中间块和底部块的相对位置(用于底部块平移) 然后我“回滚”,在模板中设置坐标并执行第二个writeHTML。

2 个答案:

答案 0 :(得分:0)

我猜。如果更长,则页面会中断,并且只会旋转适合页面的内容,同时还可能会丢失您期望的createObjectURL()Creating test database for alias 'default'... Traceback (most recent call last): File "manage.py", line 12, in <module> execute_from_command_line(sys.argv) File "/home/me/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line utility.execute() File "/home/me/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 330, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/me/venv/lib/python2.7/site-packages/django/core/management/commands/test.py", line 30, in run_from_argv super(Command, self).run_from_argv(argv) File "/home/me/venv/lib/python2.7/site-packages/django/core/management/base.py", line 390, in run_from_argv self.execute(*args, **cmd_options) File "/home/me/venv/lib/python2.7/site-packages/django/core/management/commands/test.py", line 74, in execute super(Command, self).execute(*args, **options) File "/home/me/venv/lib/python2.7/site-packages/django/core/management/base.py", line 441, in execute output = self.handle(*args, **options) File "/home/me/venv/lib/python2.7/site-packages/django/core/management/commands/test.py", line 90, in handle failures = test_runner.run_tests(test_labels) File "/home/me/venv/lib/python2.7/site-packages/django/test/runner.py", line 210, in run_tests old_config = self.setup_databases() File "/home/me/venv/lib/python2.7/site-packages/django/test/runner.py", line 166, in setup_databases **kwargs File "/home/me/venv/lib/python2.7/site-packages/django/test/runner.py", line 370, in setup_databases serialize=connection.settings_dict.get("TEST", {}).get("SERIALIZE", True), File "/home/me/venv/lib/python2.7/site-packages/django/db/backends/base/creation.py", line 376, in create_test_db self.connection._test_serialized_contents = self.serialize_db_to_string() File "/home/me/venv/lib/python2.7/site-packages/django/db/backends/base/creation.py", line 413, in serialize_db_to_string serializers.serialize("json", get_objects(), indent=None, stream=out) File "/home/me/venv/lib/python2.7/site-packages/django/core/serializers/__init__.py", line 129, in serialize s.serialize(queryset, **options) File "/home/me/venv/lib/python2.7/site-packages/django/core/serializers/base.py", line 52, in serialize for obj in queryset: File "/home/me/venv/lib/python2.7/site-packages/django/db/backends/base/creation.py", line 409, in get_objects for obj in queryset.iterator(): File "/home/me/venv/lib/python2.7/site-packages/django/db/models/query.py", line 238, in iterator results = compiler.execute_sql() File "/home/me/venv/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 829, in execute_sql cursor.execute(sql, params) File "/home/me/venv/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute return self.cursor.execute(sql, params) File "/home/me/venv/lib/python2.7/site-packages/django/db/utils.py", line 97, in __exit__ six.reraise(dj_exc_type, dj_exc_value, traceback) File "/home/me/venv/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute return self.cursor.execute(sql, params) File "/home/me/venv/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 318, in execute return Database.Cursor.execute(self, query, params) django.db.utils.OperationalError: no such column: myapp_historicalbook.history_change_reason 的值?

禁用自动分页符,它应能按预期工作。

GetX

这样,它将仅在需要的地方绘制页面,而不会干扰分页符。


编辑:但是,如注释中所述,我错了,GetY将返回页面外部的坐标。不会。

因此,我们需要在更大的页面上进行高度检查,然后在知道需要布局并销毁原始页面后,在新的(适当大小)页面上重新绘制。

您可以通过交易或使用$pdf->SetAutoPageBreak(FALSE, 0); GetY

我用AddPageDeletePage.进行了测试。

AddPage

Example with coordinate calculation.

答案 1 :(得分:0)

即使EPB回答是一个非常有趣的回答,并且在某些情况下有效,但就我而言,结果是相同的。 所以我找到了另一种方式。这不是一个真正的“纯答案”,而是一个很好的技巧。 我在A3 Portrait中创建页面并旋转数据,以便在上部获得所有数据。 然后,我使用从PHP调用的名为“ pdfposter”的工具,以将A3纵向PDF分成两个A4 Landscape。 因此,在执行writeHTML()之后:

  $path_a3 = __DIR__ . '/../tmp/a3.pdf';
  $path_a4 = __DIR__ . '/../tmp/a4.pdf';
  $pdf->Output($path_a3, 'F');

  $pdfposter = "pdfposter -m a4 -p 2x1a4 ".$path_a3." ".$path_a4;
  exec($pdfposter,$retArr, $retVal);

在那之后,我有了一个a4.pdf,其中有两个A4页面。

仅注意一个细节:使用旋转数据的TCPDF制作的页面与pdfposter 0.6不兼容!您必须安装版本07.post1(Git的最新版本)。