如何在生成 PDF 时添加外部 CSS?

Posted

技术标签:

【中文标题】如何在生成 PDF 时添加外部 CSS?【英文标题】:How to add external CSS while generating PDF? 【发布时间】:2014-09-06 18:58:28 【问题描述】:

目前我正在使用以下代码在 JSP 文件中生成 PDF:

response.setContentType("application/force-download");                                                          
response.setHeader("Content-Disposition", "attachment;filename=reports.pdf");                                                     
Document document = new Document();                                      
document.setPageSize(PageSize.A1);

PdfWriter writer = null;                                                      

writer = PdfWriter.getInstance(document, response.getOutputStream());                                         

document.open();                                                                                   

ByteArrayInputStream bis = new ByteArrayInputStream(htmlSource.toString().getBytes());                                                                                      

XMLWorkerHelper.getInstance().parseXHtml(writer, document, bis);                                                                   

document.close();     

有了这个就可以生成PDF了。

但我想在生成 PDF 时添加 CSS 文件。

请帮帮我...

【问题讨论】:

您想要添加的 Css 文件为 pdf 中的内容提供一些样式?或者您想与 pdf 文件一起创建另外一个 css 文件? 【参考方案1】:

我不确定在 java 中如何使用,但在 c# 中,您可以通过此代码添加外部样式表代码或语法:-

StyleSheet css = new StyleSheet();
    css.LoadTagStyle("body", "face", "Garamond");
    css.LoadTagStyle("body", "encoding", "Identity-H");
    css.LoadTagStyle("body", "size", "12pt");

也许对你有帮助

问候, 维尼特

【讨论】:

【参考方案2】:

请查看ParseHtmlTable1 示例。在此示例中,我们将 HTML 存储在 StringBuilder 对象中,并将一些 CSS 存储在 String 中。在我的示例中,我将sb 对象和CSS 对象转换为InputStream。如果您有包含 HTML 和 CSS 的文件,您可以轻松使用 FileInputStream

一旦你有一个用于 HTML 和 CSS 的InputStream,你就可以使用这个代码:

// CSS
Cs-s-resolver cssResolver = new StyleAttrCs-s-resolver();
CssFile cssFile = XMLWorkerHelper.getCSS(new ByteArrayInputStream(CSS.getBytes()));
cssResolver.addCss(cssFile);

// HTML
HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());

// Pipelines
PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer);
HtmlPipeline html = new HtmlPipeline(htmlContext, pdf);
CssResolverPipeline css = new CssResolverPipeline(cssResolver, html);

// XML Worker
XMLWorker worker = new XMLWorker(css, true);
XMLParser p = new XMLParser(worker);
p.parse(new ByteArrayInputStream(sb.toString().getBytes()));

或者,如果您不喜欢所有这些代码:

ByteArrayInputStream bis = new ByteArrayInputStream(htmlSource.toString().getBytes());  
ByteArrayInputStream cis = new ByteArrayInputStream(cssSource.toString().getBytes());
XMLWorkerHelper.getInstance().parseXHtml(writer, document, bis, cis);  

【讨论】:

如果您需要在 pdf 中包含图像并且 css 指向它怎么办?【参考方案3】:

你可以试试这个代码参考。

$html .= '<style>'.file_get_contents(_BASE_PATH.'stylesheet.css').'</style>';

【讨论】:

【参考方案4】:

将内容类型更改为

response.setContentType("application/pdf");

【讨论】:

我想下载 PDF。我没有将输出写入浏览器。 @YellaGoud 此内容类型的标准行为是要求用户执行操作(打开或下载文档)。 我认为,当您为您的意图添加一些解释时,这对操作人员和其他访问者会更有帮助。

以上是关于如何在生成 PDF 时添加外部 CSS?的主要内容,如果未能解决你的问题,请参考以下文章

在 Codeigniter 中使用外部 CSS 支持将 HTML 转换为 PDF

将外部 PDF 插入 Prawn 生成的文档

如何从html网页生成pdf? [关闭]

如何在 wufoo 中添加外部 css 文件

如何从 Python 中的 HTML / CSS(包括图像)源生成 PDF? [关闭]

如何将外部字体添加到 ghostscript?