Skip to content

Commit

Permalink
add python-net documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
derbess committed Dec 1, 2023
1 parent 67fbdb1 commit 3a78247
Show file tree
Hide file tree
Showing 315 changed files with 8,816 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .github/workflows/publish-qa.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ jobs:
cp -r java common/content/${{ env.PRODUCT }}
cp -r net common/content/${{ env.PRODUCT }}
cp -r nodejs-java common/content/${{ env.PRODUCT }}
cp -r python-net common/content/${{ env.PRODUCT }}
cp _index.md common/content/${{ env.PRODUCT }}
hugo --source common --minify --config config-geekdoc.toml,ignore-total-config.toml,show-feedback-config.toml --baseURL 'https://docs-qa.groupdocs.com/'
Expand Down
23 changes: 23 additions & 0 deletions build_docs.sh
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
94 changes: 94 additions & 0 deletions python-net/_index.md
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 >}}
10 changes: 10 additions & 0 deletions python-net/developer-guide/_index.md
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
---
62 changes: 62 additions & 0 deletions python-net/developer-guide/caching-results/_index.md
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:
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)
Loading

0 comments on commit 3a78247

Please sign in to comment.