-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
315 changed files
with
8,816 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
#!/bin/bash | ||
|
||
PRODUCT="viewer" | ||
DESTINATION="common/content/$PRODUCT" | ||
|
||
git submodule update --init --recursive | ||
git submodule foreach git pull origin master | ||
|
||
# Creating the destination directory if it doesn't exist | ||
mkdir -p "$DESTINATION" | ||
|
||
# Copying directories and their contents recursively | ||
cp -r java "$DESTINATION" | ||
cp -r net "$DESTINATION" | ||
cp -r python-net "$DESTINATION" | ||
|
||
cp -r nodejs-java "$DESTINATION" | ||
|
||
# Copying files and directories, overwriting without asking | ||
cp -r -u _index.md "$DESTINATION" | ||
|
||
cd common | ||
hugo server --config config-geekdoc.toml,ignore-total-config.toml,show-feedback-config.toml |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
--- | ||
id: home | ||
url: viewer/python-net | ||
title: GroupDocs.Viewer for Python via .NET | ||
weight: 1 | ||
description: "GroupDocs.Viewer for Python via .NET allows you to render documents in various formats as HTML, PDF, JPEG, and PNG files. You do not need to use third-party software to view files within your Python application." | ||
keywords: render files, view files, HTML, PDF, JPEG, PNG | ||
productName: GroupDocs.Viewer for Python via .NET | ||
hideChildren: True | ||
fullWidth: True | ||
--- | ||
<img src="data:image/png;base64,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" alt="groupdocs-viewer-python-net-home" align="left" style="width:110px; margin: 0 30px 30px 0"/> | ||
|
||
<!-- <img src="https://img.shields.io/nuget/v/groupdocs.viewer?label=Nuget" alt="Nuget"> | ||
<img src="https://img.shields.io/nuget/dt/GroupDocs.Viewer?label=nuget%20downloads" alt="Nuget"> --> | ||
|
||
{{< button style="primary" link="https://releases.groupdocs.com/viewer/python-net/release-notes/" >}} <svg class="gdoc-icon gdoc-product-doc__btn-icon"><use xlink:href="/img/groupdocs-stack.svg#document"></use></svg> Release notes {{< /button >}} | ||
<!-- {{< button style="primary" link="https://www.nuget.org/packages/groupdocs.viewer" >}} <svg class="gdoc-icon gdoc-product-doc__btn-icon"><use xlink:href="/img/groupdocs-stack.svg#nuget"></use></svg> NuGet package {{< /button >}} --> | ||
{{< button style="primary" link="https://releases.groupdocs.com/viewer/python-net/" >}} {{< icon "gdoc_download" >}} Download ZIP or MSI {{< /button >}} | ||
|
||
GroupDocs.Viewer for Python via .NET is a powerful, high-performance, and cross-platform library that allows you to build desktop and web [file viewer applications](https://en.wikipedia.org/wiki/File_viewer) using Python. | ||
|
||
GroupDocs.Viewer supports over [170 popular file formats](/viewer/python-net/supported-document-formats). Load text documents, spreadsheets, presentations, PDF files, web pages, email messages, and images and render/display them in HTML, PDF, PNG, and JPEG formats. You can render the entire document or specific pages. | ||
|
||
GroupDocs.Viewer ships with a wide range of options that allow you to control the rendering process and customize the output files. For example, you can protect the output PDF file and reorder its pages, generate responsive HTML pages, adjust the size and quality of output images, add text watermarks, and cache the results. | ||
|
||
------ | ||
|
||
{{< columns >}} | ||
<p><b>About GroupDocs.Viewer</b></p> | ||
<hr><p>OVERVIEW</p></hr> | ||
<ul> | ||
<li><a href='{{< ref "/viewer/python-net/product-overview.md" >}}'>Product overview</a></li> | ||
<li><a href='{{< ref "/viewer/python-net/getting-started/features-overview" >}}'>Main features</a></li> | ||
<li><a href='{{< ref "/viewer/python-net/getting-started/supported-document-formats.md" >}}'>Supported file formats</a></li> | ||
</ul> | ||
|
||
<p>GET STARTED</p> | ||
<ul> | ||
<li><a href='{{< ref "/viewer/python-net/getting-started/system-requirements.md" >}}'>System requirements</a></li> | ||
<li><a href='{{< ref "/viewer/python-net/getting-started/installation.md" >}}'>Installation</a></li> | ||
<li><a href='{{< ref "/viewer/python-net/getting-started/licensing-and-subscription.md" >}}'>Licensing</a></li> | ||
</ul> | ||
|
||
<---> | ||
|
||
<p><b>Developer Guide</b></p> | ||
<hr><p>RENDERING BASICS</p></hr> | ||
<ul> | ||
<li><a href='{{< ref "viewer/python-net/rendering-basics/render-word-documents.md" >}}'>Render Word documents</a></li> | ||
<li><a href='{{< ref "viewer/python-net/rendering-basics/render-spreadsheets/render-excel-and-apple-numbers-spreadsheets.md" >}}'>Render spreadsheet files</a></li> | ||
<li><a href='{{< ref "viewer/python-net/rendering-basics/render-presentations.md" >}}'>Render presentations</a></li> | ||
<li><a href='{{< ref "viewer/python-net/rendering-basics/render-pdf-documents.md" >}}'>Render PDF files</a></li> | ||
<li><a href='{{< ref "viewer/python-net/rendering-basics/render-web-documents.md" >}}'>Render web documents</a></li> | ||
<li><a href='{{< ref "viewer/python-net/rendering-basics/render-text-files.md" >}}'>Render text and code files</a></li> | ||
<li><a href='{{< ref "viewer/python-net/rendering-basics/render-images.md" >}}'>Render images</a></li> | ||
</ul> | ||
|
||
<p>HOW-TO GUIDES</p> | ||
<ul> | ||
<li><a href='{{< ref "/viewer/python-net/developer-guide/loading-documents/loading-documents-from-different-sources/_index.md" >}}'>Load documents from different sources</a></li> | ||
<li><a href='{{< ref "/viewer/python-net/developer-guide/retrieving-document-information/how-to-get-file-type-and-pages-count.md" >}}'>Retrieve document information</a></li> | ||
<li><a href='{{< ref "viewer/python-net/developer-guide/processing-attachments/how-to-extract-and-save-attachments.md" >}}'>Extract and save attachments</a></li> | ||
<li><a href='{{< ref "viewer/python-net/developer-guide/rendering-documents/add-text-watermark.md" >}}'>Add text watermarks</a></li> | ||
<li><a href='{{< ref "viewer/python-net/developer-guide/caching-results/_index.md" >}}'>Cache rendering results</a></li> | ||
</ul> | ||
|
||
<p>API REFERENCE</p> | ||
<ul> | ||
<li><a href="https://reference.groupdocs.com/viewer/python-net/">GroupDocs.Viewer for Python via .NET API Reference</a></li> | ||
</ul> | ||
|
||
<---> | ||
|
||
<p><b>Useful Resources</b></p> | ||
<hr><p>DEMOS AND EXAMPLES</p></hr> | ||
<ul> | ||
<li><a href="https://products.groupdocs.app/viewer/total">View documents online</a></li> | ||
<li><a href="https://github.com/groupdocs-viewer/GroupDocs.Viewer-for-.NET">Download examples and demos from GitHub</a></li> | ||
<li><a href='{{< ref "/viewer/python-net/getting-started/how-to-run-examples.md" >}}'>How to run examples</a></li> | ||
</ul> | ||
|
||
<p>VERSION HISTORY</p> | ||
<ul> | ||
<li><a href='https://releases.groupdocs.com/viewer/python-net/release-notes/'>GroupDocs.Viewer for Python via .NET Release Notes</a></li> | ||
</ul> | ||
|
||
<p>TECHNICAL SUPPORT</p> | ||
<ul> | ||
<li><a href="https://forum.groupdocs.com/">Free Support Forum for GroupDocs Products</a></li> | ||
<li><a href="https://helpdesk.groupdocs.com/">Paid Support Helpdesk for GroupDocs Products</a></li> | ||
</ul> | ||
|
||
{{< /columns >}} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
--- | ||
id: developer-guide | ||
url: viewer/python-net/developer-guide | ||
title: Developer guide | ||
weight: 4 | ||
description: "GroupDocs.Viewer for Python via .NET developer guide" | ||
productName: GroupDocs.Viewer for Python via .NET | ||
hideChildren: False | ||
isMenuItemWithNoContent: True | ||
--- |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
--- | ||
id: caching-results | ||
url: viewer/python-net/caching-results | ||
title: Cache results | ||
weight: 5 | ||
keywords: caching,caching results,groupdocs.viewer | ||
description: "This article contains caching use-cases with GroupDocs.Viewer within your Python applications." | ||
productName: GroupDocs.Viewer for Python via .NET | ||
hideChildren: False | ||
--- | ||
Caching saves rendering results to a specified location, such as a local disk. When you re-request the rendering results, GroupDocs.Viewer does not render again, but uses the cached results. | ||
As a document can take a long time to render, use caching if you expect to reuse the rendering results. | ||
|
||
To enable caching, follow these steps: | ||
|
||
1. Instantiate the desired cache object (for example, [FileCache](https://reference.groupdocs.com/net/viewer/groupdocs.viewer.caching/filecache) to store document rendering results at the local drive) | ||
2. Instantiate the [ViewerSettings](https://reference.groupdocs.com/net/viewer/groupdocs.viewer/viewersettings) object. Specify the cache object as a parameter of the constructor. | ||
3. Instantiate the [Viewer](https://reference.groupdocs.com/net/viewer/groupdocs.viewer/viewer) object. Specify the [ViewerSettings](https://reference.groupdocs.com/net/viewer/groupdocs.viewer/viewersettings) object as a parameter of the constructor. | ||
4. Call the [View](https://reference.groupdocs.com/net/viewer/groupdocs.viewer/viewer/methods/view) method of the [Viewer](https://reference.groupdocs.com/net/viewer/groupdocs.viewer/viewer) class. | ||
|
||
The following code snippet shows how to enable caching and displays the difference between rendering a file and getting the cached results: | ||
|
||
{{< tabs "example1">}} | ||
{{< tab "Python" >}} | ||
```python | ||
# Specify parameters | ||
output_directory = "C:\\output" | ||
cache_path = os.path.join(output_directory, "cache") | ||
page_file_path_format = os.path.join(output_directory, "page_{0}.html") | ||
|
||
# Create a cache | ||
cache = gv.FileCache(cache_path) | ||
settings = gv.ViewerSettings(cache) | ||
|
||
# Define a helper function to measure elapsed time | ||
def print_time_taken(action, format_string): | ||
start_time = time.time() | ||
action() | ||
elapsed_time = (time.time() - start_time) * 1000 # Convert to milliseconds | ||
print(format_string.format(elapsed_time)) | ||
|
||
# Create a viewer instance | ||
file_path = "C:\\sample.docx" | ||
|
||
with gv.Viewer(file_path, settings) as viewer: | ||
# Create HTML options | ||
options = gvo.HtmlViewOptions.for_embedded_resources(page_file_path_format) | ||
|
||
# Render and display the rendering time | ||
print_time_taken(lambda: viewer.view(options), "Time taken on first call to View method: {0} (ms)") | ||
|
||
# Get cached results and display the time | ||
print_time_taken(lambda: viewer.view(options), "Time taken on second call to View method: {0} (ms)") | ||
``` | ||
{{< /tab >}} | ||
{{< /tabs >}} | ||
|
||
The following image shows a sample console output: | ||
|
||
![](/viewer/python-net/images/caching-results.png) | ||
|
||
For details, please refer to the following pages: |
125 changes: 125 additions & 0 deletions
125
...n-net/developer-guide/caching-results/how-to-use-custom-cache-implementation.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,125 @@ | ||
--- | ||
id: how-to-use-custom-cache-implementation | ||
url: viewer/python-net/how-to-use-custom-cache-implementation | ||
title: Custom cache implementation | ||
weight: 1 | ||
keywords: custom caching, groupdocs.viewer | ||
description: "This article explains how to use custom caching implementation with GroupDocs.Viewer within your Python applications." | ||
productName: GroupDocs.Viewer for Python via .NET | ||
hideChildren: False | ||
--- | ||
By default, GroupDocs.Viewer implements caching to local. But you can cache rendering result in your own way, for example, using Redis Cache. To do this, use the `ICache` interface implementation. | ||
|
||
This example uses the StackExchange.Redis NuGet package: https://www.nuget.org/packages/StackExchange.Redis/. Download and install it before you start. | ||
|
||
To implement a custom cache using the Redis Cache, follow these steps: | ||
|
||
|
||
{{< alert style="info" >}} | ||
Before running this example, start the Redis using the following command: `docker run -d --name viewer-cache -p 6379:6379 redis`. | ||
{{< /alert >}} | ||
|
||
1. Create the RedisCache class that implements the [ICache](https://reference.groupdocs.com/net/viewer/groupdocs.viewer.caching/icache) interface. | ||
2. Instantiate the RedisCache class. | ||
3. Instantiate the [ViewerSettings](https://reference.groupdocs.com/net/viewer/groupdocs.viewer/viewersettings) class. Specify the RedisCache object as a parameter of the constructor. | ||
4. Instantiate the [Viewer](https://reference.groupdocs.com/net/viewer/groupdocs.viewer/viewer) class. Specify the [ViewerSettings](https://reference.groupdocs.com/net/viewer/groupdocs.viewer/viewersettings) object as a parameter of the constructor. | ||
5. Call the [View](https://reference.groupdocs.com/net/viewer/groupdocs.viewer/viewer/methods/view) method of the [Viewer](https://reference.groupdocs.com/net/viewer/groupdocs.viewer/viewer) class. | ||
|
||
The following code snippet shows how to implement a custom caching using Redis Cache: | ||
|
||
{{< tabs "example1">}} | ||
{{< tab "Python" >}} | ||
```python | ||
import time | ||
import redis | ||
from io import BytesIO | ||
import xml.etree.ElementTree as ET | ||
from xml.etree.ElementTree import Element, SubElement, tostring | ||
|
||
class RedisCache: | ||
def __init__(self, host, cache_key_prefix): | ||
self._host = host | ||
self._cache_key_prefix = cache_key_prefix | ||
self._redis = redis.StrictRedis(host=host, decode_responses=True) | ||
|
||
def set(self, key, data): | ||
if data is None: | ||
return | ||
|
||
prefixed_key = self._get_prefixed_key(key) | ||
memory_stream = None | ||
|
||
if isinstance(data, BytesIO): | ||
memory_stream = data | ||
else: | ||
memory_stream = BytesIO() | ||
self._serialize_to_stream(data, memory_stream) | ||
|
||
self._redis.set(prefixed_key, memory_stream.getvalue()) | ||
|
||
def try_get_value(self, key, entry_type): | ||
prefixed_key = self._get_prefixed_key(key) | ||
redis_value = self._redis.get(prefixed_key) | ||
|
||
if redis_value is not None: | ||
if entry_type == BytesIO: | ||
return BytesIO(redis_value) | ||
else: | ||
return self._deserialize(redis_value, entry_type) | ||
|
||
return None | ||
|
||
def get_keys(self, filter): | ||
return [key.replace(self._cache_key_prefix, '') for key in self._redis.keys(pattern=f"*{filter}*") if | ||
key.startswith(self._cache_key_prefix) and key.lower().endswith(filter.lower())] | ||
|
||
def dispose(self): | ||
pass # No need to dispose in Python, the Redis connection is managed by the library | ||
|
||
def _get_prefixed_key(self, key): | ||
return f"{self._cache_key_prefix}{key}" | ||
|
||
def _serialize_to_stream(self, data, stream): | ||
root = Element('root') | ||
data_element = SubElement(root, 'data') | ||
data_element.text = str(data) | ||
stream.write(tostring(root)) | ||
|
||
def _deserialize(self, data, data_type): | ||
root = ET.fromstring(data) | ||
data_element = root.find('data') | ||
|
||
if data_type == str: | ||
return data_element.text | ||
else: | ||
return None # Add more deserialization logic based on your actual data types | ||
|
||
def print_time_taken(action, format_string): | ||
start_time = time.time() | ||
action() | ||
elapsed_time = (time.time() - start_time) * 1000 # Convert to milliseconds | ||
print(format_string.format(elapsed_time)) | ||
|
||
|
||
server_address = "127.0.0.1:6379" | ||
file_path = "sample.docx" | ||
|
||
cache = RedisCache(server_address, file_path) | ||
settings = cache # In Python, we can use the cache directly without ViewerSettings | ||
|
||
def view_document(): | ||
viewer.view(view_options) | ||
|
||
viewer = gv.Viewer(file_path, settings) | ||
view_options = gvo.HtmlViewOptions.for_embedded_resources() | ||
|
||
print_time_taken(view_document, "The first call to View method took {0} ms.") | ||
print_time_taken(view_document, "The second call to View method took {0} ms.") | ||
|
||
``` | ||
{{< /tab >}} | ||
{{< /tabs >}} | ||
|
||
The following image shows a sample console output: | ||
|
||
![](/viewer/python-net/images/how-to-use-custom-cache-implementation.png) |
Oops, something went wrong.