在 Mac OS X 10.6.3 下保存 PDF 时应用 Quartz 滤镜

2024-04-24

使用 Mac OS X API,我尝试保存应用了 Quartz 过滤器的 PDF 文件,就像在预览应用程序中的“另存为”对话框中一样。到目前为止,我已经编写了以下代码(使用Python和pyObjC,但这对我来说并不重要):

--filter-pdf.py: 开始

from Foundation import *
from Quartz import *
import objc

page_rect = CGRectMake (0, 0, 612, 792)
fdict = NSDictionary.dictionaryWithContentsOfFile_("/System/Library/Filters/Blue
\ Tone.qfilter")
in_pdf = CGPDFDocumentCreateWithProvider(CGDataProviderCreateWithFilename ("test
.pdf"))
url = CFURLCreateWithFileSystemPath(None, "test_out.pdf", kCFURLPOSIXPathStyle, 
False)
c = CGPDFContextCreateWithURL(url, page_rect, fdict)

np = CGPDFDocumentGetNumberOfPages(in_pdf)
for ip in range (1, np+1):
        page = CGPDFDocumentGetPage(in_pdf, ip)
        r = CGPDFPageGetBoxRect(page, kCGPDFMediaBox)
        CGContextBeginPage(c, r)
        CGContextDrawPDFPage(c, page)
        CGContextEndPage(c)

--filter-pdf.py: 结束

不幸的是,未应用过滤器“蓝色色调”,输出 PDF 看起来与输入 PDF 完全相同。

问题:我错过了什么?如何应用过滤器?

好吧,文档并没有承诺这种创建和使用“fdict”的方式会导致应用过滤器。但我只是重写了(尽我所能)示例代码 /Developer/Examples/Quartz/Python/filter-pdf.py,该代码随旧版本的 Mac 一起分发(同时,此代码也不起作用):

----- filter-pdf-old.py:开始

from CoreGraphics import *
import sys, os, math, getopt, string

def usage ():
  print '''
usage: python filter-pdf.py FILTER INPUT-PDF OUTPUT-PDF

Apply a ColorSync Filter to a PDF document.
'''

def main ():

  page_rect = CGRectMake (0, 0, 612, 792)

  try:
    opts,args = getopt.getopt (sys.argv[1:], '', [])
  except getopt.GetoptError:
    usage ()
    sys.exit (1)

  if len (args) != 3:
    usage ()
    sys.exit (1)

  filter = CGContextFilterCreateDictionary (args[0])
  if not filter:
    print 'Unable to create context filter'
    sys.exit (1)
  pdf = CGPDFDocumentCreateWithProvider (CGDataProviderCreateWithFilename (args[1]))
  if not pdf:
    print 'Unable to open input file'
    sys.exit (1)

  c = CGPDFContextCreateWithFilename (args[2], page_rect, filter)
  if not c:
    print 'Unable to create output context'
    sys.exit (1)

  for p in range (1, pdf.getNumberOfPages () + 1):
    #r = pdf.getMediaBox (p)
    r = pdf.getPage(p).getBoxRect(p)
    c.beginPage (r)
    c.drawPDFDocument (r, pdf, p)
    c.endPage ()

  c.finish ()

if __name__ == '__main__':
  main ()

----- filter-pdf-old.py: 结束

=================================================== =====================

基于答案的工作代码:

from Foundation import *
from Quartz import *

pdf_url = NSURL.fileURLWithPath_("test.pdf")
pdf_doc = PDFDocument.alloc().initWithURL_(pdf_url)

furl = NSURL.fileURLWithPath_("/System/Library/Filters/Blue Tone.qfilter")
fobj = QuartzFilter.quartzFilterWithURL_(furl)
fdict = { 'QuartzFilter': fobj }
pdf_doc.writeToFile_withOptions_("test_out.pdf", fdict)

有两种方法 - 如果您需要打开并修改现有文件,请使用 PDFKit 的 PDFDocument (参考 https://developer.apple.com/documentation/pdfkit/pdfdocument)并使用 PDFDocument 的 writeToFile_withOptions_ 和选项 dict,包括所需过滤器的“QuartzFilter”选项。

OTOH 如果您需要自己的绘图并且手头有 CGContext,您可以使用以下内容:

from Quartz import *
data = NSMutableData.dataWithCapacity_(1024**2)
dataConsumer = CGDataConsumerCreateWithCFData(data)
context = CGPDFContextCreate(dataConsumer, None, None)
f = QuartzFilter.quartzFilterWithURL_(NSURL.fileURLWithPath_("YourFltr.qfilter"))
f.applyToContext_(context)
# do your drawing
CGPDFContextClose(context)
# the PDF is in the data variable. Do whatever you need to do with the data (save to file...).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Mac OS X 10.6.3 下保存 PDF 时应用 Quartz 滤镜 的相关文章

随机推荐

  • Cordova DeviceReady 未触发

    这几天我一直在为这个问题苦苦思索 在尝试创建新的 FileTransfer 对象时出现许多 对象未定义 错误后 看起来问题更加基本 不知何故 DeviceReady 事件没有触发 Stack Overflow 在这个问题上有很多点击 但其中
  • 使用 nHibernate 序列化 DetachedCriteria

    我正在尝试序列化 DetachedCriteria 以便可以将其保存在数据库中并在以后重用相同的条件 当我运行下面的代码时 我得到 NHibernate Criterion DetachedCriteria 无法序列化 因为它没有无参数构造
  • Wagtail / Hallo.js - 添加插件但修改的内容未保存

    我正在 Wagtail 1 3 1 Django 1 7 11 上运行 我已经激活了 Hallohtml 和 Hallojustify 插件 它们出现在工具栏中 没有图标 但有按钮 可以使用按钮 并且可以在文本区域中看到修改 我的意思是 例
  • 如何使以下 readAsDataURL 返回多个 readAsDataURL?

    此函数读取从输入字段获取的文件并返回其 dataUrls readAsDataURL target target gt
  • 无法使用 Spring 的 WebServiceTemplate 将 Http 标头添加到消息中

    我有一个相当简单的情况 我尝试将 HTTP 标头 不是 SOAP 标头 添加到我使用 Spring 发出的请求中WebServiceTemplate 我定义了一个ClientInterceptor我在哪里做 Override public
  • Numpy 中如何获得向量的大小?

    为了与 只有一种明显的方法可以做到这一点 保持一致 如何在 Numpy 中获取向量 一维数组 的大小 def mag x return math sqrt sum i 2 for i in x 上面的方法有效 但是我无法相信我必须自己指定这
  • Android JNI异常处理

    我需要在 JNI 代码中实现异常处理 我不擅长 jni 找不到任何好的例子 因此 请提供完整的示例 这就是我正在做的 jint JNI OnLoad JavaVM vm void reserved jint result 1 g JavaV
  • 为什么 nhibernate 3.3 不允许 ICollection 上的私有 setter?

    我从 nhibernate 3 2 升级到 nhibernate 3 3 并且在我的域类中定义了很多虚拟成员 如下所示 public virtual ICollection
  • Django Channels - 无法在断开连接时发送消息

    我希望能够在用户断开连接时向房间组发送消息 以便更新玩家列表 似乎一旦断开连接就不可能了 这在某种程度上是有意义的 但是在断开用户连接之前我如何能够向通道发送消息 我有以下代码 async def disconnect self close
  • 不太无用的“yes”bash 命令:如何在每个循环中确认命令

    我编写了一个循环来解压缩目录中的所有 zip 文件 for f in zip do unzip f done 但是 我必须在每一步确认覆盖 replace file123 txt y es n o A ll N one r ename A
  • Functions Bot 是否不再是 Azure 中推荐的机器人服务?

    我有一个无服务器系统 我希望向其中添加 Bot Framework 主要是为了提供与不同聊天渠道的集成 我正在考虑尝试在 Bot Service 中创建一个 Functions Bot 但是当我开始创建一个时 我收到以下信息消息 Funct
  • adArray 的 VBScript / ADODB 语法问题?

    我希望有人能给我一些关于我的 vb 脚本的新视角 该脚本的主要目的是使用一些参数执行存储过程 我得到的错误是 预计声明结束 我没有做过太多的 VB 脚本编写 但从目前为止我发现的情况来看 这个错误是由于某种语法问题造成的 我已经查看这个脚本
  • 如何在asp.net mvc中从https跳出到http模式

    我通过在控制器操作上添加属性 RequireSSL 使我的登录页面启用了 Https 并且工作正常 但登录成功后仍处于https环境 但页面为非https页面 谁能给我解决如何从 https 模式退出到 http 模式的问题吗 在这方面的任
  • Django django-location-field 缺少 API 密钥

    我正在使用https github com caioariede django location field https github com caioariede django location field使用 Django 构建位置视图
  • 结合阴影误差和实线平均值的图例

    我在用此 FEX 条目 http www mathworks com matlabcentral fileexchange 27485 boundedline line plots with shaded errorconfidence i
  • 如何避免c#中windows窗体的多个实例

    如何避免在 C 中出现多个 Windows 窗体实例 我只想运行该表单的一个实例 因为有机会从我的申请的许多页面打开相同的表格 是的 它有单例模式 创建单例对象的代码 public partial class Form2 Form priv
  • 如何使用 javafx 隐藏或停用 TextField 和 Label

    我想隐藏或停用TextField和它的Label在我的 JavaFX 应用程序中 这就是我尝试过的 myTextField setVisible false 但它不起作用 我在 Windows 7 上使用 Eclipse V4 5 0 和
  • 基于字符串创建ViewBag属性

    有没有办法基于字符串创建和使用 ViewBag 的动态属性 就像是 ViewBag CreateProperty MyProperty ViewBag Property MyProperty Myvalue 谢谢 我刚刚发现 ViewDat
  • 使用表达式时ggplot右对齐轴文本

    我正在制作一个带有长轴标签的条形图 我需要将其换行并右对齐 唯一的复杂之处是我需要添加一个表达式来具有上标 library ggplot2 library scales df lt data frame levs c a long labe
  • 在 Mac OS X 10.6.3 下保存 PDF 时应用 Quartz 滤镜

    使用 Mac OS X API 我尝试保存应用了 Quartz 过滤器的 PDF 文件 就像在预览应用程序中的 另存为 对话框中一样 到目前为止 我已经编写了以下代码 使用Python和pyObjC 但这对我来说并不重要 filter pd