openhtmltopdf / flying saucer:巨大 PDF 中的许多链接不可点击(未设置 PDF 注释)
openhtmltopdf / flying saucer: many links in huge PDF are not clickable (PDF annotations not set)
我生成巨大的目录(约 1500 页)作为 HTML 并通过 Jsoup 转换为和 openhtmltopdf(使用飞碟)转换为 PDF。在生成的 PDF 中,许多 link 不可点击,我也找不到原因。
考虑以下程序:
import org.jsoup.helper.W3CDom;
import org.w3c.dom.Document;
import org.jsoup.Jsoup;
import com.openhtmltopdf.pdfboxout.PdfRendererBuilder;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws Exception {
PdfRendererBuilder pdfBuilder = new PdfRendererBuilder();
String html = "<html><head></head><body>";
for (Integer i = 0; i < 10000; i++) {
html += "<a href='http://www.google.de?q=" + i + "'>blabla</a> <br>";
}
html += "</body></html>";
File file = new File("/tmp/tmp.pdf");
FileOutputStream fop = new FileOutputStream(file);
W3CDom w3cDom = new W3CDom();
Document w3cDoc = w3cDom.fromJsoup(Jsoup.parse(html));
pdfBuilder.withW3cDocument(w3cDoc, "/");
pdfBuilder.toStream(fop);
try {
pdfBuilder.run();
} catch (Exception e) {
e.printStackTrace();
}
}
}
它创建了一个 176 页和 10.000 links 的 PDF。在第 1 到 3 页上,它们是可单击的,之后它们不是,尽管相同。最后一个可点击的 link 是数字 112,在源代码中我发现:
870 0 obj
<<
/W 0.0
/S /S
>>
endobj
871 0 obj
<<
/S /URI
/URI (http://www.google.de?q=111)
>>
endobj
872 0 obj
<<
/W 0.0
/S /S
>>
endobj
873 0 obj
<<
/S /URI
/URI (http://www.google.de?q=112)
>>
endobj
874 0 obj
<<
/W 0.0
/S /S
>>
endobj
875 0 obj
<<
/F1 1049 0 R
>>
endobj
显然在编号 112 之后,注释对象中不再存储任何 URL。
我的程序自然就复杂多了。在其结果的前五或六页上,所有 link 都是可点击的,之后有些是,大多数不是。不过,哪些仍然可以点击似乎是完全随机的。
有人可以帮忙吗?知道什么可能导致此问题或如何解决吗? openhtmltopdf 中的错误?
--
编辑 1:
使用 withHtmlContent 而不是 withW3cDocument 也有同样的问题。
生成的 PDF 与 jsoup 1.11.2
和 openhtmltopdf-pdfbox-0.0.1-RC11
完美兼容。
该问题可能是由旧版本 openhtmltopdf
中的错误引起的,该版本已修复。
我生成巨大的目录(约 1500 页)作为 HTML 并通过 Jsoup 转换为和 openhtmltopdf(使用飞碟)转换为 PDF。在生成的 PDF 中,许多 link 不可点击,我也找不到原因。
考虑以下程序:
import org.jsoup.helper.W3CDom;
import org.w3c.dom.Document;
import org.jsoup.Jsoup;
import com.openhtmltopdf.pdfboxout.PdfRendererBuilder;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws Exception {
PdfRendererBuilder pdfBuilder = new PdfRendererBuilder();
String html = "<html><head></head><body>";
for (Integer i = 0; i < 10000; i++) {
html += "<a href='http://www.google.de?q=" + i + "'>blabla</a> <br>";
}
html += "</body></html>";
File file = new File("/tmp/tmp.pdf");
FileOutputStream fop = new FileOutputStream(file);
W3CDom w3cDom = new W3CDom();
Document w3cDoc = w3cDom.fromJsoup(Jsoup.parse(html));
pdfBuilder.withW3cDocument(w3cDoc, "/");
pdfBuilder.toStream(fop);
try {
pdfBuilder.run();
} catch (Exception e) {
e.printStackTrace();
}
}
}
它创建了一个 176 页和 10.000 links 的 PDF。在第 1 到 3 页上,它们是可单击的,之后它们不是,尽管相同。最后一个可点击的 link 是数字 112,在源代码中我发现:
870 0 obj
<<
/W 0.0
/S /S
>>
endobj
871 0 obj
<<
/S /URI
/URI (http://www.google.de?q=111)
>>
endobj
872 0 obj
<<
/W 0.0
/S /S
>>
endobj
873 0 obj
<<
/S /URI
/URI (http://www.google.de?q=112)
>>
endobj
874 0 obj
<<
/W 0.0
/S /S
>>
endobj
875 0 obj
<<
/F1 1049 0 R
>>
endobj
显然在编号 112 之后,注释对象中不再存储任何 URL。
我的程序自然就复杂多了。在其结果的前五或六页上,所有 link 都是可点击的,之后有些是,大多数不是。不过,哪些仍然可以点击似乎是完全随机的。
有人可以帮忙吗?知道什么可能导致此问题或如何解决吗? openhtmltopdf 中的错误?
--
编辑 1: 使用 withHtmlContent 而不是 withW3cDocument 也有同样的问题。
生成的 PDF 与 jsoup 1.11.2
和 openhtmltopdf-pdfbox-0.0.1-RC11
完美兼容。
该问题可能是由旧版本 openhtmltopdf
中的错误引起的,该版本已修复。