我曾经为一个使用Prince XML生成PDF文档的组织工作。该组织已经折叠,我不再能够访问该Prince许可证。由于我在沙发垫之间没有四个盛大,我一直在尝试使用WeasyPrint将HTML发票呈现为PDF。我的HTML& CSS非常简单,所以Weasy可以准确地呈现它们,但需要注意。我不能让页面自动缩小到纸张大小,就像在王子中使用:
@page {
prince-shrink-to-fit:auto;
}
在重新编写整个网站的CSS以生成较小的文档之前,有没有人知道Weasy是否支持任何类似的命令?
答案 0 :(得分:3)
通过浏览一些想法来格式化weasyprint提供的pdf格式,我发现这个问题可能会回答你的问题。
/favicon.ico
答案 1 :(得分:1)
WeasyPrint目前不支持此类内容。 Prince’s documentation完全没有做什么。如何确定“内容的宽度”?鉴于该功能的正确规范,我可以说明添加到WeasyPrint有多难。
顺便说一句,我通常不会在WeasyPrint问题上看StackOverflow。写入WeasyPrint的邮件列表或问题跟踪器将获得更多响应。
答案 2 :(得分:1)
如果您要打印熊猫数据框,这可能会有所帮助
from typing import Callable
import pandas as pd
import weasyprint as wp
def html_basic(df: pd.DataFrame) -> str:
# Using df.style.render outputs an id in every cell,
# whilst using df.to_html doesn't.
return df.style.render()
def write_pdf_autofit(df: pd.DataFrame,
preamble: str,
fn_df_to_html: Callable[[pd.DataFrame], str]=html_basic
) -> bytes:
template = f"""<html><body>{preamble}{{table}}</body></html>"""
# Render on a very long page so that there's no pagination.
# Width doesn't matter, because overflow is allowed on width.
mycss = wp.CSS(string=(
"@page longpage {\n"
" size: 210mm 10000mm;\n"
"}"
"body {\n"
" page: longpage;\n"
"}\n"
))
# Create a copy of the dataframe with a dummy final column,
# so that we can get the position of the left side of the
# dummy column which is the right side of the final real column.
# Then do a test render to find the positions of stuff.
df_tmp = df.copy()
df_tmp['x'] = np.nan
test_html = template.format(table=fn_df_to_html(df_tmp))
test_render = wp.HTML(string=test_html).render(stylesheets=[mycss])
test_page1: wp.Page = test_render.pages[0]
# I'm not sure why only need to subtract one margin,
# but seems to work.
printable_width = test_page1.width - test_page1._page_box.margin_left
printable_height = 11.7 * 96 - test_page1._page_box.margin_top
# All the cells in the html rendered DataFrame
# have an id so are anchors, so just find the
# max x and y from all the anchors.
max_x, max_y = map(max, *test_page1.anchors.values())
zoom_pct = 1
if max_x > printable_width or max_y > printable_height:
zoom_pct = min([printable_width / max_x,
printable_height / max_y])
# Increase the page size to fit the table, then
# we will zoom out the write_pdf to fit standard page size.
# A4 = 210mm x 297mm
mycss = wp.CSS(string=(
"@page scaled {\n"
f" size: {210 / zoom_pct}mm {297 / zoom_pct}mm;\n"
"}"
"body {\n"
" page: scaled;\n"
"}\n"
))
html = template.format(table=fn_df_to_html(df))
pdf_bytes = wp.HTML(string=html).write_pdf(zoom=zoom_pct,
stylesheets=[mycss])
return pdf_bytes
if __name__ == "__main__":
import numpy as np
DF = pd.DataFrame(np.random.randint(0, 100, size=(100, 4)), columns=list('ABCD'))
with open(r'c:\temp\x.pdf', 'wb') as f:
f.write(write_pdf_autofit(DF, ""))