【发布时间】:2015-02-27 20:57:55
【问题描述】:
我正在使用 CSSBox 来呈现网页 HTML 和 CSS,然后将其打印出来。应用程序必须处理特定的站点。这个想法是让一些并非设计为可打印的网站实际打印并看起来可读。这是通过删除菜单、标题等来完成的。居中内容,覆盖一些样式。
我目前的方法是将站点呈现给一个组件,该组件是 CSSBox API 的一部分,称为 BrowserCanvas。我为每个支持的站点调整画布的宽度,以确保段落在每种情况下看起来都很好。此 BrowserCanvas 源自 JPanel,并具有我用来将其渲染到打印机 Graphics 对象的绘制方法。
问题是打印机画布通常很大,想想 300 ppp、600 ppp 等。我现在要做的是设置一个 RenderingHints 来强制双三次插值来放大文档以填充打印页面中的所有空间.
问题是你可以看到文档就像一个放大的屏幕截图,在打印的页面中看起来不是很好。
有更好的方法吗?
打印方法
通过 PrinterJob 类获得对打印机的访问权限。
然后我重写接受页码的 BrowserCanvas 打印方法。根据该数字,我在图形对象上设置比例和平移,注意如果最后一行文本不能完全适合页面,则将其移动到下一页。然后我调用 super.print() 作为参数传递应用了所有缩放和平移的图形对象。
我认为缩放会很柔和,就像在更高的分辨率下做所有事情一样,比如字体大小,但它看起来更像是在基本分辨率中绘制所有内容,然后将结果放大到所需的分辨率。
修改页面示例(使用 CSSBox 文档站点进行测试):
第 1 页
第 2 页
【问题讨论】:
-
你是怎么把这个打印出来的?我不理解问题的那一部分。
-
是的,对不起,我会更新问题。我正在扩展 BrowserCanvas 以实现 Printable,然后覆盖 print,然后应用一些缩放和重新渲染提示,然后调用 BrowserCanvas.print。结果根本不令人满意,打印的页面非常像素化。测试平台为 Linux。
-
我覆盖的打印方法是接受页码的方法,在应用提示、缩放和翻译后,我调用只接受图形对象的超类打印方法,传递我设置的所有这些属性.
-
很晚了,但是您是否尝试过更改 MediaSpec“分辨率”字段?见cssbox.sourceforge.net/manual/#media 和cssbox.sourceforge.net/jstyleparser/api/cz/vutbr/web/css/…
-
@NelsonMenezes 是的,我试过了,但似乎问题出在打印机画布分辨率上。我在 Windows PC 中尝试了 java 程序,画布要大得多。在 Windows 中,由于显示的配置对话框是操作系统对话框,因此可以提高分辨率。但是在 Linux 中,Java 有它自己的打印机配置对话框,选项比操作系统少。它不允许您更改分辨率或质量。
标签: java html css swing printing