4 votos

¿Cómo imprimir en papel de carta virtual que existe como PDF?

¿Cómo imprimir en papel de carta virtual que existe como PDF?

Nuevo en el mundo de Mac OS X y con los MAC. Desde el mundo de Windows tengo un papel de carta virtual con mi, por ejemplo, el logotipo, encabezados, pies de página existentes como un archivo PDF.

Necesitaría poder imprimir universalmente en este PDF existente, como si fuera, por ejemplo, físicamente de una imprenta y se insertara en la bandeja de papel de mi impresora física real.

Habiendo mirado ahora en el mundo de Apple y MAC, me falta una forma de usar ese "guardar pdf" o generar archivo PDF que está incorporado en el propio sistema operativo OS X, pero pre-fusionarlo y mezclarlo con mis vectores/píxeles de mi propio papel de carta virtual PDF suministrado, resultando en un bonito documento oficial, por ejemplo, para casos de negocios y esas cosas.

He leído sobre OS X automator e incluso pdftk y todo, y en Windows es realmente sencillo mediante por ejemplo una impresora virtual.

Pero en la plataforma de Apple, parece que simplemente no hay manera de poner un fondo (mi papel de carta virtual procedente de mi propio PDF) correctamente debajo de cualquier cosa que me gustaría imprimir, ya que Apple o cualquier aplicación parece poner píxeles blancos (en lugar de transparencia) cuando generan a través de sus propios medios incorporados de OS X para generar ese PDF.

¿Qué me falta aquí? ¿Qué pasa si quiero, por ejemplo, imprimir en un papel azul o verde, como los ejemplos más simples de este caso de uso? El sistema de Apple o cualquier aplicación en él, parece generar siempre un papel virtual no transparente y de color blanco, donde mi propio papel de carta virtual no puede competir y no puede brillar.

Además, a través del automatizador sólo encontré formas de estampar en el PDF guardado (eso está bien para los sellos que dicen cosas como muestra, o ejemplo, o borrador y esas cosas) y la impresión por debajo del documento real sería casi imposible debido a ese blanco opaco generado por los píxeles/papel del propio sistema OS X.

Además, el automatizador sólo permite utilizar imágenes/archivos de píxeles como sello encima/debajo, y mi papel de carta ya viene como PDF/vectorizado.

¿Realmente no hay ningún concepto en el actual MAC OS X para mezclar durante la forma incorporada para generar PDFs con mi propio documento / PDF predefinido? ¿O no existe un software de controlador de impresora virtual que haga esto a su manera en la plataforma mac?

¿Algún producto existente para la plataforma MAC OS X que pueda comprar? Gracias de antemano.

4voto

benwiggy Puntos 8

El siguiente Python scriptfusionará un PDF de plantilla en las páginas de cualquier archivo PDF creado en el diálogo de impresión. Tendrá que proporcionar la ruta del archivo PDF de plantilla en el script, y luego guardarlo en su biblioteca de usuario, dentro de una carpeta llamada "Servicios PDF", por ejemplo ~/Library/PDF Services . (Es posible que haya que crearlo, si no está ya ahí).

El scriptpuede entonces ser llamado desde el botón PDF del diálogo de impresión.

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#
# Merge v. 0.1
# Merges two PDFs 

import sys
import os
import Quartz as Quartz
from Foundation import NSURL, kCFAllocatorDefault
from AppKit import NSSavePanel, NSApp

# OPTIONS
watermark = os.path.expanduser("~/Desktop/myTemplate.pdf")
destination = os.path.expanduser("~/Desktop") # Default destination
suffix = " wm.pdf" # Use ".pdf" if no actual suffix required.

# FUNCTIONS

def save_dialog(directory, filename):
    panel = NSSavePanel.savePanel()
    panel.setTitle_("Save PDF booklet")
    myUrl = NSURL.fileURLWithPath_isDirectory_(directory, True)
    panel.setDirectoryURL_(myUrl)
    panel.setNameFieldStringValue_(filename)
    NSApp.activateIgnoringOtherApps_(True)
    ret_value = panel.runModal()
    if ret_value:
        return panel.filename()
    else:
        return ''

# Loads in PDF document
def createPDFDocumentWithPath(path):
    return Quartz.CGPDFDocumentCreateWithURL(Quartz.CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, path, len(path), False))

# Creates a Context for drawing
def createOutputContextWithPath(path, dictarray):
    return Quartz.CGPDFContextCreateWithURL(Quartz.CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, path, len(path), False), None, dictarray)

# Gets DocInfo from input file to pass to output.
# PyObjC returns Keywords in an NSArray; they must be tupled.
def getDocInfo(file):
    file = file.decode('utf-8')
    pdfURL = NSURL.fileURLWithPath_(file)
    pdfDoc = Quartz.PDFDocument.alloc().initWithURL_(pdfURL)
    if pdfDoc:
        metadata = pdfDoc.documentAttributes()
        if "Keywords" in metadata:
            keys = metadata["Keywords"]
            mutableMetadata = metadata.mutableCopy()
            mutableMetadata["Keywords"] = tuple(keys)
            return mutableMetadata
        else:
            return metadata

def main(argv):
    (title, options, pathToFile) = argv[:]
    shortName = os.path.splitext(title)[0]
    # If you want to save to a consistent location, use:
    # writeFilename = os.path.join(destination, shortName + suffix)
    writeFilename = save_dialog(destination, shortName + suffix)
    writeFilename = writeFilename.encode('utf-8')
    shortName = os.path.splitext(pathToFile)[0]
    metaDict = getDocInfo(pathToFile)
    writeContext = createOutputContextWithPath(writeFilename, metaDict)
    readPDF = createPDFDocumentWithPath(pathToFile)
    mergePDF = createPDFDocumentWithPath(watermark)

    if writeContext != None and readPDF != None:
        numPages = Quartz.CGPDFDocumentGetNumberOfPages(readPDF)
        for pageNum in xrange(1, numPages + 1): 
            page = Quartz.CGPDFDocumentGetPage(readPDF, pageNum)
            mergepage = Quartz.CGPDFDocumentGetPage(mergePDF, 1)
            if page:
                mediaBox = Quartz.CGPDFPageGetBoxRect(page, Quartz.kCGPDFMediaBox)
                if Quartz.CGRectIsEmpty(mediaBox):
                    mediaBox = None         
                Quartz.CGContextBeginPage(writeContext, mediaBox)   
                Quartz.CGContextSetBlendMode(writeContext, Quartz.kCGBlendModeOverlay)
                Quartz.CGContextDrawPDFPage(writeContext, page)
                Quartz.CGContextDrawPDFPage(writeContext, mergepage)
                Quartz.CGContextEndPage(writeContext)
        Quartz.CGPDFContextClose(writeContext)
        del writeContext

    else:
        print "A valid input file and output file must be supplied."
        sys.exit(1)

if __name__ == "__main__":
    main(sys.argv[1:])

Actualmente, esto utiliza la primera página del archivo PDF de la plantilla y la pone en todas las páginas del PDF de salida.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X