<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Atvērtā pirmkods on File Format Blog</title>
    <link>https://blog.fileformat.com/lv/tag/atv%C4%93rt%C4%81-pirmkods/</link>
    <description>Recent content in Atvērtā pirmkods on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>lv</language>
    <lastBuildDate>Sun, 19 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/lv/tag/atv%C4%93rt%C4%81-pirmkods/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Labākās atvērtā koda API, kas pārvērš Microsoft Office dokumentus attēlos</title>
      <link>https://blog.fileformat.com/lv/image/top-open-source-office-document-to-image-converter-apis-complete-guide/</link>
      <pubDate>Sun, 19 Jul 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/lv/image/top-open-source-office-document-to-image-converter-apis-complete-guide/</guid>
      <description>Visaptverošs izstrādātāju ceļvedis par atvērtā koda Office dokumentu pārvēršanu attēlos. Izpētiet strukturālos darba plūsmas, Docker mērogošanas padomus un salīdzinājumus ar labākajām bezmaksas API.</description>
      <content:encoded><![CDATA[<p><strong>Pēdējoreiz atjaunināts</strong>: 21 Jul, 2026</p>
<figure class="align-center ">
    <img loading="lazy" src="images/top-open-source-office-document-to-image-converter-apis.png#center"
         alt="Best Open-Source APIs to Convert Microsoft Office Documents to Images"/> 
</figure>

<h2 id="atvērtā-koda-api17-kas-pārvērš-office-dokumentus-attēlos-visaptverošais-ceļvedis"><a href="https://products.fileformat.com/word-processing/">Atvērtā koda API</a> Kas pārvērš Office dokumentus attēlos: Visaptverošais ceļvedis</h2>
<p>Mūsdienīgā programmatūras izstrādē dokumentu apstrāde ir atkārtota prasība. Neatkarīgi no tā, vai veidojat uzņēmuma intranetu, dokumentu pārvaldības sistēmu (DMS) vai sadarbības platformu, Microsoft Office dokumentu (Word, Excel, PowerPoint) pārveidošana augstas kvalitātes attēlos (<a href="https://docs.fileformat.com/image/png/">PNG</a>, <a href="https://docs.fileformat.com/image/jpeg/">JPEG</a>) ir kritiska funkcija. Attēli ir universāli lasāmi visos pārlūkprogrammās, mobilajos ierīcēs un operētājsistēmās, neprasot ārējus spraudņus vai smagus biroja pakotnes.</p>
<p>Kamēr komerciālie API piedāvā stabilus risinājumus, atvērtā koda alternatīvas nodrošina elastību, izmaksu ietaupījumus un pilnīgu kontroli pār datu privātumu — svarīgs faktors, apstrādājot sensitīvus uzņēmuma dokumentus.</p>
<p>Šis visaptverošais ceļvedis izpēta vadošās atvērtā koda API, bibliotēkas un dzinējus, kas pārveido Office dokumentus attēlos, izvērtējot to priekšrocības, trūkumus un veiktspējas raksturlielumus.</p>
<h2 id="kāpēc-pārvērst-office-dokumentus-attēlos">Kāpēc pārvērst Office dokumentus attēlos?</h2>
<p>Pirms iedziļināmies rīkos, apskatīsim, kāpēc izstrādātāji bieži pārvērš Word dokumentus (<code>.docx</code>), izklājlapas (<code>.xlsx</code>) un prezentācijas (<code>.pptx</code>) attēlos:</p>
<ol>
<li><strong>Universāla priekšskatīšana:</strong> Tīmekļa pārlūkprogrammas nevar dabiski attēlot <code>.docx</code> vai <code>.pptx</code> failus. Pārvēršot tos uz <code>.png</code> vai <code>.jpg</code>, tiek nodrošināta tūlītēja pārlūkā balstīta dokumentu skatītāja iespēja.</li>
<li><strong>Platformas neatkarība:</strong> Mobilās lietotnes var nekavējoties attēlot attēlus, nepārsniedzot smagus dokumentu attēlošanas dzinējus.</li>
<li><strong>Drošība un lasāmība:</strong> Dokumenta attēla koplietošana nodrošina, ka izkārtojums paliek identisks visās ierīcēs, un novērš vienkāršas, neatļautas teksta izmaiņas.</li>
<li><strong>Sīktēlu ģenerēšana:</strong> Automatizēti darba plūsmas bieži pieprasa mazas vizuālas priekšskatījuma attēlus dokumentiem failu pārlūkā un meklēšanas rezultātos.</li>
</ol>
<h2 id="vadošie-atvērtā-koda-risinājumi-dokumenta-uz-attēla-pārveidošanai">Vadošie atvērtā koda risinājumi dokumenta uz attēla pārveidošanai</h2>
<h3 id="1libreoffice4--openoffice-headless-režīms">1.<a href="https://github.com/LibreOffice/">LibreOffice</a> / OpenOffice (Headless režīms)</h3>
<p>LibreOffice ir neapstrīdams smagākais spēlētājs atvērtā koda dokumentu apstrādes ekosistēmā. Savā &ldquo;headless&rdquo; režīmā (darbojoties bez grafiskās lietotāja saskarnes) LibreOffice var tikt aktivizēts caur CLI vai iesaiņots vieglā mikroservisa API, lai pārveidotu praktiski jebkuru Office dokumenta formātu.</p>
<h4 id="kā-instalēt">Kā instalēt</h4>
<p>Debian/Ubuntu balstītās sistēmās instalējiet galveno LibreOffice pakotni kopā ar <code>poppler-utils</code> (kas nodrošina <code>pdftoppm</code> PDF‑uz‑attēlu konvertēšanai):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo apt-get update
</span></span><span style="display:flex;"><span>sudo apt-get install -y libreoffice-headless poppler-utils
</span></span></code></pre></div><h4 id="koda-piemērs-nodejs-api-pārklājums">Koda piemērs (Node.js API pārklājums)</h4>
<p>Zemāk ir Node.js ietvars, kas izsauc galveno LibreOffice bināro failu, lai konvertētu <code>.docx</code> uz PDF, un pēc tam rasterizē to PNG formātā:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">const</span> { <span style="color:#a6e22e">exec</span> } <span style="color:#f92672">=</span> <span style="color:#a6e22e">require</span>(<span style="color:#e6db74">&#39;child_process&#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">path</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">require</span>(<span style="color:#e6db74">&#39;path&#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">fs</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">require</span>(<span style="color:#e6db74">&#39;fs&#39;</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">convertDocToImage</span>(<span style="color:#a6e22e">inputDocPath</span>, <span style="color:#a6e22e">outputDir</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">new</span> Promise((<span style="color:#a6e22e">resolve</span>, <span style="color:#a6e22e">reject</span>) =&gt; {
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">// Step 1: Headless LibreOffice conversion to PDF
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>        <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">libreOfficeCmd</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">`soffice --headless --convert-to pdf --outdir &#34;</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">outputDir</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34; &#34;</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">inputDocPath</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;`</span>;
</span></span><span style="display:flex;"><span>        
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">exec</span>(<span style="color:#a6e22e">libreOfficeCmd</span>, (<span style="color:#a6e22e">err</span>) =&gt; {
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">err</span>) <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">reject</span>(<span style="color:#66d9ef">new</span> Error(<span style="color:#e6db74">&#39;LibreOffice conversion failed: &#39;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">err</span>.<span style="color:#a6e22e">message</span>));
</span></span><span style="display:flex;"><span>            
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">baseName</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">path</span>.<span style="color:#a6e22e">basename</span>(<span style="color:#a6e22e">inputDocPath</span>, <span style="color:#a6e22e">path</span>.<span style="color:#a6e22e">extname</span>(<span style="color:#a6e22e">inputDocPath</span>));
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">pdfPath</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">path</span>.<span style="color:#a6e22e">join</span>(<span style="color:#a6e22e">outputDir</span>, <span style="color:#e6db74">`</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">baseName</span><span style="color:#e6db74">}</span><span style="color:#e6db74">.pdf`</span>);
</span></span><span style="display:flex;"><span>            
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span><span style="color:#a6e22e">fs</span>.<span style="color:#a6e22e">existsSync</span>(<span style="color:#a6e22e">pdfPath</span>)) {
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">reject</span>(<span style="color:#66d9ef">new</span> Error(<span style="color:#e6db74">&#39;Intermediate PDF file was not created.&#39;</span>));
</span></span><span style="display:flex;"><span>            }
</span></span><span style="display:flex;"><span>            
</span></span><span style="display:flex;"><span>            <span style="color:#75715e">// Step 2: Convert intermediate PDF pages to PNGs using pdftoppm
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>            <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">outputPrefix</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">path</span>.<span style="color:#a6e22e">join</span>(<span style="color:#a6e22e">outputDir</span>, <span style="color:#e6db74">`</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">baseName</span><span style="color:#e6db74">}</span><span style="color:#e6db74">-page`</span>);
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">pdftoppmCmd</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">`pdftoppm -png -r 150 &#34;</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">pdfPath</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34; &#34;</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">outputPrefix</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;`</span>;
</span></span><span style="display:flex;"><span>            
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">exec</span>(<span style="color:#a6e22e">pdftoppmCmd</span>, (<span style="color:#a6e22e">ppmErr</span>) =&gt; {
</span></span><span style="display:flex;"><span>                <span style="color:#75715e">// Cleanup intermediate PDF
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>                <span style="color:#a6e22e">fs</span>.<span style="color:#a6e22e">unlinkSync</span>(<span style="color:#a6e22e">pdfPath</span>);
</span></span><span style="display:flex;"><span>                
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">ppmErr</span>) <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">reject</span>(<span style="color:#66d9ef">new</span> Error(<span style="color:#e6db74">&#39;pdftoppm rendering failed: &#39;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">ppmErr</span>.<span style="color:#a6e22e">message</span>));
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">resolve</span>(<span style="color:#e6db74">`Images successfully generated in: </span><span style="color:#e6db74">${</span><span style="color:#a6e22e">outputDir</span><span style="color:#e6db74">}</span><span style="color:#e6db74">`</span>);
</span></span><span style="display:flex;"><span>            });
</span></span><span style="display:flex;"><span>        });
</span></span><span style="display:flex;"><span>    });
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h4 id="priekšrocības">Priekšrocības</h4>
<ul>
<li><strong>Neparasts formātu atbalsts:</strong> Izcila precizitāte <code>.docx</code>, <code>.doc</code>, <code>.xlsx</code>, <code>.xls</code>, <code>.pptx</code> un <code>.ppt</code>.</li>
<li><strong>Ļoti stabils:</strong> Aktīvi uztur milzīga globāla kopiena.</li>
<li><strong>Iz­kārtojuma precizitāte:</strong> Izcila fontu, malu, tabulu un iekļautu diagrammu saglabāšana.</li>
</ul>
<h4 id="trūkumi">Trūkumi</h4>
<ul>
<li><strong>Resursu intensīvs:</strong> Galvenā LibreOffice procesa darbība prasa ievērojamu RAM un CPU.</li>
<li><strong>Izpildes pārklājums:</strong> Jauna CLI procesa izveide katrai konversijai var ierobežot caurlaidību pie lielas vienlaicīgas slodzes.</li>
</ul>
<h3 id="2-apache-poi1-java-ekosistēma">2. <a href="https://products.fileformat.com/word-processing/java/apache-poi-xwpf/">Apache POI</a> (Java ekosistēma)</h3>
<p>Izstrādātājiem, kas strādā ar JVM (Java, Kotlin, Scala), Apache POI ir standarta bibliotēka Microsoft Office formātu lasīšanai un rakstīšanai. Tā ietver tiešas renderēšanas komponentes, kas spēj eksportēt slaidus vai loksnes uz attēliem.</p>
<h4 id="kā-instalēt-1">Kā instalēt</h4>
<p>Pievienojiet Apache POI atkarības savam Maven <code>pom.xml</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#f92672">&lt;dependencies&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;dependency&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;groupId&gt;</span>org.apache.poi<span style="color:#f92672">&lt;/groupId&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;artifactId&gt;</span>poi-ooxml<span style="color:#f92672">&lt;/artifactId&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;version&gt;</span>5.2.3<span style="color:#f92672">&lt;/version&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/dependency&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;dependency&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;groupId&gt;</span>org.apache.poi<span style="color:#f92672">&lt;/groupId&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;artifactId&gt;</span>poi-scratchpad<span style="color:#f92672">&lt;/artifactId&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;version&gt;</span>5.2.3<span style="color:#f92672">&lt;/version&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/dependency&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;/dependencies&gt;</span>
</span></span></code></pre></div><h4 id="koda-piemērs-java-pptx-uz-attēlu-pārveidošana">Koda piemērs (Java PPTX uz attēlu pārveidošana)</h4>
<p>Izmantojot Apache POI, lai parsētu PowerPoint failu (<code>.pptx</code>) un attēlotu atsevišķus slaidus tieši uz rastra attēla:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#f92672">import</span> org.apache.poi.xslf.usermodel.XMLSlideShow<span style="color:#f92672">;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> org.apache.poi.xslf.usermodel.XSLFSlide<span style="color:#f92672">;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> javax.imageio.ImageIO<span style="color:#f92672">;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.awt.*<span style="color:#f92672">;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.awt.geom.Rectangle2D<span style="color:#f92672">;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.awt.image.BufferedImage<span style="color:#f92672">;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.io.File<span style="color:#f92672">;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.io.FileInputStream<span style="color:#f92672">;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.io.FileOutputStream<span style="color:#f92672">;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.io.IOException<span style="color:#f92672">;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.util.List<span style="color:#f92672">;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">SlideToImageConverter</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">convertSlidesToImages</span><span style="color:#f92672">(</span>File pptxFile<span style="color:#f92672">,</span> File outputFolder<span style="color:#f92672">)</span> <span style="color:#66d9ef">throws</span> IOException <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">try</span> <span style="color:#f92672">(</span>FileInputStream is <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> FileInputStream<span style="color:#f92672">(</span>pptxFile<span style="color:#f92672">);</span>
</span></span><span style="display:flex;"><span>             XMLSlideShow ppt <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> XMLSlideShow<span style="color:#f92672">(</span>is<span style="color:#f92672">))</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>            
</span></span><span style="display:flex;"><span>            Dimension pageSize <span style="color:#f92672">=</span> ppt<span style="color:#f92672">.</span><span style="color:#a6e22e">getPageSize</span><span style="color:#f92672">();</span>
</span></span><span style="display:flex;"><span>            List<span style="color:#f92672">&lt;</span>XSLFSlide<span style="color:#f92672">&gt;</span> slides <span style="color:#f92672">=</span> ppt<span style="color:#f92672">.</span><span style="color:#a6e22e">getSlides</span><span style="color:#f92672">();</span>
</span></span><span style="display:flex;"><span>            
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">for</span> <span style="color:#f92672">(</span><span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span><span style="color:#f92672">;</span> i <span style="color:#f92672">&lt;</span> slides<span style="color:#f92672">.</span><span style="color:#a6e22e">size</span><span style="color:#f92672">();</span> i<span style="color:#f92672">++)</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>                BufferedImage img <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> BufferedImage<span style="color:#f92672">(</span>pageSize<span style="color:#f92672">.</span><span style="color:#a6e22e">width</span><span style="color:#f92672">,</span> pageSize<span style="color:#f92672">.</span><span style="color:#a6e22e">height</span><span style="color:#f92672">,</span> BufferedImage<span style="color:#f92672">.</span><span style="color:#a6e22e">TYPE_INT_ARGB</span><span style="color:#f92672">);</span>
</span></span><span style="display:flex;"><span>                Graphics2D graphics <span style="color:#f92672">=</span> img<span style="color:#f92672">.</span><span style="color:#a6e22e">createGraphics</span><span style="color:#f92672">();</span>
</span></span><span style="display:flex;"><span>                
</span></span><span style="display:flex;"><span>                <span style="color:#75715e">// Set default rendering options for high quality
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>                graphics<span style="color:#f92672">.</span><span style="color:#a6e22e">setRenderingHint</span><span style="color:#f92672">(</span>RenderingHints<span style="color:#f92672">.</span><span style="color:#a6e22e">KEY_ANTIALIASING</span><span style="color:#f92672">,</span> RenderingHints<span style="color:#f92672">.</span><span style="color:#a6e22e">VALUE_ANTIALIAS_ON</span><span style="color:#f92672">);</span>
</span></span><span style="display:flex;"><span>                graphics<span style="color:#f92672">.</span><span style="color:#a6e22e">setRenderingHint</span><span style="color:#f92672">(</span>RenderingHints<span style="color:#f92672">.</span><span style="color:#a6e22e">KEY_RENDERING</span><span style="color:#f92672">,</span> RenderingHints<span style="color:#f92672">.</span><span style="color:#a6e22e">VALUE_RENDER_QUALITY</span><span style="color:#f92672">);</span>
</span></span><span style="display:flex;"><span>                
</span></span><span style="display:flex;"><span>                <span style="color:#75715e">// Clear the canvas area
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>                graphics<span style="color:#f92672">.</span><span style="color:#a6e22e">setPaint</span><span style="color:#f92672">(</span>Color<span style="color:#f92672">.</span><span style="color:#a6e22e">white</span><span style="color:#f92672">);</span>
</span></span><span style="display:flex;"><span>                graphics<span style="color:#f92672">.</span><span style="color:#a6e22e">fill</span><span style="color:#f92672">(</span><span style="color:#66d9ef">new</span> Rectangle2D<span style="color:#f92672">.</span><span style="color:#a6e22e">Float</span><span style="color:#f92672">(</span><span style="color:#ae81ff">0</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">0</span><span style="color:#f92672">,</span> pageSize<span style="color:#f92672">.</span><span style="color:#a6e22e">width</span><span style="color:#f92672">,</span> pageSize<span style="color:#f92672">.</span><span style="color:#a6e22e">height</span><span style="color:#f92672">));</span>
</span></span><span style="display:flex;"><span>                
</span></span><span style="display:flex;"><span>                <span style="color:#75715e">// Draw the slide elements onto our graphic buffer
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>                slides<span style="color:#f92672">.</span><span style="color:#a6e22e">get</span><span style="color:#f92672">(</span>i<span style="color:#f92672">).</span><span style="color:#a6e22e">draw</span><span style="color:#f92672">(</span>graphics<span style="color:#f92672">);</span>
</span></span><span style="display:flex;"><span>                
</span></span><span style="display:flex;"><span>                File outputFile <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> File<span style="color:#f92672">(</span>outputFolder<span style="color:#f92672">,</span> <span style="color:#e6db74">&#34;slide-&#34;</span> <span style="color:#f92672">+</span> <span style="color:#f92672">(</span>i <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span><span style="color:#f92672">)</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;.png&#34;</span><span style="color:#f92672">);</span>
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">try</span> <span style="color:#f92672">(</span>FileOutputStream out <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> FileOutputStream<span style="color:#f92672">(</span>outputFile<span style="color:#f92672">))</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>                    ImageIO<span style="color:#f92672">.</span><span style="color:#a6e22e">write</span><span style="color:#f92672">(</span>img<span style="color:#f92672">,</span> <span style="color:#e6db74">&#34;PNG&#34;</span><span style="color:#f92672">,</span> out<span style="color:#f92672">);</span>
</span></span><span style="display:flex;"><span>                <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>                graphics<span style="color:#f92672">.</span><span style="color:#a6e22e">dispose</span><span style="color:#f92672">();</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><h4 id="priekšrocības-1">Priekšrocības</h4>
<ul>
<li><strong>Pure Java risinājums:</strong> Nav vajadzīgi ārēji bināri vai sistēmas līmeņa programmatūra.</li>
<li><strong>Detalizēta kontrole:</strong> Ļauj programmatiski mainīt dokumenta elementus pirms eksportēšanas.</li>
<li><strong>Zems resursu patēriņš:</strong> Ātrāka izpilde nekā palaist galvaskausa sistēmas komplektus mazapjoma pārveidošanai.</li>
</ul>
<h4 id="trūkumi-1">Trūkumi</h4>
<ul>
<li><strong>Komplekss iestatījums:</strong> Word dokumentu renderēšana ar sarežģītu izkārtojumu prasa būtisku pamata kodu.</li>
<li><strong>Nekonsekventa precizitāte:</strong> Uzlabota formatēšana un sarežģītas Excel diagrammas var neatspoguļoties ar 100% precizitāti salīdzinājumā ar oriģinālo MS Office.</li>
</ul>
<h3 id="3-pandoc--weasyprint--wkhtmltopdf">3. Pandoc + WeasyPrint / wkhtmltopdf</h3>
<p>Pandoc ir pazīstams kā &ldquo;universāls dokumentu konvertētājs&rdquo;. Izmantojot Pandoc kopā ar modernajiem HTML‑uz‑attēlu renderētājiem, izstrādātāji var izveidot ļoti pielāgojamas dokumenta‑uz‑attēla cauruļvadu.</p>
<h4 id="kā-instalēt-2">Kā instalēt</h4>
<p>Linux platformās jūs varat instalēt nepieciešamās pakotnes, izmantojot savu pakotņu pārvaldnieku:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo apt-get install -y pandoc weasyprint
</span></span></code></pre></div><h4 id="koda-piemērs-python-cauruļvadu-ietvars">Koda piemērs (Python cauruļvadu ietvars)</h4>
<p>Šis caurulēšanas posms pārveido <code>.docx</code> dokumentu par starpposma HTML, izmantojot Pandoc, stilizē to un pēc tam kompilē PNG attēlu, izmantojot WeasyPrint:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">import</span> subprocess
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> os
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">render_docx_to_png</span>(docx_path, output_png_path):
</span></span><span style="display:flex;"><span>    temp_html <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;temp_output.html&#34;</span>
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">try</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># Step 1: Convert DOCX to clean HTML via Pandoc</span>
</span></span><span style="display:flex;"><span>        subprocess<span style="color:#f92672">.</span>run([
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#39;pandoc&#39;</span>, docx_path, <span style="color:#e6db74">&#39;-f&#39;</span>, <span style="color:#e6db74">&#39;docx&#39;</span>, <span style="color:#e6db74">&#39;-t&#39;</span>, <span style="color:#e6db74">&#39;html&#39;</span>, <span style="color:#e6db74">&#39;-s&#39;</span>, <span style="color:#e6db74">&#39;-o&#39;</span>, temp_html
</span></span><span style="display:flex;"><span>        ], check<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>)
</span></span><span style="display:flex;"><span>        
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># Step 2: Compile the HTML structure to an image with WeasyPrint</span>
</span></span><span style="display:flex;"><span>        subprocess<span style="color:#f92672">.</span>run([
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#39;weasyprint&#39;</span>, temp_html, output_png_path
</span></span><span style="display:flex;"><span>        ], check<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>)
</span></span><span style="display:flex;"><span>        
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">finally</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> os<span style="color:#f92672">.</span>path<span style="color:#f92672">.</span>exists(temp_html):
</span></span><span style="display:flex;"><span>            os<span style="color:#f92672">.</span>remove(temp_html)
</span></span></code></pre></div><h4 id="priekšrocības-2">Priekšrocības</h4>
<ul>
<li><strong>Ļoti pielāgojams:</strong> Tā kā starpposma posms ir HTML, jūs varat ievietot pielāgotu CSS, lai dinamiski stilizētu dokumenta priekšskatījumus.</li>
<li><strong>Ātri kā zibens:</strong> Kad konfigurēts, teksta bagātu dokumentu parsēšana ir ārkārtīgi ātra.</li>
</ul>
<h4 id="trūkumi-2">Trūkumi</h4>
<ul>
<li><strong>Precizitātes ierobežojumi:</strong> Ļoti stilizēti dokumentu izkārtojumi un sarežģītas korporatīvās veidnes ne tiek pārtulkotas perfekti no Docx uz HTML.</li>
<li><strong>Manuāla regulēšana:</strong> Vislabāk piemērots ziņojumiem vai vēstulēm, nevis multivides bagātām prezentācijām.</li>
</ul>
<h3 id="4-python-docx3--pdf2image-python-ekosistēma">4. <a href="https://blog.fileformat.com/image/difference-between-bmp-and-png/">Python-Docx</a> &amp; pdf2image (Python ekosistēma)</h3>
<p>Python izstrādātājiem bieži tiek izmantota pieeja, kurā tiek nolasītas dokumenta struktūras vai izmantoti palīgskripti, lai droši eksportētu failus.</p>
<h4 id="kā-instalēt-3">Kā instalēt</h4>
<p>Pārliecinieties, ka ir instalēti gan LibreOffice, gan sistēmas pakotne <code>poppler-utils</code>, pēc tam iestatiet Python pakotni:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>pip install pdf2image
</span></span></code></pre></div><h4 id="koda-piemērs-python-mikroservisa-īstenošana">Koda piemērs (Python mikroservisa īstenošana)</h4>
<p>Apvienojot Python izpildes bibliotēku ar <code>pdf2image</code> un lokālu LibreOffice bināru, izstrādātāji var rakstīt tīras, asinhroni atbalstītas konvertēšanas API:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">import</span> subprocess
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> os
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> pdf2image <span style="color:#f92672">import</span> convert_from_path
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">docx_to_images</span>(docx_path, output_dir):
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Convert DOCX to PDF using headless LibreOffice</span>
</span></span><span style="display:flex;"><span>    subprocess<span style="color:#f92672">.</span>run([
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#39;libreoffice&#39;</span>, <span style="color:#e6db74">&#39;--headless&#39;</span>, <span style="color:#e6db74">&#39;--convert-to&#39;</span>, <span style="color:#e6db74">&#39;pdf&#39;</span>, <span style="color:#e6db74">&#39;--outdir&#39;</span>, output_dir, docx_path
</span></span><span style="display:flex;"><span>    ], check<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>)
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Track down the generated PDF file</span>
</span></span><span style="display:flex;"><span>    base_filename <span style="color:#f92672">=</span> os<span style="color:#f92672">.</span>path<span style="color:#f92672">.</span>splitext(os<span style="color:#f92672">.</span>path<span style="color:#f92672">.</span>basename(docx_path))[<span style="color:#ae81ff">0</span>]
</span></span><span style="display:flex;"><span>    pdf_path <span style="color:#f92672">=</span> os<span style="color:#f92672">.</span>path<span style="color:#f92672">.</span>join(output_dir, <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>base_filename<span style="color:#e6db74">}</span><span style="color:#e6db74">.pdf&#34;</span>)
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Convert PDF pages to a list of PIL Images</span>
</span></span><span style="display:flex;"><span>    images <span style="color:#f92672">=</span> convert_from_path(pdf_path, dpi<span style="color:#f92672">=</span><span style="color:#ae81ff">150</span>)
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    generated_paths <span style="color:#f92672">=</span> []
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> i, image <span style="color:#f92672">in</span> enumerate(images):
</span></span><span style="display:flex;"><span>        page_path <span style="color:#f92672">=</span> os<span style="color:#f92672">.</span>path<span style="color:#f92672">.</span>join(output_dir, <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>base_filename<span style="color:#e6db74">}</span><span style="color:#e6db74">_page_</span><span style="color:#e6db74">{</span>i<span style="color:#f92672">+</span><span style="color:#ae81ff">1</span><span style="color:#e6db74">}</span><span style="color:#e6db74">.png&#34;</span>)
</span></span><span style="display:flex;"><span>        image<span style="color:#f92672">.</span>save(page_path, <span style="color:#e6db74">&#39;PNG&#39;</span>)
</span></span><span style="display:flex;"><span>        generated_paths<span style="color:#f92672">.</span>append(page_path)
</span></span><span style="display:flex;"><span>        
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Clean up intermediate PDF</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> os<span style="color:#f92672">.</span>path<span style="color:#f92672">.</span>exists(pdf_path):
</span></span><span style="display:flex;"><span>        os<span style="color:#f92672">.</span>remove(pdf_path)
</span></span><span style="display:flex;"><span>        
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> generated_paths
</span></span></code></pre></div><h4 id="priekšrocības-3">Priekšrocības</h4>
<ul>
<li><strong>Viegli izvietojams:</strong> Var viegli iepakot Docker konteinerā (piemēram, <code>python:3.10-slim</code> ar instalētu <code>libreoffice</code>).</li>
<li><strong>Elastīga automatizācija:</strong> Viegli integrējama ar mākoņbāzētām ziņojumu rindām (Celery, RabbitMQ) fona apstrādei.</li>
</ul>
<h2 id="arhitektūras-labākās-prakses-ražošanas-mērogam">Arhitektūras labākās prakses ražošanas mērogam</h2>
<p>Ja plānojat izmantot atvērtā koda konvertēšanas bibliotēkas augstas slodzes ražošanas vidē, apsveriet šīs arhitektūras stratēģijas:</p>
<h3 id="1-izmantot-docker-smilšu-kastes-izolācijai">1. Izmantot Docker smilšu kastes izolācijai</h3>
<p>Rīku, piemēram, LibreOffice, darbināšana kā apakšprocesi dažkārt var izraisīt iesaldētus procesus vai atmiņas noplūdes. Jūsu dokumentu konvertēšanas dzinēja konteinerizēšana nodrošina, ka, ja konvertēšana avarē, vecākais tīmekļa serveris paliek neietekmēts.</p>
<h3 id="2-implementēt-rindas-sistēmu">2. Implementēt rindas sistēmu</h3>
<p>Dokumentu konvertēšana ir intensīvi CPU‑intensīva. Nekad neveiciet konvertēšanu tieši sinhronajos tīmekļa pieprasījumos. Izmantojiet asinhrono darba rindu (piemēram, Celery, BullMQ vai Sidekiq), lai apstrādātu konvertēšanu fonā un informētu klientus caur WebSockets vai periodisku pieprasījumu.</p>
<h3 id="3-kešatmiņā-saglabāt-izvadi">3. Kešatmiņā saglabāt izvadi</h3>
<p>Ja dokumenti ir statiski, vienmēr saglabājiet ģenerētās attēlu rezultātus objektu glabāšanas spainī (piemēram, AWS S3 vai MinIO) un apkalpojiet tos caur CDN. Neveiciet konvertēšanu vienam un tam pašam failam vairākas reizes.</p>
<h2 id="kopsavilkuma-salīdzinājums">Kopsavilkuma salīdzinājums</h2>
<table>
<thead>
<tr>
<th style="text-align:left">Rīks / Bibliotēka</th>
<th style="text-align:left">Izkārtojuma precizitāte</th>
<th style="text-align:left">Sistēmas atkarības</th>
<th style="text-align:left">Veiktspēja (Ātrums)</th>
<th style="text-align:left">Labākais lietošanas gadījums</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>LibreOffice Headless</strong></td>
<td style="text-align:left">Izcils</td>
<td style="text-align:left">Augsts (nepieciešams LibreOffice komplekts)</td>
<td style="text-align:left">Vidējs</td>
<td style="text-align:left">Komplekss <code>.docx</code>, <code>.xlsx</code>, <code>.pptx</code>, kur vizuālās precizitāte ir galvenā prioritāte.</td>
</tr>
<tr>
<td style="text-align:left"><strong>Apache POI</strong></td>
<td style="text-align:left">Mērens</td>
<td style="text-align:left">Zems (tikai JVM)</td>
<td style="text-align:left">Augsts</td>
<td style="text-align:left">Ātra slaidu uz attēlu pārveide iekšējās Java uzņēmuma lietojumprogrammās.</td>
</tr>
<tr>
<td style="text-align:left"><strong>Pandoc Pipeline</strong></td>
<td style="text-align:left">Zems‑Mērens</td>
<td style="text-align:left">Zems (Pandoc + Renderer)</td>
<td style="text-align:left">Ļoti augsts</td>
<td style="text-align:left">Vienkārši, teksta bagāti ziņojumi un ļoti strukturēti programmēšanas dokumenti.</td>
</tr>
<tr>
<td style="text-align:left"><strong>Python apvalks</strong></td>
<td style="text-align:left">Izcils</td>
<td style="text-align:left">Augsts (LibreOffice + Poppler)</td>
<td style="text-align:left">Vidēji augsts</td>
<td style="text-align:left">Ātra tīmekļa lietojumprogrammu prototipēšana, vieglas mikroservisi.</td>
</tr>
</tbody>
</table>
<h2 id="pēdējās-domas">Pēdējās domas</h2>
<p>Pāreja uz atvērtā koda risinājumu dokumentu uz attēlu renderēšanai ir ļoti efektīvs veids, kā likvidēt piegādātāja ieslēgumu un augstas licences maksas. Lai gan galveņu LibreOffice nodrošina vislabāko vizuālo pārveidošanas precizitāti jau no sākuma, tas prasa robustu sistēmas līmeņa iestatījumu un pareizu konteineru izolāciju, lai droši tiktu galā ar slodzes pārspriegumiem. Savukārt JVM vietējās implementācijas, piemēram, Apache POI, piedāvā nepārspējamu integrācijas ātrumu, ja jūs stingri pārveidojat slaidrādes vai vienkāršus datu sarakstus.</p>
<p>Novērtējiet savu mērķa dokumentu izkārtojuma sarežģītību un izvēlieties rīku ķēdi, kas atbilst jūsu pašreizējai tehnoloģiju stekam, lai iegūtu vislabākos rezultātus!</p>
<h2 id="buj-sadaļa">BUJ sadaļa</h2>
<ol>
<li>
<p><strong>Kā es varu pārveidot <a href="https://docs.fileformat.com/word-processing/docx/">DOCX</a> failu uz <a href="https://docs.fileformat.com/image/png/">PNG</a> izmantojot galveņu LibreOffice?</strong></p>
<ul>
<li><strong>Atbilde:</strong> Jūs izsaucat <code>soffice --headless --convert-to pdf document.docx</code> caur jūsu izpildlaika čaulas izpildes sistēmu, lai ģenerētu starpposma PDF, pēc tam apstrādājat šo PDF failu atsevišķās lapas PNG, izmantojot sistēmas renderēšanas utilītu, piemēram, <code>pdftoppm</code>.</li>
</ul>
</li>
<li>
<p><strong>Vai atvērtā koda bibliotēkas var saglabāt sarežģītas Excel diagrammas, pārveidojot tās attēlos?</strong></p>
<ul>
<li><strong>Atbilde:</strong> Tikai pilnīgi sistēmas dzinēji, piemēram, bezgalvas LibreOffice, var precīzi konvertēt sarežģītas Excel diagrammas un vizuālos makro; tīri kodēšanas bāzēti parsētāji, piemēram, neapstrādāts Apache POI, bieži izlaida uzlabotus stilus vai vizuālos grafikus.</li>
</ul>
</li>
<li>
<p><strong>Vai Apache POI ir piemērots pilnīgu PowerPoint prezentāciju konvertēšanai uz attēlu formātiem?</strong></p>
<ul>
<li><strong>Atbilde:</strong> Jā, Apache POI ietver specializētas <code>XSLFSlide</code> zīmēšanas komponentes, kas renderē PowerPoint slaidus tieši uz vietējiem Java atmiņas objektiem (<code>Graphics2D</code>), padarot to ārkārtīgi ātru <code>.pptx</code> prezentāciju apstrādei.</li>
</ul>
</li>
<li>
<p><strong>Kā varu apstrādāt lielapjoma dokumentu uz attēlu konvertēšanu, nepalēlinot manu galveno tīmekļa lietojumprogrammu?</strong></p>
<ul>
<li><strong>Atbilde:</strong> Pilnīgi pārceliet uzdevumus no galvenā HTTP lietojumprogrammas pavediena uz asinhrono fona darbinieku rindas ekosistēmu, piemēram, Celery, BullMQ vai Sidekiq, kas darbojas izolētās Docker instancēs.</li>
</ul>
</li>
<li>
<p><strong>Kurš atvērtā koda dokumentu konvertētājs piedāvā visaugstāko izkārtojuma un fontu precizitāti?</strong></p>
<ul>
<li><strong>Atbilde:</strong> Bezgalvas LibreOffice nodrošina absolūti visaugstāko konvertēšanas precizitāti, jo tas izmanto pilna mēroga darbvirsmas izkārtojuma dzinējus, lai parsētu stilus, malas, iegultu multimediju un sarežģītu daudzlapu tipogrāfiju.</li>
</ul>
</li>
</ol>
<h2 id="skatīt-arī">Skatīt arī</h2>
<ul>
<li><a href="https://blog.fileformat.com/en/image/webp-vs-avif-vs-jpeg-xl-which-image-format-should-developers-choose-in-2026/">WebP vs AVIF vs JPEG XL: Labākais attēlu formāts izstrādātājiem 2026. gadā</a></li>
<li><a href="https://blog.fileformat.com/image/difference-between-bmp-and-png/">Atšķirība starp BMP un PNG</a></li>
<li><a href="https://blog.fileformat.com/2021/08/19/apng-vs-bmp-which-image-file-format-is-better/">APNG vs BMP: Kurš attēlu faila formāts ir labāks?</a></li>
<li><a href="https://blog.fileformat.com/2021/08/25/raster-vs-vector-images-a-brief-comparison/">Rastrs VS Vektoru Attēli: Īss Salīdzinājums</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
