我在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。
答案 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
我用AddPage
和DeletePage.
进行了测试。
AddPage
答案 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的最新版本)。