PDF中有2个位图分辨率

PDF中有2个位图分辨率,pdf,pdf-generation,Pdf,Pdf Generation,是否有一种方法可以在PDF中为单个图像放置两个位图实例?一个在屏幕上查看时显示,另一个在打印时显示 我们遇到的问题是将图表渲染为位图。如果我们使用300 dpi,那么轴线、边界等就会消失。如果我们使用96 dpi,那么打印看起来很糟糕 谢谢-戴夫是的,有办法,尽管我不知道。我们将其用作同事的恶作剧,当打印文档时,会出现一些完全不同的图片您可以使用可选内容来执行此操作。向使用应用程序词典提供“打印”事件会导致内容适合打印。(请注意,并非所有印刷申请都会遵守这一规定) 请参阅PDF参考手册,my 1

是否有一种方法可以在PDF中为单个图像放置两个位图实例?一个在屏幕上查看时显示,另一个在打印时显示

我们遇到的问题是将图表渲染为位图。如果我们使用300 dpi,那么轴线、边界等就会消失。如果我们使用96 dpi,那么打印看起来很糟糕


谢谢-戴夫是的,有办法,尽管我不知道。我们将其用作同事的恶作剧,当打印文档时,会出现一些完全不同的图片

您可以使用可选内容来执行此操作。向使用应用程序词典提供“打印”事件会导致内容适合打印。(请注意,并非所有印刷申请都会遵守这一规定)


请参阅PDF参考手册,my 1.7 edition第4.10节“可选内容”,从第364页开始。

您还可以使用2个只读文本框字段,并在字段外观上绘制图像。然后,对于一个字段,将其可见性设置为VisibleNonPrintable,对于另一个HiddenButPrintable

您可以添加一个替代图像字典(,第8.9.5.4节),该字典可以指定用于打印的图像。

我实现了这一点(使用iText)。对于其他需要这些的人,这里是代码。和


+1; 在ISO 32000-1规范中,第8.11节涉及可选内容。
    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");
    }