Skip to content

Commit 01d176e

Browse files
committed
Fix PDFBuilder issue
Remove CSS Style sheets. Without this fix this error is thrown Caused by: java.lang.ClassCastException: org.xhtmlrenderer.render.BlockBox cannot be cast to org.xhtmlrenderer.newtable.TableBox at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:127) at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139) at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:46) at org.xhtmlrenderer.layout.Layer.paint(Layer.java:314) at org.xhtmlrenderer.layout.Layer.paintLayers(Layer.java:165) at org.xhtmlrenderer.layout.Layer.paint(Layer.java:337) at org.xhtmlrenderer.pdf.ITextRenderer.paintPage(ITextRenderer.java:384) at org.xhtmlrenderer.pdf.ITextRenderer.writePDF(ITextRenderer.java:348) at org.xhtmlrenderer.pdf.ITextRenderer.createPDF(ITextRenderer.java:315) at org.xhtmlrenderer.pdf.ITextRenderer.createPDF(ITextRenderer.java:246) at grails.doc.PdfBuilder.createPdf(PdfBuilder.groovy:139) at grails.doc.internal.PublishPDFSpec.generate pdf from docs(PublishPDFSpec.groovy:18)
1 parent 63c1324 commit 01d176e

File tree

2 files changed

+90
-2
lines changed

2 files changed

+90
-2
lines changed

grails-docs/src/main/groovy/grails/doc/PdfBuilder.groovy

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,9 @@ class PdfBuilder {
6868
static boolean cleanHtml = Boolean.getBoolean("grails.docs.clean.html")
6969
static boolean debugPdf = Boolean.getBoolean("grails.docs.debug.pdf")
7070

71-
private static cleanupHtml(File htmlFile, String xml) {
72-
def result = cleanHtml ? Jsoup.parse(xml).outerHtml() : xml
71+
private static String cleanupHtml(File htmlFile, String xml) {
72+
String result = cleanHtml ? Jsoup.parse(xml).outerHtml() : xml
73+
result = removeCssLinks(result)
7374
if(debugPdf) {
7475
File before = new File(htmlFile.absolutePath + '.before.xml')
7576
before.setText(xml, 'UTF-8')
@@ -81,6 +82,30 @@ class PdfBuilder {
8182
result
8283
}
8384

85+
private static String removeCssLink(String htmlString) {
86+
String output
87+
String str = htmlString
88+
int index = str.indexOf('<link rel="stylesheet"')
89+
output = str.substring(0, index)
90+
String end = str.substring(index, str.size())
91+
output += end.substring(end.indexOf('/>') + '/>'.length(), end.size())
92+
output
93+
}
94+
95+
static String removeCssLinks(String html) {
96+
String str = html
97+
for (;;) {
98+
99+
int index = str.indexOf('<link rel="stylesheet"')
100+
println "index $index"
101+
if ( index == -1 ) {
102+
break
103+
}
104+
str = removeCssLink(str)
105+
}
106+
str
107+
}
108+
84109
static void createPdf(String xml, File outputFile, File urlBase) {
85110
def dbf = DocumentBuilderFactory.newInstance()
86111
dbf.validating = false
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package grails.doc.internal
2+
3+
import grails.doc.PdfBuilder
4+
import spock.lang.Specification
5+
6+
class PublishPDFSpec extends Specification {
7+
8+
void "generate pdf from docs"() {
9+
when:
10+
System.setProperty('grails.docs.clean.html','true')
11+
String pdfName = 'single.pdf'
12+
def outputDir = new File('/Users/sdelamo/git/grails/grails-doc/build/docs')
13+
def currFile = new File(outputDir, "guide/single.html")
14+
def pdfBuilder = new PdfBuilder()
15+
def xml = pdfBuilder.createXml(currFile, outputDir.absolutePath)
16+
pdfBuilder.createPdf(xml,
17+
new File(currFile.parentFile, pdfName),
18+
new File(outputDir, "guide/single.html"))
19+
20+
then:
21+
noExceptionThrown()
22+
}
23+
24+
void "remove CssLinks"() {
25+
given:
26+
String html = """
27+
<head>
28+
<title>The Grails Framework 3.2.11</title>
29+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
30+
<link rel="stylesheet" href="../css/main.css" type="text/css" media="screen, print" title="Style" charset="utf-8" />
31+
<link rel="stylesheet" href="../css/pdf.css" type="text/css" media="print" title="PDF" charset="utf-8" />
32+
<script type="text/javascript">
33+
function addJsClass(el) {
34+
var classes = document.body.className.split(" ");
35+
classes.push("js");
36+
document.body.className = classes.join(" ");
37+
}
38+
</script>
39+
</head>
40+
"""
41+
String expected = """
42+
<head>
43+
<title>The Grails Framework 3.2.11</title>
44+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
45+
46+
47+
<script type="text/javascript">
48+
function addJsClass(el) {
49+
var classes = document.body.className.split(" ");
50+
classes.push("js");
51+
document.body.className = classes.join(" ");
52+
}
53+
</script>
54+
</head>
55+
"""
56+
when:
57+
String output = PdfBuilder.removeCssLinks(html)
58+
59+
then:
60+
output == expected
61+
62+
}
63+
}

0 commit comments

Comments
 (0)