1

어리석은 질문이라면 유감입니다. 나는 GCP에 아주 새로운 있습니다.Google Cloud Storage에 저장된 이미지의 PDF를 만드는 방법은 무엇입니까?

웹 앱의 경우 Cloud Storage에 저장된 이미지에서 PDF를 만들어야합니다.

먼저, 파이썬 패키지 fpdf을 Cloud Storage에 저장된 파일과 함께 사용하려고 시도했으며 이것이 가능한지 확인했습니다. 이미지가 온라인에 저장되므로 urllib2을 사용하여 이미지를 가져옵니다.

코드 :

from fpdf import FPDF 
import urllib2 
import os 

imagelist = ["https://storage.googleapis.com/seventh-terrain-179700.appspot.com/excuses.jpg", "https://storage.googleapis.com/seventh-terrain-179700.appspot.com/excuses2.jpg"] 

pdf = FPDF() 
i = 0 
for image in imagelist: 
    image = urllib2.urlopen(image) 

    # writing image files in current folder 
    with open('image'+str(i)+'.jpg','wb') as output: 
     output.write(image.read()) 

    pdf.add_page() 
    pdf.image('image'+str(i)+'.jpg', 10, 10, 100, 100) # pdf.image(image,x,y,w,h) 

    # removing images 
    os.remove('image'+str(i)+'.jpg') 
    i += 1 

# Creating PDF in current folder 
pdf.output("yourfile.pdf", "F") 

이 말을 잘. 나는 오류가 발생하고,

import webapp2 
from fpdf import FPDF 
import urllib2 
import os 

pdf = FPDF() 

class MainPage(webapp2.RequestHandler): 
    def get(self): 
     imagelist = ["https://storage.googleapis.com/seventh-terrain-179700.appspot.com/excuses.jpg", "https://storage.googleapis.com/seventh-terrain-179700.appspot.com/excuses2.jpg"] 

     pdf = FPDF() 
     i = 0 
     for image in imagelist: 
      image = urllib2.urlopen(image) 

      with open('image'+str(i)+'.jpg','wb') as output: 
       output.write(image.read()) 

      pdf.add_page() 
      pdf.image('image'+str(i)+'.jpg', 10, 10, 100, 100) # pdf.image(image,x,y,w,h) 

      os.remove('image'+str(i)+'.jpg') 
      i += 1 

     pdf.output("yourfile.pdf", "F") 

application = webapp2.WSGIApplication([('/', MainPage)], 
             debug=True) 

을 :하지만

는 그럼 난 로컬 서버에서 동일한 코드를 배포하려

WARNING 2017-12-08 19:21:56,184 sandbox.py:1082] The module _winreg is whitelisted for local dev only. If your application relies on _winreg, it is likely that it will not function properly in production. 
WARNING 2017-12-08 14:21:56,190 urlfetch_stub.py:551] Stripped prohibited headers from URLFetch request: ['Host'] 
ERROR 2017-12-08 19:21:57,332 webapp2.py:1528] [Errno 30] Read-only file system: 'image0.jpg' 
Traceback (most recent call last): 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\lib\webapp2-2.3\webapp2.py", line 1511, in __call__ 
    rv = self.handle_exception(request, response, e) 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\lib\webapp2-2.3\webapp2.py", line 1505, in __call__ 
    rv = self.router.dispatch(request, response) 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\lib\webapp2-2.3\webapp2.py", line 1253, in default_dispatcher 
    return route.handler_adapter(request, response) 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\lib\webapp2-2.3\webapp2.py", line 1077, in __call__ 
    return handler.dispatch() 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\lib\webapp2-2.3\webapp2.py", line 547, in dispatch 
    return self.handle_exception(e, self.app.debug) 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\lib\webapp2-2.3\webapp2.py", line 545, in dispatch 
    return method(*args, **kwargs) 
    File "C:\MyMiniGCPProjects\FPDF\main.py", line 23, in get 
    with open('image'+str(i)+'.jpg','wb') as output: 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\tools\devappserver2\python\runtime\stubs.py", line 278, in __init__ 
    raise IOError(errno.EROFS, 'Read-only file system', filename) 
IOError: [Errno 30] Read-only file system: 'image0.jpg' 
ERROR 2017-12-08 19:21:57,339 wsgi.py:279] 
Traceback (most recent call last): 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\runtime\wsgi.py", line 267, in Handle 
    result = handler(dict(self._environ), self._StartResponse) 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\lib\webapp2-2.3\webapp2.py", line 1519, in __call__ 
    response = self._internal_error(e) 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\lib\webapp2-2.3\webapp2.py", line 1511, in __call__ 
    rv = self.handle_exception(request, response, e) 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\lib\webapp2-2.3\webapp2.py", line 1505, in __call__ 
    rv = self.router.dispatch(request, response) 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\lib\webapp2-2.3\webapp2.py", line 1253, in default_dispatcher 
    return route.handler_adapter(request, response) 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\lib\webapp2-2.3\webapp2.py", line 1077, in __call__ 
    return handler.dispatch() 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\lib\webapp2-2.3\webapp2.py", line 547, in dispatch 
    return self.handle_exception(e, self.app.debug) 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\lib\webapp2-2.3\webapp2.py", line 545, in dispatch 
    return method(*args, **kwargs) 
    File "C:\MyMiniGCPProjects\FPDF\main.py", line 23, in get 
    with open('image'+str(i)+'.jpg','wb') as output: 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\tools\devappserver2\python\runtime\stubs.py", line 278, in __init__ 
    raise IOError(errno.EROFS, 'Read-only file system', filename) 
IOError: [Errno 30] Read-only file system: 'image0.jpg' 

I 작동 모든 솔루션을 찾을 수 없습니다입니다. Cloud Storage에서 직접 파일을 사용하고 Cloud Storage에 PDF를 저장하는 방법이 있습니까?

답변

2

샌드 박스 제한 사항 중 하나에 해당됩니다. The sandbox에서 :

음, 데이터 저장소에 대한 메모가 실제로 오해의 소지가

An App Engine application cannot:

  • write to the filesystem. Applications must use Cloud Datastore for storing persistent data. Reading from the filesystem is allowed, and all application files uploaded with the application are available.

, 여러 스토리지 옵션이 있습니다, 가장 케이스는 이럴 클라우드 스토리지 (GCS).

일반용 open()을 사용하여 GCS에 파일을 쓸 수 없다면 GCS 클라이언트 라이브러리를 사용하기를 바랍니다. 여기에 예제가 있습니다. Write a CSV to store in Google Cloud Storage

+0

감사합니다. 'imagelist'의 이미지는 Google Cloud Storage에 저장됩니다. 이미지를 로컬에 저장해야하기 때문에'FPDF(). image()'에서 직접 사용자를 지정할 수 없습니다. 그래서, 이미지 파일의 객체를 생성하는'urllib2.urlopen (image)'를 사용하고 있습니다. 그러나 FPDF(). image()는 이미지를 로컬에 저장해야하기 때문에 출력으로'open ('image'+ str (i) + '. jpg', 'wb')를 사용하고 있습니다. 위의 오류를 만듭니다. Google Cloud Storage에 저장 하시겠지만 이미지는 이미 Google Cloud Storage에 저장되어 있습니다. 이 문제를 해결하는 방법을 알려주세요. – Beginner

+0

doc은 'file' 매개 변수가 URL 일 수도 있음을 나타냅니다.'이미지의 경로 또는 URL ': http://www.fpdf.org/en/doc/image.htm –

+0

예, 그렇습니다. 내가 사용하고있을 때 : 'pdf.image ("https://storage.googleapis.com/seventh-terrain-179700.appspot.com/excuses.jpg", 10, 10, 100, 100)' 오류가 발생한다. :'RuntimeError : FPDF 오류 : 이미지 파일이 없거나 잘못되었습니다. https://storage.googleapis.com/seventh-terrain-179700.appspot.com/excuses.jpg. 오류 : [Errno 22] 잘못된 모드 ('rb') 또는 파일 이름 : 'https://storage.googleapis.com/seventh-terrain-179700.appspot.com/excuses.jpg' ' – Beginner

관련 문제