【问题标题】:Java - How to improve rendering when printing?Java - 如何在打印时改进渲染?
【发布时间】: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/#mediacssbox.sourceforge.net/jstyleparser/api/cz/vutbr/web/css/…
  • @NelsonMenezes 是的,我试过了,但似乎问题出在打印机画布分辨率上。我在 Windows PC 中尝试了 java 程序,画布要大得多。在 Windows 中,由于显示的配置对话框是操作系统对话框,因此可以提高分辨率。但是在 Linux 中,Java 有它自己的打印机配置对话框,选项比操作系统少。它不允许您更改分辨率或质量。

标签: java html css swing printing


【解决方案1】:

我相信您可以尝试渲染一个新的可打印网页。由于您要覆盖样式,也许您可​​以添加新的媒体查询或打印样式表,如下所示:

@media print { 
 /* All your print styles go here */
 #header, #footer, #nav { display: none !important; } 
}

或者,以旧的方式:

<link href="/print.css" rel="stylesheet" media="print" type="text/css" />

然后您就可以从操作系统的任何浏览器中使用打印对话框

【讨论】:

  • 我已经放弃了创建一个自动化流程的应用程序。现在我只是在打印之前修改页面的样式。也许我可以编写一个自动执行它的浏览器扩展。有可读性,但它意味着优化移动页面而不是打印,字体太大。它可以让你调整字体大小,但即使是最小的也太大了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
  • 2015-10-04
  • 2016-05-06
相关资源
最近更新 更多