有没有办法在 PDF 中为单个图像放置 2 个位图实例?一个在屏幕上查看时显示,另一个在打印时显示?
我们遇到的问题是将图表渲染为位图。如果我们使用 300 dpi,那么轴线、边框等就会消失。如果我们使用 96 dpi,那么打印它看起来很糟糕。
谢谢 - 戴夫
有没有办法在 PDF 中为单个图像放置 2 个位图实例?一个在屏幕上查看时显示,另一个在打印时显示?
我们遇到的问题是将图表渲染为位图。如果我们使用 300 dpi,那么轴线、边框等就会消失。如果我们使用 96 dpi,那么打印它看起来很糟糕。
谢谢 - 戴夫
您可以使用可选内容来执行此操作。为使用应用程序字典提供“打印”事件会导致内容适合打印。(请注意,并非所有打印应用程序都会遵守这一点)。
请参阅我的 1.7 版第 4.10 节“可选内容”中的 PDF 参考手册,从第 364 页开始。
您可以添加一个备用图像字典(PDF Spec,第 8.9.5.4 节),它可以指定要用于打印的图像。
是的,有办法,虽然我不知道。我们用它作为同事的恶作剧,在打印文件时,出现了一些完全不同的图片
您还可以使用 2 个只读文本框字段并在字段外观上绘制图像。然后对于一个字段,您将其可见性设置为 VisibleNonPrintable,而将另一个字段设置为 HiddenButPrintable。
我实现了这个(使用 iText)。对于需要这些的其他人,这是代码。你可以在我的博客上下载源代码。
static void Main(string[] args)
{
Document document = new Document(new Rectangle(0, 0, 8.5f * 72.0f, 11 * 72));
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(Path.GetFullPath(@"..\..\test_dotnet.pdf"), FileMode.OpenOrCreate, FileAccess.ReadWrite));
document.Open();
document.Add(new Paragraph("Visibility test"));
// not displayed on printer
PdfLayer layer = new PdfLayer("screen", writer);
layer.OnPanel = false;
layer.SetPrint("Print", false);
layer.View = true;
PdfContentByte cb = writer.DirectContent;
cb.BeginLayer(layer);
Image img = Image.GetInstance(Path.GetFullPath(@"..\..\building_01.png"));
img.SetAbsolutePosition(72, 72 * 7);
cb.AddImage(img);
cb.EndLayer();
// not displayed on screen
layer = new PdfLayer("print", writer);
layer.OnPanel = false;
layer.SetPrint("Print", true);
layer.View = false;
cb = writer.DirectContent;
cb.BeginLayer(layer);
img = Image.GetInstance(Path.GetFullPath(@"..\..\building_02.png"));
img.SetAbsolutePosition(72, 72 * 3);
cb.AddImage(img);
cb.EndLayer();
document.Close();
Console.Out.WriteLine("all done");
}