import os, json, io from google.oauth2.credentials import Credentials from googleapiclient.discovery import build from googleapiclient.http import MediaIoBaseDownload token_path = os.path.expanduser("~/.hermes/profiles/reviewer/google_token.json") with open(token_path, "r") as f: creds_data = json.load(f) creds = Credentials.from_authorized_user_info(creds_data) docs_service = build("docs", "v1", credentials=creds) drive_service = build("drive", "v3", credentials=creds) doc_id = "1sjTe7Im51CY2Tl0SNQrm8xmO7bYweMkq44E0WXaxs1I" # The table at element [2] has 2 columns: # Col 0 width = 176.2pt (photo placeholder) # Col 1 width = 269.3pt (header text) # Total = 445.5pt. Page width 595.28 - margins 42*2 = 511.28pt usable # Let's widen col0 to 120pt, col1 to 391.28pt so photo box has room # For the positioned objects: # z.000000000.d.0 = photo frame (96.6w x 119.7h pt) with IN_FRONT_OF_TEXT # Change to WRAP_TEXT so surrounding text wraps around it # z.000000000.d.1 = thin 153x1pt line, also IN_FRONT_OF_TEXT # Change to WRAP_TEXT as well requests = [] # Fix positioned object 0: photo frame -> WRAP_TEXT requests.append({ "updatePositionedObjectPositioning": { "objectId": "z.000000000.d.0", "positioning": { "layout": "WRAP_TEXT", "leftOffset": {"magnitude": 5, "unit": "PT"}, "topOffset": {"magnitude": 5, "unit": "PT"}, }, "fields": "layout,leftOffset,topOffset" } }) # Fix positioned object 1: decorative line -> WRAP_TEXT and push below photo requests.append({ "updatePositionedObjectPositioning": { "objectId": "z.000000000.d.1", "positioning": { "layout": "WRAP_TEXT", "leftOffset": {"magnitude": 5, "unit": "PT"}, "topOffset": {"magnitude": 125, "unit": "PT"}, }, "fields": "layout,leftOffset,topOffset" } }) print(f"Sending {len(requests)} requests...") resp = docs_service.documents().batchUpdate( documentId=doc_id, body={"requests": requests} ).execute() print("Done:", resp.get("replies")) # Export PDF print("Exporting PDF...") request = drive_service.files().export_media(fileId=doc_id, mimeType="application/pdf") pdf_bytes = io.BytesIO() downloader = MediaIoBaseDownload(pdf_bytes, request) done = False while not done: status, done = downloader.next_chunk() print(f"Download {int(status.progress() * 100)}%") pdf_path = "/tmp/syyly_nhi_vo_v1.pdf" pdf_bytes.seek(0) with open(pdf_path, "wb") as f: f.write(pdf_bytes.read()) print(f"PDF saved to {pdf_path}") try: import pypdf pdf_bytes.seek(0) reader = pypdf.PdfReader(io.BytesIO(open(pdf_path, "rb").read())) print(f"PDF pages: {len(reader.pages)}") except ImportError: print("pypdf not available, skipping page count")