提前致谢。希望每个人都表现出色。 我试图从 python 调用 Adobe Indesign JSX 文件,下面是示例代码: 我想在 Adobe INdesign 2024 或更高版本上运行它。我在 Python InDesign 脚本编写上看到了一些示例:从预检中获取溢出文本框以自动调整大小 作为参考,可能适用于 Adobe InDesing CS 6,但我需要使用 Adobe InDesign 2024 Creative Cloud。
<pre>
<code>
import win32com.client
def create_indesign_document_with_text():
try:
# Initialize COM
print("Initializing COM...")
app = win32com.client.Dispatch('InDesign.Application')
# Create a new InDesign document
print("Creating a new InDesign document...")
doc = app.Documents.Add()
# Define the text content
text_content = ("This is a sample text with some bold and italic words. "
"The quick brown fox jumps over the lazy dog. " * 5)
# Define text attributes
bold_text = "This is bold text."
italic_text = "This is italic text."
# Create a text frame
print("Adding a text frame with sample content...")
page = doc.Pages.Item(1)
text_frame = page.TextFrames.Add()
text_frame.GeometricBounds = ["12.7mm", "12.7mm", "287mm", "200mm"] # Adjust the bounds as needed
# Add the main text content
text_frame.Contents = text_content
# Apply formatting to parts of the text
# Note: InDesign uses 0-based index for characters
text_range = text_frame.Characters
text_range.Item(0).ChangeTextPreferences.appliedFont = app.Fonts.Item("Arial")
text_range.Item(0).ChangeTextPreferences.fontStyle = "Bold"
text_range.Item(0).ChangeTextPreferences.pointSize = 12
# Apply bold formatting to a specific range
bold_start = text_content.find(bold_text)
bold_end = bold_start + len(bold_text)
text_range.ItemByRange(bold_start, bold_end - 1).ChangeTextPreferences.fontStyle = "Bold"
# Apply italic formatting to a specific range
italic_start = text_content.find(italic_text)
italic_end = italic_start + len(italic_text)
text_range.ItemByRange(italic_start, italic_end - 1).ChangeTextPreferences.fontStyle = "Italic"
# Save the InDesign document
save_path = r'INDESIGN_FILE_PATH'
print(f"Saving the InDesign document to {save_path}...")
doc.Save(save_path)
# Call the JSX script
jsx_script_path = r'JSX_FILE_PATH'
print(f"Executing JSX script: {jsx_script_path}...")
app.DoScript(jsx_script_path, 1246973031) # Use ScriptLanguage.JAVASCRIPT
print("Document created and script executed successfully.")
# Close the document
print("Closing the InDesign document without saving changes...")
doc.Close(1) # 1 means save changes
except Exception as e:
print(f"An error occurred: {e}")
if __name__ == "__main__":
create_indesign_document_with_text()
</code>
</pre>
虽然运行上面的代码,我收到以下错误:
<pre>
<code>
Initializing COM...
Creating a new InDesign document...
Adding a text frame with sample content...
An error occurred: (-2147352567, 'Exception occurred.',
(30475, 'INDESIGN EXE PATH', 'The requested member of the collection does not exist.', None, 0, 0), None)
</code></pre>
你能帮助我吗?
问候, 视音频
这个错误提示“The requested member of the collection does not exist.”,通常发生在你尝试访问 InDesign 文档中不存在的元素时,比如页面、文本框架、字体等。
让我们逐行分析你的代码,找出可能导致错误的原因:
- InDesign 版本 : 确保你安装了 InDesign 2024 或更高版本。
-
COM 对象
: 你使用
win32com.client.Dispatch('InDesign.Application')
创建 InDesign 应用程序对象。这部分应该没有问题,因为错误发生在后续操作中。 -
创建文档
:
doc = app.Documents.Add()
创建新的 InDesign 文档。 这里应该没有问题。 -
添加文本框
:
page = doc.Pages.Item(1)
获取第一页,然后text_frame = page.TextFrames.Add()
在该页面上添加文本框。 这部分 可能 是错误的根源。 如果你的 InDesign 文档模板没有预先定义页面,那么doc.Pages.Item(1)
会返回错误。 -
其他操作
: 代码的其他部分(添加文本、设置字体样式)都依赖于文本框对象
text_frame
。
解决方案:
- 检查 InDesign 文档模板: 确保你的文档模板至少包含一页。
- 修改代码 : 尝试在创建文档后立即添加页面:
import win32com.client
def create_indesign_document_with_text():
try:
# ... (其他代码) ...
# Create a new InDesign document
print("Creating a new InDesign document...")
doc = app.Documents.Add()
# **添加页面**
doc.Pages.Add()
# 获取第一页
page = doc.Pages.Item(1)
# ... (其他代码) ...
except Exception as e:
print(f"An error occurred: {e}")
# ... (其他代码) ...
-
调试
: 使用
print(doc.Pages.Count)
在创建文档后打印页面数量,确认页面是否成功创建。
如果修改后问题仍然存在,请提供以下信息以便我进一步帮助你:
- 你使用的 InDesign 确切版本
- 你的 InDesign 文档模板文件
- JSX 脚本的内容
希望以上信息能够帮助你解决问题。
标签:python,scripting,jsx,adobe-indesign From: 78777447