我正在尝试运行GCP文档AI的PDF解析中给出的演示代码。要运行代码,将 Google 凭据导出为命令行可以正常工作。当代码需要在内存中运行,因此不允许从磁盘访问凭据文件时,就会出现问题。有没有办法在文档AI解析函数中传递凭据?
谷歌的示例代码:
def main(project_id='YOUR_PROJECT_ID',
input_uri='gs://cloud-samples-data/documentai/invoice.pdf'):
"""Process a single document with the Document AI API, including
text extraction and entity extraction."""
client = documentai.DocumentUnderstandingServiceClient()
gcs_source = documentai.types.GcsSource(uri=input_uri)
# mime_type can be application/pdf, image/tiff,
# and image/gif, or application/json
input_config = documentai.types.InputConfig(
gcs_source=gcs_source, mime_type='application/pdf')
# Location can be 'us' or 'eu'
parent = 'projects/{}/locations/us'.format(project_id)
request = documentai.types.ProcessDocumentRequest(
parent=parent,
input_config=input_config)
document = client.process_document(request=request)
# All text extracted from the document
print('Document Text: {}'.format(document.text))
def _get_text(el):
"""Convert text offset indexes into text snippets.
"""
response = ''
# If a text segment spans several lines, it will
# be stored in different text segments.
for segment in el.text_anchor.text_segments:
start_index = segment.start_index
end_index = segment.end_index
response += document.text[start_index:end_index]
return response
for entity in document.entities:
print('Entity type: {}'.format(entity.type))
print('Text: {}'.format(_get_text(entity)))
print('Mention text: {}n'.format(entity.mention_text))
在 GCP 上运行工作负载时,无需拥有服务帐号密钥文件。你一定不能!!
为什么?2个原因:
- 这是无用的,因为所有 GCP 产品至少都有一个默认服务帐户。大多数时候,您可以自定义它。您可以在您的案例中查看云功能标识。
- 服务帐户密钥文件是一个文件。这意味着很多:您可以复制它,通过电子邮件发送,在 Git 存储库中提交它......许多人可以访问它,而您失去了对这个秘密的管理。而且因为它是一个秘密,你必须安全地存储它,你必须定期轮换它(至少每 90 天,谷歌推荐(,...快要黑了!如果可以,请不要使用服务帐户密钥文件!
图书馆在做什么?
- 正在寻找GOOGLE_APPLICATION_CREDENTIALS env var 是否存在。
- 正在调查"众所周知"的位置(当您执行
gcloud auth application-default login
以允许本地应用程序使用您的凭据访问Google资源时,会在计算机上的"标准位置"创建一个文件( - 如果不存在,请检查元数据服务器是否存在(仅在 GCP 上(。此服务器向库提供身份验证信息。
- 否则引发错误。
因此,只需在函数中使用正确的服务帐户,并为其提供正确的角色即可实现您想要执行的操作。