同一个 PDF 文档的打印方式与在屏幕上查看的方式是不是不同?

Posted

技术标签:

【中文标题】同一个 PDF 文档的打印方式与在屏幕上查看的方式是不是不同?【英文标题】:Can the same PDF document print differently than its viewed on the screen?同一个 PDF 文档的打印方式与在屏幕上查看的方式是否不同? 【发布时间】:2011-04-02 15:38:08 【问题描述】:

例如,您向客户发送包含发票的 PDF 文档,您希望他们在屏幕上以彩色查看您的徽标,但在打印时,您希望您的徽标以可打印的黑白版本打印, 那可能吗?谢谢。

【问题讨论】:

我不知道是否可以用图像代替打印 - 可能不是。在打印对话框中要求/告诉客户手动切换到 s/w 不是一个选项吗? 如果我没记错的话,您可以将内容标记为“仅屏幕”或“屏幕 + 打印”。至少这是 Scribus-NG 让你做的 IIRC 手动切换不是我们想要的。 Scribus-NG 是否支持 PDF 输出中的“屏幕和/或打印”或仅支持其他格式?谢谢你们两位的cmets。 这可以使用水印注释来完成。您可以将一个水印用于屏幕,另一个用于打印。两者必须在同一个位置。您可以设置它们的标志,以便在打印或在屏幕上查看时只显示其中一个。我根据这个要求为我们的PDFOne产品写了一篇文章-Creating Alternative PDF Content For Screen and Print。 【参考方案1】:

有几种方法可以做到这一点。

表单域可以设置为“仅打印”或“仅屏幕”。 “仅图标”按钮字段可以具有任意外观。 Acrobat 的 UI 可以让您导入任何 PDF 页面,而让您生成字段的 API 通常可以让您绘制自己的外观。

可选内容组(又名图层)。 OCG 对于屏幕和打印可以有单独的 ON 和 OFF 状态。 OCG 是一项相对高级的功能,只有更成熟的 API 支持。

我是 iText 的粉丝(和贡献者),iText 是一个 Java 库,可以同时使用这两种方法。构建仅图标按钮会更容易。

PushbuttonField iconButton = new PushbuttonField(myPdfWriter, rectangle, fieldName);
iconButton.setLayout(PushbuttonField.LAYOUT_ICON_ONLY);
iconButton.setScaleIcon(PushbuttonField.SCALE_ICON_ALWAYS);
iconButton.setVisibility(BaseField.HIDDEN_BUT_PRINTABLE);

PdfImportedPage iconAppearance = myPdfWriter.getImportedPage(pdfReader, pageNum);
iconButton.setTemplate(iconAppearance);

myPdfWriter.addAnnotation(iconButton.getField());

这假设您知道生成 PDF 时要使用的矩形,并且有一个包含黑白徽标的 PDF 页面。

注意:iText 在 AGPL 下获得许可,这要求任何有权访问程序的 OUTPUT 的人也可以访问源代码。又名:商业敌对。或者您可以购买商业许可证。以前的版本在 MPL 或 LGPL 下可用,但不再受支持,保存在这样的地方,即使这样,答案也越来越多地是“获得更新的版本”。

【讨论】:

【参考方案2】:

您可以使用图层设置某些内容在打印时显示,而在查看时显示其他内容。

【讨论】:

关于如何做到这一点的任何建议?谢谢。【参考方案3】:

是的,PDF 规范允许创建此类 PDF 文件。但您还必须使用一种工具,让您可以利用 PDF 规范中的这一功能。

【讨论】:

@Mario Awad - 您是通过编程方式还是使用 Acrobat 之类的工具创建 PDF 文件? @Sorin Nistor,我目前正在使用 Acrobat,但我正在寻找两者的答案,因为我正在使用基于 php 的系统来打印发票。谢谢你,祝你有美好的一天:) 我没有使用 PHP 的经验,我不知道支持层(也称为可选内容)的可用 PHP 库。使用 Acrobat,您无法创建简单的图层,您只能创建一个背景、一个水印和一个页眉/页脚。出于演示目的,我创建了这个文件:o2sol.com/download/layers.pdf。它使用背景层进行打印和水印层进行显示。从技术上讲,水印层和背景层之间没有区别。 我明白了。现在我知道存在“层”,我可以在需要时搜索该功能。谢谢你。 (但是,我无法让您的演示文件以不同于显示的方式打印!)。再次感谢。 我使用 Adob​​e Reader 打印文件,我不确定其他阅读器是否正确处理图层功能。 VSU 有一个建议使用注释的答案。这是另一种可以使用的方法,我确信在 PDF 库中比图层功能更容易找到注释功能。但是这种方法存在一个问题,Adobe Reader 可以选择仅打印页面内容而不打印注释,在这种情况下您的徽标将根本不会打印。

以上是关于同一个 PDF 文档的打印方式与在屏幕上查看的方式是不是不同?的主要内容,如果未能解决你的问题,请参考以下文章

阻止 PDF 文件下载和打印

异步任务后在 SwiftUI 中的正确导航方式

添加PDF虚拟打印机教程之任意文档转换成PDF方法

添加PDF虚拟打印机教程之任意文档转换成PDF方法

PDF打印透明背景

C# - 如何使用 PrintDocument 以编程方式打印现有 PDF 文件