Se necesita una secuencia de comandos para exportar automáticamente archivos PDF con notas incrustadas

1

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

Pero como hay muchos archivos, necesito una secuencia de comandos que pase automáticamente por 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 simples" (o alguna otra designación para indicar que es la versión con notas incrustadas). En segundo lugar, si hago más anotaciones en el PDF original, sería genial si 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 idea de cómo crear uno.

Muchas gracias por cualquier ayuda que pueda ofrecer. WG

    
pregunta william 17.10.2015 - 18:50

3 respuestas

0

He cargado un script, que contiene una utilidad de línea de comandos descargada desde skim, y usa este código (nota, ¡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 desde aquí . Arrastre todos los archivos PDF (los archivos, no la carpeta) al droplet extraído del archivo zip, ¡y debería convertir todo casi al instante!

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

    
respondido por el William T Froggard 18.10.2015 - 06:31
1

Este es el método que utilicé en toda mi biblioteca de Zotero (~ 3GB de PDF). Tenga en cuenta que las únicas anotaciones que utilizo son el resaltado (un solo color) y los comentarios. Si esto convierte o no con éxito las anotaciones más complicadas depende de los detalles del script skimembed, del cual no sé mucho.

Lo que funcionó

El script de skimembed original convierte un solo PDF con anotaciones de skim (que están en la forma de "atribuido extendido") a un solo PDF con anotaciones incrustadas. Es un script de shell que se ejecuta desde la línea de comandos (terminal) usando esta notación

sh skimembed pdf_with_skim_annotations.pdf

o más en general

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

Aquí, sh es el programa de shell que se usa para interpretar el script skimembed . Básicamente, esta secuencia de comandos es solo una forma automatizada de usar File > Export...PDF with embedded notes desde el menú Skim. Sin embargo, no hace una segunda copia del pdf; la nueva versión lo reemplaza y tiene el mismo nombre.

Luego busqué en Google para un script de shell que te permite aplicar skimembed recursivamente a todos los archivos pdf en 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 comando find devuelve todos los archivos normales ( -type f ) en esa carpeta con el final del pdf ( name "*.pdf" ). Los resultados se canalizan ( | ) a un bucle while indexado por f .

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

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

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

Lo que no funcionó

Probé los scripts de Skim enviados por el usuario y, en particular, el skimalot script (que es un sucesor de Skimembed) y el FilingEagleEarchivo y algunos otro . Pero no pude hacer que ninguno de ellos trabajara. (Tenga en cuenta que los archivos alojados en sugarsync.com son enlaces muertos ahora.) Del mismo modo, the half docena AppleScript scripts siempre parecen fallar con errores completamente inescrutables.

El script clobbergaurd se supone que comprueba un directorio grande para los nombres de archivo que difieren solo en terminando para evitar que sobrescribas cosas usando skimalot, pero no pude hacer que funcionara. (El enlace de sugarsync está muerto, pero una búsqueda en Google mostró esta copia de Dropbox ). subí a mi biblioteca de zotero y crucé mis dedos.

    
respondido por el Jess Riedel 08.05.2016 - 18:24
1

Tuve el mismo problema y quería incrustar por lotes una gran cantidad de archivos PDF desnatados. El script de Apple de Jess Riedel no me funcionaba, así que codifiqué un script de Python para hacer el trabajo (soy consciente de que esta es la página StackExchange de Applecript).

Utilicé el script para incrustar 568 archivos PDF dispersos en una carpeta con varias subcarpetas. Tomó 300 segundos. Tenga en cuenta que la secuencia de comandos no procesará archivos con un " en su ruta de archivo.

# -*- 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')
    
respondido por el Alexander Gogl 29.10.2018 - 23:24

Lea otras preguntas en las etiquetas