【发布时间】:2015-03-21 06:25:24
【问题描述】:
我有一张大桌子,里面有很多列,我需要使用 DOMPDF 将它们放入 PDF 页面。就像here一样,我的标题比相应的内容要宽得多,所以我正在尝试旋转它们。在 Firefox 中打开的 HTML 似乎没问题,但生成的 PDF 不是。
设置
HTML:
<td class="cell rotated_vertical_td" style="width:3%;">
<div class="rotated_vertical">Rotated_</div>
</td>
上面的宽度属性是在 PHP 中根据总列数计算出来的。
CSS:
.cell {
font-size: 8pt;
}
.rotated_vertical_td {
height: 280px;
width: 20px;
text-transform:uppercase;
margin:0;
padding:0;
}
.rotated_vertical {
-webkit-transform:rotate(270deg);
-moz-transform:rotate(270deg);
-ms-transform:rotate(270deg);
-o-transform:rotate(270deg);
transform:rotate(270deg);
transform-origin: 50%;
width: 20px;
}
我不得不对每个 <td> 应用 .cell 类,因为 DOMPDF 出于某种原因没有采用 table td 规则。
问题
似乎 DOMPDF 首先呈现文本,相应地更改表格单元格,然后旋转它。这意味着该列仍然占用尽可能多的空间,这打破了整点。
我尝试使用substr() 将文本剪切为只有 2、4 或 8 个字符长。看起来列宽正在相应调整。
这些是实际呈现的 PDF 的屏幕截图。如您所见,即使标记和 CSS 相同,最后一个适合的列也更少。唯一改变的是字符数。看起来它完全忽略了我在这些标题上设置的宽度。
如果是 HTML,看起来内部 div 上的 width: 20px; 会有所不同 - 如果我删除它,HTML 标题也会变宽。
再一次,看起来内部 div 宽度拉伸了表格标题单元格。我可以覆盖该宽度,它适用于 HTML,但不适用于 PDF。
更糟糕的是 DOMPDF does not seem to support having multiple page orientations in a single document 所以我不能在横向模式下拥有该页面。
在对this question 的回答中,建议使用绝对定位,但我不确定这如何与 DOMPDF 一起使用。例如,他们将position:fixed 元素视为页眉,可能会为绝对定位的元素保留一些内容。
请帮忙
2015-01-26 更新
感谢 BrianS 的帮助,我已经设法使用他建议的 CSS 方法和从 GitHub 下载的最新 DOMPDF 使文本旋转。在此之前,我正在为每个标题生成带有旋转文本的动态图像。
我想为那些在这里寻找解决方案的人指出几件事(包括我猜的未来我)
-
定位内容是一场噩梦。在 Firefox 和 DOMPDF 中似乎都无法可预测地控制旋转标题的位置和行为,而这 令人沮丧。首先,我必须将
transform-origin属性更改为:transform-origin: left bottom 0;...只是它的位置不那么随机,因为否则会改变 either
top/leftorwidth/height属性不断移动块在两个维度。事实上有大约 7 个变量需要控制(:after元素的top,left,width/height,以及line-height和width/height包装单元格)使得不可能通过所有可能的组合来获得理想的位置。 如果标题太长并且包含任何可破坏的字符(例如空格),则会将其拆分为多行,并且这些行通过相互叠加而合并为一行。请看:
我找不到阻止这种情况的方法。看到不包含任何易碎字符的文本仍然放在一行中,
- 尝试使用宽度/高度/行高控件
- 尝试用 css
content属性内的&nbsp;替换空格,但它会直接打印出来,并且不能用作不可破坏的空格 - 尝试将 ASCII 字符用作 advised here,但它会输出一些奇怪的字符
- 用下划线替换了空格 - 它可以工作但看起来很难看
- 所以我尝试用
<span style="color:#fff">_</span>替换空格,这样下划线的颜色与背景匹配,但同样,整个内容都会直接打印出来,而且我也意识到该跨度会打破界限无论如何 - 感觉组合起来的那条线没有足够的宽度,但是如果我更改
.rotate .content:after元素的宽度,它只会将覆盖的线向右移动,尽管当我在 Firefox 中打开 HTML这似乎有帮助
所以现在,我的解决方案是使用下划线,但这看起来并不专业。如果您能帮助我解决问题,我将不胜感激。
这是更新后的设置:
HTML:
<tr class="table_summary_thead">
<td class="rotated_vertical_td" style="width:3%;">
<a hred="appendix_item_44">
<div class="rotated_vertical_outer">
<div class="rotated_vertical_inner rtb1f73b0b57649457abd0ca2e0e8c94e0f7d79c25">
</div>
</div>
</a>
<style type="text/css">
.rtb1f73b0b57649457abd0ca2e0e8c94e0f7d79c25:after {
content:"COMPREHENSIVE";
}
</style>
</td>
</tr>
CSS:
.table_summary {
width:100% !important;
}
.table_summary td {
text-align:center;
}
.table_summary tbody td {
font-size: 10pt;
padding: 4px;
}
.rotated_vertical_td {
width: 20px !important;
height: 680px !important;
font-size: 8pt;
margin:0;
padding:0;
text-align:left;
}
.table_summary_thead {
line-height: 220px;
text-align:left;
}
.rotated_vertical_outer {
position: relative;
overflow: visible;
text-align:left;
}
.rotated_vertical_inner:after {
height: 150px;
overflow: visible;
position: absolute;
text-align: left;
transform: rotate(270deg);
transform-origin: left bottom 0;
width: 20px;
top: 100px;
left: 110px;
}
这里包括大部分 CSS,因为谁知道呢,一些看起来无关紧要的小部分可能会有所作为。
【问题讨论】:
-
我感觉定位元素会很痛苦。我希望我能够提出更好的选择。
-
另请注意,dompdf 目前不能很好地处理不间断空格。它们几乎被视为常规空间。
-
为了确保您的行不会中断,您应该能够使用
white-space: nowrap;设置:after块的样式。 (这可能会导致您不得不重新定位。)
标签: css rotation dompdf rotatetransform