現在、完全に優れたPDFを作成しています。技術的に問題はありません。ただし、TOCは醜いです。
TOCは、ページの上部セクションに簡単な詳細を提供するためにjinja2を介して渡されるxslによって生成されます。クライアントのブランドとデザインに正確に一致するようにXSLを変更しました。ただし、リストの高さは増え続けています。
これが現在の結果です(テキストをぼかして申し訳ありません)新しいページの正しい場所でtocが拾っているのがわかりますが、新しいページに上部マージンを適用する方法はありません:
コード:これがxslです:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:outline="http://wkhtmltopdf.org/outline"
xmlns="http://www.w3.org/1999/xhtml">
<xsl:output doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
indent="yes" />
<xsl:template match="outline:outline">
<html>
<head>
<title>Table of Contents</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
body{
background-color: #fff;
margin-left: 0px;
margin-top: 0px;
color:#1e1e1e;
font-family: arial, verdana,sans-serif;
font-size: 90px;
}
.contentSection{
position:relative;
height:3200px;
width:6100px;
}
.profile{
position:absolute;
display:inline-block;
top:200px !important;
}
h1 {
text-align: left;
font-size: 70px;
font-family: arial;
color: #ef882d;
}
li {
border-bottom: 1px dashed rgb(45,117,183);
}
span {float: right;}
li {
list-style: none;
margin-top:30px;
}
ul {
font-size: 70px;
font-family: arial;
color:#2d75b7;
}
ul ul {font-size: 80%; padding-top:0px;}
ul {padding-left: 0em; padding-top:0px;}
ul ul {padding-left: 1em; padding-top:0px;}
a {text-decoration:none; color: color:#2d75b7;}
#topper{
width:100%;
border-bottom:8px solid #ef882d;
}
#title{
position:absolute;
top:60px;
font-size:60px;
left:150px;
color:#666666;
}
h1, h2{
font-size:60px;
-webkit-margin-before: 0px;
-webkit-margin-after: 0px;
-webkit-margin-start: 0px;
-webkit-margin-end: 0px;
}
#profile{
position:static;
-webkit-border-top-left-radius: 40px;
-webkit-border-bottom-left-radius: 40px;
-moz-border-radius-topleft: 40px;
-moz-border-radius-bottomleft: 40px;
border-top-left-radius: 40px;
border-bottom-left-radius: 40px;
right:-540px;
background-color: #2d75b7;
padding:4px;
padding-left:60px;
padding-right:250px;
color:#fff;
display:inline-block;
margin-top:200px;
float:right;
}
#room{
padding-top: 200px;
padding-left: 150px;
display:inline-block;
}
#section{
padding-left: 150px;
color: #ef882d;
text-transform: uppercase;
font-size:60px;
font-weight: bold;
display:inline-block;
margin-top: 30px;
margin-bottom: 5px;
}
#area{
padding-left: 150px;
font-size:60px;
color:#2d75b7;
margin-top: 15px;
}
#dims{
padding-left: 150px;
font-size:60px;
color:#2d75b7;
margin-top: 15px;
}
#toc{
width:50%;
margin-top:150px;
margin-left:300px;
}
</style>
<script>
var value = {{profile|e}};
</script>
</head>
<body>
<div class="contentSection">
<div id="title">A title here</div>
<div id="topper">
<div id="profile" class="profile">{{profile|e}}</div>
<div id="room"> {{profile|e}} </div>
<div id="area"> Revision Date </div>
<div id="dims"> {{area|e}} </div>
<div id="section">Table of Contents</div>
</div>
<div id="toc">
<ul><xsl:apply-templates select="outline:item/outline:item"/></ul>
</div>
</div>
</body>
</html>
</xsl:template>
<xsl:template match="outline:item">
<! begin LI>
<li>
<xsl:if test="@title!=''">
<div>
<a>
<xsl:if test="@link">
<xsl:attribute name="href"><xsl:value-of select="@link"/> .
</xsl:attribute>
</xsl:if>
<xsl:if test="@backLink">
<xsl:attribute name="name"><xsl:value-of select="@backLink"/> . </xsl:attribute>
</xsl:if>
<xsl:value-of select="@title" />
</a>
<span>
<xsl:value-of select="@page" />
</span>
</div>
</xsl:if>
<ul>
<xsl:comment>added to prevent self-closing tags in QtXmlPatterns</xsl:comment>
<xsl:apply-templates select="outline:item"/>
</ul>
</li>
</xsl:template>
</xsl:stylesheet>
私は、PDFの他の領域のコンテンツオーバーフローを従来のHTML、JavaScript、およびドキュメント準備フラグを使用して処理しました。ただし、TOCはXSLファイルを必要とします。
私はこれをnth-child cssで試みましたnth-childは無視されます。
質問:
* wkhtmltopdfまたはpython pdf-kitにTOCの改ページを処理し、新しいページの上部にマージンを配置する方法があります。 ?代わりにjavaScriptでこれを実行できるように、TOCを従来のhtmlページとして提供する方法はありますか?*
XSL(およびCSS)ファイルで簡単なコードレビューを行いました。問題が解決しない場合でも、問題の再現と理解に役立ちます。これが私のコメントです:
XSLにタイプミスがあります:_<! begin LI>
_は有効なXMLタブではありません。コメントですか?
私はconcat()
XPath関数を使用して文字を直接追加することを好みます。コードを再度インデントすると、余分な空白が挿入される可能性があるためです。
だから、私は交換しました:
_<xsl:attribute name="href"><xsl:value-of select="@link"/> . </xsl:attribute>
_
沿って:
_<xsl:attribute name="href">
<xsl:value-of select="concat(@link, ' . ')"/>
</xsl:attribute>
_
空の_xs:if
_が不要な場合に生成されないようにするために、_<ul>
_を追加しました。
_<xsl:if test="count(outline:item)">
<ul>
<xsl:comment>added to prevent self-closing tags in QtXmlPatterns</xsl:comment>
<xsl:apply-templates select="outline:item"/>
</ul>
</xsl:if>
_
また、CSSエントリの重複または不正な形式を修正し、置き換えました。
_li {
border-bottom: 1px dashed rgb(45, 117, 183);
}
span {
float: right;
}
li {
list-style: none;
margin-top: 30px;
}
ul ul {font-size: 80%; padding-top:0px;}
ul {padding-left: 0em; padding-top:0px;}
ul ul {padding-left: 1em; padding-top:0px;}
a {text-decoration:none; color: color:#2d75b7;}
_
沿って:
_span {
float: right;
}
li {
list-style: none;
margin-top: 30px;
border-bottom: 1px dashed rgb(45, 117, 183);
}
ul {
font-size: 70px;
font-family: arial;
color: #2d75b7;
}
ul ul {
font-size: 80%;
padding-left: 1em;
padding-top: 0px;
}
a {
text-decoration: none;
color: #2d75b7;
}
_
XHTMLをターゲットにする場合、_<style>
_タグには必須のtype
属性があります。 _<script>
_属性についても同様です。
_<style type="text/css">...</style>
<script type="text/javascript">...</script>
_
情報が不足していたため、バグを再現するのが少し困難でした。だから私はそれを推測します。
まず、次のようなサンプルTOCファイルを作成します。
outline.xml
_<?xml version="1.0" encoding="UTF-8"?>
<outline xmlns="http://wkhtmltopdf.org/outline">
<item>
<item title="Lorem ipsum dolor sit amet, consectetur adipiscing elit." page="2"/>
<item title="Cras at odio ultrices, elementum leo at, facilisis nibh." page="8"/>
<item title="Vestibulum sed libero bibendum, varius massa vitae, dictum arcu." page="19"/>
...
<item title="Sed semper augue quis enim varius viverra." page="467"/>
</item>
</outline>
_
このファイルには70項目が含まれているため、改ページを確認できます。
HTMLとPDF=をビルドするには、(修正済み)XSLファイルを使用してpdfkitを実行します:
_import io
import os
import pdfkit
from lxml import etree
HERE = os.path.dirname(__file__)
def layout(src_path, dst_path):
# load the XSL
xsl_path = os.path.join(HERE, "layout.xsl")
xsl_tree = etree.parse(xsl_path)
# load the XML source
src_tree = etree.parse(src_path)
# transform
transformer = etree.XSLT(xsl_tree)
dst_tree = transformer.apply(src_tree)
# write the result
with io.open(dst_path, mode="wb") as f:
f.write(etree.tostring(dst_tree, encoding="utf-8", method="html"))
if __name__ == '__main__':
layout(os.path.join(HERE, "outline.xml"), os.path.join(HERE, "outline.html"))
pdfkit.from_file(os.path.join(HERE, "outline.html"),
os.path.join(HERE, "outline.pdf"),
options={'page-size': 'A1', 'orientation': 'landscape'})
_
注:ページサイズが非常に大きく見えます...
そうです、wkhtmltopdfはCSSのマージンを考慮していません。
_li {
list-style: none;
border-bottom: 1px dashed rgb(45, 117, 183);
margin-top: 30px; # <-- not working after page break
}
_
これは正常な動作です。たとえば、ヘッダー段落(_h1
_、_h2
_など)を検討してください。ヘッダーには、段落と次のヘッダーの間に空白を追加するために上余白を付けることができますが、ヘッダーが新しいページを開始する場合は、余白を取り除き、見出しをページの上余白に接触させます。 。
TOCには解決策があります。 padding
の代わりにmargin
を使用できます:
_li {
border-bottom: 1px dashed rgb(45, 117, 183);
list-style: none;
padding-top: 30px;
}
_
実際には、目次の内容(_#toc
_要素)は修正されています。
_#toc {
width: 50%;
margin-top: 150px;
margin-left: 300px;
}
_
したがって、たとえば、必要に応じて_margin-top
_を減らすことができます。
_#toc {
width: 50%;
margin-top: 120px;
margin-left: 300px;
}
_