es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo añadir una imagen local a Google Docs utilizando la API de Google Docs y Python?

Quiero agregar imágenes a mi documento de Google desde mi sistema local utilizando la API de Google Docs, pero leí que solo acepta imágenes de servidores HTTP.

Intenté subir la imagen a Google Drive y luego usé la URL de la imagen en mi código, pero me lanzó un error.

No quiero permitir el acceso a Internet a la imagen desde mi sistema local ya que no sería seguro.

¿Existe alguna otra forma de agregar imágenes a Google Docs desde mi sistema local?

Código de ejemplo (tomado de la solución de Tanaike):

{
    "insertInlineImage": {
        "location": {
            "segmentId": header_id,
            "index": 0
        },
        "uri": "https://stackoverflow.design/assets/img/logos/so/logo-stackoverflow.png",
        # Esta es una imagen de ejemplo.
        "objectSize": {
            "width": {
                "magnitude": 100,
                "unit": "PT"
            }
        }
    }
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como se mencionó, la API de Google Docs solo acepta imágenes de servidores HTTP. Sin embargo, hay una solución alternativa para agregar imágenes desde el almacenamiento local. Puede utilizar el método de carga multipart de la API de Google Drive para cargar la imagen a Google Drive y luego recuperar su URL para usarla en el método insertInlineImage de la API de Google Docs.

    Aquí están los pasos para implementar esta solución alternativa:

    1. Autoriza la API de Google Drive y la API de Google Docs en tu script.
    2. Carga la imagen a Google Drive utilizando el método de carga multipart. Aquí tienes el código de muestra para hacer esto:
      from googleapiclient.discovery import build
      from googleapiclient.errors import HttpError
      from google.oauth2.credentials import Credentials
      import io
      from googleapiclient.http import MediaIoBaseUpload
      
      # Construye el servicio de la API de Drive
      service = build('drive', 'v3', credentials=creds)
      
      # Establece los metadatos del archivo
      file_metadata = {'name': 'nombrearchivo.jpg'}
      
      # Abre el archivo local para cargarlo
      file = open('ruta/hacia/imagenlocal.jpg', 'rb')
      media = MediaIoBaseUpload(file, mimetype='image/jpeg')
      
      # Carga la imagen a Drive
      try:
         file = service.files().create(body=file_metadata, media_body=media,
                                        fields='id').execute()
         file_id = file.get('id')
         print(f'ID del archivo: {file_id}')
      except HttpError as error:
         print(f'Ocurrió un error: {error}')
         file_id = None       
      

      Esto cargará la imagen a Google Drive y devolverá su ID de archivo.

    3. Recupera la URL de la imagen cargada utilizando la API de Drive. Aquí tienes el código de muestra para hacer esto:

      # Construye el servicio de la API de Drive
      service = build('drive', 'v3', credentials=creds)
      
      # Obtiene los metadatos del archivo
      file = service.files().get(fileId=file_id).execute()
      
      # Obtiene la URL del archivo
      file_url = file.get('webContentLink')
      
      # Reemplaza 'export=download' con 'export=media' para obtener la URL de la imagen
      image_url = file_url.replace('export=download', 'export=media')
      print(f'URL de la imagen: {image_url}')
      

      Esto recuperará la URL de la imagen cargada que se puede utilizar en el método insertInlineImage.

    4. Utiliza la URL recuperada en el método insertInlineImage para agregar la imagen al documento de Google. Aquí tienes el código de muestra modificado para hacer esto:

      from googleapiclient.discovery import build
      from googleapiclient.errors import HttpError
      from google.oauth2.credentials import Credentials
      
      # Construye el servicio de la API de Docs
      service = build('docs', 'v1', credentials=creds)
      
      # Define el ID del encabezado y la URL de la imagen
      header_id = 'encabezado1'
      image_url = 'https://drive.google.com/uc?id=xxxxxxxxxxxxxxx'  # Reemplaza con la URL de imagen recuperada
      
      # Inserta la imagen en línea en el encabezado
      requests = [
         {
             'insertInlineImage': {
                 'location': {
                     'segmentId': header_id,
                     'index': 0
                 },
                 'uri': image_url,
                 'objectSize': {
                     'width': {
                         'magnitude': 100,
                         'unit': 'PT'
                     }
                 }
             }
         }
      ]
      result = service.documents().batchUpdate(documentId=doc_id, body={'requests': requests}).execute()
      
      print(f"Se ha insertado la imagen con ID de objeto: {result['replies'][0]['insertInlineImage']['objectId']}")
      

      Esto agregará la imagen al documento de Google desde tu almacenamiento local sin comprometer su seguridad al permitir el acceso desde Internet.

Comments are closed.