3

有没有办法在 PDF 中为单个图像放置 2 个位图实例?一个在屏幕上查看时显示,另一个在打印时显示?

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

谢谢 - 戴夫

4

5 回答 5

5

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

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

于 2013-02-08T08:33:29.083 回答
1

您可以添加一个备用图像字典PDF Spec,第 8.9.5.4 节),它可以指定要用于打印的图像。

于 2013-02-08T10:34:35.047 回答
0

是的,有办法,虽然我不知道。我们用它作为同事的恶作剧,在打印文件时,出现了一些完全不同的图片

于 2013-02-08T00:50:01.753 回答
0

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

于 2013-02-08T10:23:23.417 回答
0

我实现了这个(使用 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");
    }
于 2013-02-24T15:35:22.983 回答