3 votos

Necesito script para exportar automáticamente los PDF de Skim con notas incrustadas

Tengo una carpeta con unos cuantos miles de archivos PDF, la mayoría de los cuales tienen anotaciones Skim (por ejemplo, resaltados y notas). Si tuviera menos archivos, simplemente pasaría por cada uno, exportaría el PDF con las notas incrustadas y seguiría mi camino, teniendo la posibilidad de leer mis anotaciones con Adobe Reader en un PC (este es el objetivo).

Pero como hay tantos archivos, necesito un script que recorra automáticamente esta carpeta, realice la función "exportar como PDF con notas incrustadas" para cada PDF que tenga anotaciones Skim, y luego dé al nuevo archivo el nombre del archivo original más "con notas Skim" (o alguna otra designación que indique que es la versión con notas incrustadas). En segundo lugar, si hago más anotaciones en el PDF original, sería genial que el script pudiera actualizar el archivo exportado con las notas incrustadas.

Supongo que esto es posible, ya que parece que Skim tiene un gran soporte de applescript, pero no tengo ni idea de cómo crear uno.

Muchas gracias por la ayuda que puedan ofrecer. WG

3voto

Alexander Gogl Puntos 46

Yo tenía el mismo problema y quería incrustar por lotes un montón de pdfs descremados. El apple script de Jess Riedel no me funcionaba, así que codifiqué un script de Python para hacer el trabajo.

Usé el script para incrustar 568 pdfs dispersos en una carpeta con varias subcarpetas. Me ha llevado 300 segundos. Tenga en cuenta, que el script no procesará los archivos con un " en su ruta de archivo.

Es posible crear una acción de carpeta en osx que ejecute el script sobre los archivos modificados en una carpeta de forma automática, cada vez que un archivo cambia. Todavía no he desarrollado una porque no he encontrado ninguna necesidad de ella.

Puedes descargar el script como servicio osx y como flujo de trabajo alfred en https://github.com/alexandergogl/SkimPDF .

# -*- coding: utf-8 -*-

from os import system, walk, path

class SkimPDF(object):
    """docstring for SkimPDF."""
    def __init__(self):
        self.skimpdf_path = '/Applications/Skim.app/Contents/SharedSupport/skimpdf'
        self.embed_suffix = '_embeded'
        self.replace = False
        pass

    def embed_notes(self, in_pdf):
        """Embed skim notes to PDF."""
        if self.replace is False:
            out_pdf = "%s%s.pdf" % (in_pdf[:-4], self.embed_suffix)
        else:
            out_pdf = in_pdf

        # Embed notes
        cmd = '%s embed "%s" "%s"' % (self.skimpdf_path, in_pdf, out_pdf)
        result = system(cmd)

        # Compose message
        if result == 0:
            message = "Embeded notes to '%s'" % in_pdf
        else:
            message = result

        return message

    def embed_notes_batch(self, folder):
        """Loop through directories in given folder and embed notes."""
        messages = []
        i = 0
        for path, subdirs, files in walk(folder):
            for name in files:
                if name.endswith(".pdf"):
                    i += 1
                    # embed notes to pdf
                    pdf_file = "%s/%s" % (path, name)
                    result = skim.embed_notes(pdf_file)
                    # add result message to report
                    messages.append(result)
                    # report current state
                    print(i)

        self.report(messages)
        pass

    def report(self, messages):
        """Print list of processed pdfs."""
        print("\n\nProcessing PDFs done:")

        for i in range(len(messages)):
            message = "%s: %s" % (i + 1, messages[i])
            print(message)
        pass

skim = SkimPDF()
skim.replace = True  # set to false if you want a copy in place instead
# skim.embed_suffix = '_embeded'  # uncomment and enter your own suffix if necessary

# embed notes of a single pdf
skim.embed_notes('../path/to/pdf file.pdf')

# batch embeding process with path to folder with literature
skim.embed_notes_batch('../path/to/Literature folder')

2voto

Jess Riedel Puntos 121

Este es el método que he utilizado en toda mi biblioteca Zotero (~3GB de PDFs). Tenga en cuenta que las únicas anotaciones que utilizo son el resaltado (un solo color) y los comentarios. Que esto convierta con éxito anotaciones más complicadas depende del detalle del skimembed script, del que no sé mucho.

Lo que ha funcionado

El original skimembed script convierte un único PDF con anotaciones en forma de "atributo extendido" en un único PDF con anotaciones incrustadas. Es un shell script que se ejecuta desde la línea de comandos (terminal) utilizando esta notación

sh skimembed pdf_with_skim_annotations.pdf

o más generalmente

sh /path/to/scripts/folder/skimembed /path/to/pdf/folder/pdf_with_skim_annotations.pdf

Aquí, sh es el programa de shell que se utiliza para interpretar el script skimembed . Este script básicamente es una forma automatizada de utilizar File > Export...PDF with embedded notes en el menú de descremado. Sin embargo, no hace una segunda copia del pdf; la nueva versión la sustituye y tiene el mismo nombre.

Entonces busqué en Google un shell script que permite aplicar skimembed recursivamente a todos los archivos pdf de una carpeta (incluidas las subcarpetas):

#!/bin/bash 
find $1 -type f -name "*.pdf" | while read f ; do
 sh /path/to/scripts/filder/skimembed "$f"
done

Aquí, $1 denota la ruta a una carpeta, el primer (y único) argumento que este script espera recibir. El find devuelve todo lo normal ( -type f ) en esa carpeta con la terminación pdf ( name "*.pdf" ). Los resultados se canalizan ( | ) a un while bucle indexado por f .

Guardé el texto anterior en un archivo llamado recursiveskiembed.sh y luego ejecuté

sh recursiveskiembed.sh /path/to/pdfs/folder

En mi caso, la carpeta que elegí fue /Users/username/Library/Application Support/Zotero/Profiles/xxx123.default/zotero/storage . Esto toma cada uno de los PDF con anotaciones Skim en la carpeta y los reemplaza con anotaciones PDF normales, incrustadas.

Lo que no funcionó

Probé el Skim scripts enviados por el usuario y en particular el skimalot script (que es un sucesor de skimembed) y el FilingEagle script y otros . Pero no pude conseguir que ninguno de ellos funcionara. (Tenga en cuenta que el archivos alojados en sugarsync.com son enlaces muertos ahora). Igualmente, el medio docena AppleScript scripts siempre parecen fallar con errores completamente inescrutables.

El clobbergaurd script se supone que comprueba un directorio grande para los nombres de archivo que difieren sólo en el final para evitar que se sobrescriba cosas usando skimalot, pero no pude conseguir que funcione. (El enlace de sugarsync está muerto, pero una búsqueda en Google me permitió encontrar esta copia de Dropbox .) Así que hice una copia de seguridad de mi biblioteca zotero y crucé los dedos.

1voto

William T Froggard Puntos 2862

He subido un script, que contiene una utilidad de línea de comandos descargada de skim, y utiliza este código (¡no funcionará sin la utilidad!):

on open dropped_files
    set app_path to POSIX path of (path to me)
    repeat with current_file in dropped_files
        do shell script quoted form of (app_path & "Contents/Resources/skimpdf") & " embed " & quoted form of POSIX path of current_file & " " & quoted form of (((characters 1 through -5 of (POSIX path of current_file as string)) as string) & " with skim notes.pdf")
    end repeat
end open

Puede descargarlo en aquí . Arrastra todos los PDF (los archivos, no la carpeta) al droplet extraído del archivo zip, y debería convertirlo todo casi al instante.

Nota: Tendrás que hacer clic con el botón derecho del ratón en la aplicación y abrirla una vez desde el Finder, para evitar la advertencia de "desarrollador desconocido" y poder utilizar el droplet. Después de eso, ya estará todo listo.

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