0 votos

Cómo crear un script con Automator para poner una marca de agua a cada PDF de una carpeta con una marca de agua diferente?

Estoy intentando crear un script para poner una marca de agua a un grupo de archivos PDF en una carpeta, cada PDF tiene que tener una marca de agua única.

Todos los PDFs están en una carpeta, todas las marcas de agua están en .png ubicadas en otra carpeta. Actualmente tengo la marca de agua script que encontré en los foros de Apple, pero esto se hizo para marcar todos los archivos con una sola marca de agua.

Lo que necesito es una manera de poner una marca de agua a cada archivo PDF con su propia marca de agua diferente (hay 400 pdfs y 400 marcas de agua diferentes)

Automator Screenshot

Este es el contenido de la marca de agua tool.py :

#!/usr/bin/python
# Watermark each page in a PDF document

import sys #, os
import getopt
import math
from Quartz.CoreGraphics import *
from Quartz.ImageIO import *

def drawWatermark(ctx, image, xOffset, yOffset, angle, scale, opacity):
    if image:
        imageWidth = CGImageGetWidth(image)
        imageHeight = CGImageGetHeight(image)
        imageBox = CGRectMake(0, 0, imageWidth, imageHeight)

        CGContextSaveGState(ctx)
        CGContextSetAlpha(ctx, opacity)
        CGContextTranslateCTM(ctx, xOffset, yOffset)
        CGContextScaleCTM(ctx, scale, scale)
        CGContextTranslateCTM(ctx, imageWidth / 2, imageHeight / 2)
        CGContextRotateCTM(ctx, angle * math.pi / 180)
        CGContextTranslateCTM(ctx, -imageWidth / 2, -imageHeight / 2)
        CGContextDrawImage(ctx, imageBox, image)
        CGContextRestoreGState(ctx)

def createImage(imagePath):
    image = None

    # provider = CGDataProviderCreateWithFilename(imagePath)    # FIXED: replaced by the following CGDataProviderCreateWithURL()
    url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, imagePath, len(imagePath), False)
    provider = CGDataProviderCreateWithURL(url)

    if provider:
        imageSrc = CGImageSourceCreateWithDataProvider(provider, None)
        if imageSrc:
            image = CGImageSourceCreateImageAtIndex(imageSrc, 0, None)
    if not image:
        print "Cannot import the image from file %s" % imagePath
    return image

def watermark(inputFile, watermarkFiles, outputFile, under, xOffset, yOffset, angle, scale, opacity, verbose):

    images = map(createImage, watermarkFiles)

    ctx = CGPDFContextCreateWithURL(CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, outputFile, len(outputFile), False), None, None)
    if ctx:
        pdf = CGPDFDocumentCreateWithURL(CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, inputFile, len(inputFile), False))
        if pdf:

            for i in range(1, CGPDFDocumentGetNumberOfPages(pdf) + 1):
                image = images[i % len(images) - 1]
                page = CGPDFDocumentGetPage(pdf, i)
                if page:
                    mediaBox = CGPDFPageGetBoxRect(page, kCGPDFMediaBox)
                    if CGRectIsEmpty(mediaBox):
                        mediaBox = None

                    CGContextBeginPage(ctx, mediaBox)
                    if under:
                        drawWatermark(ctx, image, xOffset, yOffset, angle, scale, opacity)
                    CGContextDrawPDFPage(ctx, page)
                    if not under:
                        drawWatermark(ctx, image, xOffset, yOffset, angle, scale, opacity)
                    CGContextEndPage(ctx)

        del pdf
        CGPDFContextClose(ctx)
    del ctx

def main(argv):

    verbose = False
    readFilename = None
    writeFilename = None
    under = False
    xOffset = 0.0   # FIXED: changed to float value
    yOffset = 0.0   # FIXED: changed to float value
    angle = 0.0     # FIXED: changed to float value
    scale = 1.0     # FIXED: added
    opacity = 1.0

    # Parse the command line options
    try:
        options, args = getopt.getopt(argv, "vutx:y:a:p:s:i:o:", ["verbose", "under", "over", "xOffset=", "yOffset=", "angle=", "opacity=", "scale=", "input=", "output=", ])
    except getopt.GetoptError:
        usage()
        sys.exit(2)

    for option, arg in options:

        print option, arg

        if option in ("-i", "--input") :
            if verbose:
                print "Reading pages from %s." % (arg)
            readFilename = arg

        elif option in ("-o", "--output") :
            if verbose:
                print "Setting %s as the output." % (arg)
            writeFilename = arg

        elif option in ("-v", "--verbose") :
            print "Verbose mode enabled."
            verbose = True

        elif option in ("-u", "--under"):
            print "watermark under PDF"
            under = True

        elif option in ("-t", "--over"):    # FIXED: changed to "-t" from "t"
            print "watermark over PDF"
            under = False

        elif option in ("-x", "--xOffset"):
            xOffset = float(arg)

        elif option in ("-y", "--yOffset"):
            yOffset = float(arg)

        elif option in ("-a", "--angle"):
            angle = -float(arg)

        elif option in ("-s", "--scale"):
            scale = float(arg)

        elif option in ("-p", "--opacity"):
            opacity = float(arg)

        else:
            print "Unknown argument: %s" % (option)

    if (len(args) > 0):
        watermark(readFilename, args, writeFilename, under, xOffset, yOffset, angle, scale, opacity, verbose);
    else:
        shutil.copyfile(readFilename, writeFilename);

def usage():
    print "Usage: watermark --input <file> --output <file> <watermark files>..."

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

1voto

user3439894 Puntos 5883

He probado esto bajo MacOS Catalina utilizando el código de la tool.py en el OP y el valor de la opciones que se muestra para ello, mientras que el uso de PDF documentos y archivos de imágenes gráficas para el marca de agua donde el archivos están en diferentes lugares. A mí me funciona tal y como está codificado.

Lo siguiente ejemplo shell script código supone que para cada PDF documento existe el correspondiente archivo de imagen gráfica del mismo nombre con una extensión con todas las marcas de agua archivos estar en un lugar diferente directorio .

Tendrá que establecer el valor de tres variables en la parte superior del script , p2wf , wext y fqp2pyf , mientras que el resto de la valores del original script se mantienen excepto cuando ya han sido modificados.

En el Automatizador flujo de trabajo utilizando un Obtener los elementos del buscador especificados acción para el PDF documentos y un Ejecutar Shell script acción ajustado como se muestra en su OP:

  • Shell: [/bin/bash]
  • Pasa la entrada: [como argumentos]

Sustituir cualquier código en el Ejecutar Shell script acción , por defecto o no, con:

    # Path to watermark files.
    # Example: "${HOME}/Pictures/Watermarks"
    # Watermark file extension, e.g.: png
    # Fully qualified pathname to python 'tool.py' file.
    # Example: "${HOME}/bin/tool.py"

p2wf="${HOME}/Pictures/Watermarks"
wext="png"
fqp2pyf="${HOME}/bin/tool.py"

    # f = fully qualified pathname
    # d = directory pathname
    # fn = filename with extension
    # n = filename without extension
    # e = filename extension

for f in "$@"; do

    d="${f%/*}"
    fn="${f##*/}"
    n="${fn%.*}"
    e="${fn##*.}"

    "${fqp2pyf}" \
    --over \
    --xOffset 56 \
    --yOffset 58 \
    --angle 0 \
    --scale 0.11 \
    --opacity 1 \
    --input "${f}" \
    --output "${d}/${n} (COPY).${e}" \
    "${p2wf}/${n}.${wext}"

done  

Nota: Por experiencia, nunca utilizo ~ para el directorio principal en scripts . Utilizo, por ejemplo, $HOME o ${HOME} como ~ puede ser realmente problemático en algunas situaciones.

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