我有一个专为打印而设计的视图,其中包括水印,一个透明视图,可在其他内容之上绘制一些文本。
打印和使用 Mac OS 另存为 PDF 功能时,可以选择水印文本。有时这会干扰选择其他内容,有时它只是分散注意力。
如何使生成的 PDF 中的文本不可选?
我尝试将水印绘制在其他内容后面而不是前面。它不会阻止选择水印,但不会妨碍其他内容。然而,表视图行遮挡了水印,这当然更糟糕。
评论者要求提供代码,所以这里有一些准备视图的代码:
// self.view is the print view
// watermark is an instance of WatermarkBackground, an NSView
if (watermark) {
watermark.frame = self.view.frame;
[self.view addSubview:watermark positioned:NSWindowAbove relativeTo:nil];
}
以及 [WatermarkBackground drawRect] 中进行绘图的行:
// _message is an NSString
// textAttributes returns a dictionary with a color and font
[_message drawWithRect:textRect
options:NSLineBreakByWordWrapping
attributes:[WatermarkBackground textAttributes]];
我本来想发布这个截图:
一种选择是从字符串中创建一个或多个
CGPath
并将它们绘制到 PDF 中。一种方法是使用 CTFontCreatePathForGlyph
,但实际上对整个字符串执行此操作需要大量工作,Core Text 确实有帮助,但它是一个相当低级的框架。
如果您总是绘制相同的水印,则在某些矢量图形应用程序中创建静态 PDF 并将其与
CGPDFPageDraw
等一起使用会更容易。Illustrator 有一个用于文本对象的“转换为路径”命令。
据我所知,没有办法使PDF中的文本变得不可选择。 可能最好的解决方案是使用图像水印。
但是,如果它位于文本前面,则会导致背景文本难以选择。如果它位于所有内容的后面,那么用表格来模糊它也会出现同样的问题。因此,更好的行动计划可能不是尝试使文本不可选择,而是使表格背景透明。然后,使用图像水印。
借鉴 omz 的想法,最简单、最优雅的解决方案是这样的,而不是使用 CGPaths 并动态生成它们:
有一个解决方案可以使整个 PDF 不可选择且无法复制。
这样,生成的新 PDF 就变成了一组像素,而不是精心渲染的矢量字体、文本、形状等。虽然阅读起来不太好,但仍然足够好。