Welcome!
This is the community forum for my apps Pythonista and Editorial.
For individual support questions, you can also send an email. If you have a very short question or just want to say hello β I'm @olemoritz on Twitter.
Paths and saving files
-
@benwiggy thus, first question, reason of the crash...
-
I don't know what the cause is, but it only happens when I uncomment the writeToFile line.
Is there a log somewhere?
-
@benwiggy Install this script
as pythonista_startup.py in your site-packages directory of Pythonista, restart Pythonista and retry your code, you will get the log **after next restart ** -
@benwiggy This very little and ugly script works...
It picks a pdf and write it as PDFDocument to Pythonista iCloudfrom objc_util import * import dialogs fil = dialogs.pick_document() url = nsurl(fil) PDFDocument = ObjCClass('PDFDocument').alloc().initWithURL_(url) #print(dir(PDFDocument)) outFilename = '/private/var/mobile/Library/Mobile Documents/iCloud~com~omz-software~Pythonista3/Documents/xxx.pdf' PDFDocument.writeToFile_(outFilename)
-
Thanks.
It's complaining about NSURL not having a string parameter for initFileURLWithPath when it crashes, but it doesn't complain about when writeToFile is commented out, which is weird.
I'm trying to convert some MacOS PyObjC code into something that'll work here.
Thanks for the example: I'll give it a try.
-
@benwiggy is it possible to post your code?
-
import os from objc_util import * from pathlib import Path import dialogs PDFDocument = ObjCClass('PDFDocument') NSURL = ObjCClass('NSURL') home = "/private/var/mobile/Library/Mobile Documents/iCloud~com~omz-software~Pythonista3/Documents/" def rotate(filename): shortName = Path(filename).stem outFilename = home + shortName + "+90.pdf" pdfURL = NSURL.fileURLWithPath_(filename) pdfDoc = PDFDocument.alloc().initWithURL_(pdfURL) if pdfDoc: pages = pdfDoc.pageCount() for p in range(0, pages): page = pdfDoc.pageAtIndex_(p) existingRotation = page.rotation() newRotation = existingRotation + 90 page.setRotation_(newRotation) outFilename = Path(outFilename) print (outFilename) pdfDoc.writeToFile_(outFilename) if __name__ == '__main__': filename = dialogs.pick_document(types=['public.data']) rotate(filename)
-
@benwiggy by commenting this line, it works
#outFilename = Path(outFilename)
-
Brilliant! I told you I was confused about Path !!
Excellent. Hopefully I should now be able to modify all my MacOS python scripts for PDFs along the same lines.
Many thanks.
-
@benwiggy I didn't even know the existence of pathlib π
-
@benwiggy, did you look at using Python PDF manipulation library included in Pythonista? I think you might get a more robust solution with it.
Hereβs an example combining all the PDFs in a directory into one file:
#coding: utf-8 from PyPDF2 import PdfFileMerger import glob pdfs = sorted(glob.glob("PDF/*")) merger = PdfFileMerger() for pdf in pdfs: merger.append(pdf) merger.write("Combined result.pdf")
-
@benwiggy In this case, your script could become:
import os from pathlib import Path import dialogs from PyPDF2 import PdfFileWriter, PdfFileReader home = "/private/var/mobile/Library/Mobile Documents/iCloud~com~omz-software~Pythonista3/Documents/" def rotate(filename): shortName = Path(filename).stem outFilename = home + shortName + "+90.pdf" pdfDoc = PdfFileReader(filename) if pdfDoc: output = PdfFileWriter() pages = pdfDoc.getNumPages() for p in range(0, pages): page = pdfDoc.getPage(p) page_out = page.rotateClockwise(90) output.addPage(page_out) outfil = open(outFilename, 'wb') output.write(outfil) outfil.close() print (outFilename) if __name__ == '__main__': filename = dialogs.pick_document(types=['public.data']) rotate(filename)