<?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>API on File Format Blog</title>
    <link>https://blog.fileformat.com/ms/tag/api/</link>
    <description>Recent content in API on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ms</language>
    <lastBuildDate>Sun, 19 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/ms/tag/api/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>API Sumber Terbuka Terbaik untuk Menukar Dokumen Microsoft Office kepada Imej</title>
      <link>https://blog.fileformat.com/ms/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/ms/image/top-open-source-office-document-to-image-converter-apis-complete-guide/</guid>
      <description>Panduan komprehensif untuk pembangun mengenai penukaran dokumen Office kepada imej sumber terbuka. Terokai aliran kerja struktur, tip penskalaan Docker, dan perbandingan API percuma teratas.</description>
      <content:encoded><![CDATA[<p><strong>Terakhir Dikemas Kini</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="api-sumber-terbuka17-yang-menukar-dokumen-office-kepada-imej-panduan-terunggul"><a href="https://products.fileformat.com/word-processing/">API Sumber Terbuka</a> Yang Menukar Dokumen Office kepada Imej: Panduan Terunggul</h2>
<p>Dalam pembangunan perisian moden, pemprosesan dokumen merupakan keperluan berulang. Sama ada anda membina intranet perusahaan, sistem pengurusan dokumen (DMS), atau platform kolaboratif, menukar dokumen Microsoft Office (Word, Excel, PowerPoint) menjadi imej berkualiti tinggi (<a href="https://docs.fileformat.com/image/png/">PNG</a>, <a href="https://docs.fileformat.com/image/jpeg/">JPEG</a>) adalah ciri penting. Imej dapat dibaca secara universal di semua pelayar, peranti mudah alih, dan sistem operasi tanpa memerlukan pemalam luaran atau suite pejabat yang berat.</p>
<p>Walaupun API komersial menawarkan penyelesaian yang kukuh, alternatif sumber terbuka menyediakan fleksibiliti, penjimatan kos, dan kawalan penuh ke atas privasi data—faktor penting apabila memproses dokumen perusahaan yang sensitif.</p>
<p>Panduan komprehensif ini meneroka API, perpustakaan, dan enjin sumber terbuka teratas untuk menukar dokumen Office kepada imej, menilai kelebihan, kekurangan, dan ciri prestasi mereka.</p>
<h2 id="mengapa-menukar-dokumen-office-kepada-imej">Mengapa Menukar Dokumen Office kepada Imej?</h2>
<p>Sebelum menyelami alat-alat, mari kita lihat mengapa pemaju kerap menukar dokumen Word (<code>.docx</code>), lembaran kerja (<code>.xlsx</code>), dan persembahan (<code>.pptx</code>) menjadi imej:</p>
<ol>
<li><strong>Pratinjau Universal:</strong> Penyemak imbas web tidak dapat memaparkan fail <code>.docx</code> atau <code>.pptx</code> secara asli. Menukarnya kepada <code>.png</code> atau <code>.jpg</code> membolehkan penonton dokumen berasaskan penyemak imbas secara serta-merta.</li>
<li><strong>Kebebasan Platform:</strong> Aplikasi mudah alih dapat memaparkan imej serta-merta tanpa memerlukan enjin pemaparan dokumen yang berat.</li>
<li><strong>Keselamatan dan Kebolehbacaan:</strong> Berkongsi imej dokumen memastikan susun atur tetap serupa di semua peranti dan menghalang penyuntingan teks yang mudah dan tidak dibenarkan.</li>
<li><strong>Penjanaan Thumbnail:</strong> Aliran kerja automatik selalunya memerlukan pratonton visual kecil bagi dokumen untuk penjelajah fail dan hasil carian.</li>
</ol>
<h2 id="penyelesaian-sumber-terbuka-teratas-untuk-penukaran-dokumen-ke-imej">Penyelesaian Sumber Terbuka Teratas untuk Penukaran Dokumen-ke-Imej</h2>
<h3 id="1libreoffice4--openoffice-mod-tanpa-antara-muka">1.<a href="https://github.com/LibreOffice/">LibreOffice</a> / OpenOffice (Mod Tanpa Antara Muka)</h3>
<p>LibreOffice adalah gergasi yang tidak dapat dipertikaikan dalam ekosistem pemprosesan dokumen sumber terbuka. Dalam mod &ldquo;headless&rdquo; (berjalan tanpa antara muka pengguna grafik), LibreOffice boleh dipicu melalui CLI atau dibungkus dalam API mikroservis ringan untuk menukar hampir semua format dokumen Office.</p>
<h4 id="cara-memasang">Cara Memasang</h4>
<p>Pada sistem berasaskan Debian/Ubuntu, pasang pakej LibreOffice tanpa kepala bersama <code>poppler-utils</code> (yang menyediakan <code>pdftoppm</code> untuk penukaran PDF kepada imej):</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="contoh-kod-pembalut-api-nodejs">Contoh Kod (Pembalut API Node.js)</h4>
<p>Berikut ialah pembungkus Node.js yang memanggil binari LibreOffice tanpa kepala untuk menukar <code>.docx</code> kepada PDF, dan kemudian merasterkannya menjadi PNG:</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="kelebihan">Kelebihan</h4>
<ul>
<li><strong>Sokongan Format Tiada Tandingan:</strong> Kesetiaan cemerlang untuk <code>.docx</code>, <code>.doc</code>, <code>.xlsx</code>, <code>.xls</code>, <code>.pptx</code>, dan <code>.ppt</code>.</li>
<li><strong>Sangat Stabil:</strong> Diselenggarakan secara aktif oleh komuniti global yang besar.</li>
<li><strong>Ketepatan Susun Atur:</strong> Pemeliharaan cemerlang fon, margin, jadual, dan carta bersarang.</li>
</ul>
<h4 id="kekurangan">Kekurangan</h4>
<ul>
<li><strong>Intensif Sumber:</strong> Menjalankan proses LibreOffice tanpa kepala memerlukan RAM dan CPU yang signifikan.</li>
<li><strong>Beban Pelaksanaan:</strong> Membuat proses CLI baru bagi setiap penukaran boleh mengehadkan kadar pemprosesan di bawah beban serentak yang tinggi.</li>
</ul>
<h3 id="2-apache-poi1-ekosistem-java">2. <a href="https://products.fileformat.com/word-processing/java/apache-poi-xwpf/">Apache POI</a> (Ekosistem Java)</h3>
<p>Untuk pemaju yang bekerja dalam JVM (Java, Kotlin, Scala), Apache POI ialah perpustakaan standard untuk membaca dan menulis format Microsoft Office. Ia mempunyai komponen rendering langsung yang mampu mengeksport slaid atau helaian kepada imej.</p>
<h4 id="cara-memasang-1">Cara Memasang</h4>
<p>Tambah kebergantungan Apache POI ke dalam <code>pom.xml</code> Maven anda:</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="contoh-kod-penukaran-pptx-ke-imej-java">Contoh Kod (Penukaran PPTX ke Imej Java)</h4>
<p>Menggunakan Apache POI untuk mengurai fail PowerPoint (<code>.pptx</code>) dan melukis slaid individu secara langsung ke imej raster:</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="kelebihan-1">Kelebihan</h4>
<ul>
<li><strong>Penyelesaian Java Tulen:</strong> Tiada binari luaran atau perisian peringkat sistem diperlukan.</li>
<li><strong>Kawalan Granular:</strong> Membolehkan mengubah elemen dokumen secara programatik sebelum dieksport.</li>
<li><strong>Jejak Rendah:</strong> Pelaksanaan lebih pantas berbanding melancarkan suite sistem tanpa kepala untuk penukaran skala kecil.</li>
</ul>
<h4 id="kekurangan-1">Kekurangan</h4>
<ul>
<li><strong>Persediaan Kompleks:</strong> Memaparkan dokumen Word dengan susun atur kompleks memerlukan kod boilerplate yang ketara.</li>
<li><strong>Kesetiaan Tidak Konsisten:</strong> Pemformatan lanjutan dan carta Excel kompleks mungkin tidak dipaparkan dengan setia 100% berbanding MS Office asli.</li>
</ul>
<h3 id="3-pandoc--weasyprint--wkhtmltopdf">3. Pandoc + WeasyPrint / wkhtmltopdf</h3>
<p>Pandoc dikenali sebagai &ldquo;penukar dokumen sejagat&rdquo;. Dengan menggunakan Pandoc bersama penjana HTML-ke-imej moden, pembangun dapat mencipta saluran dokumen-ke-imej yang sangat boleh disesuaikan.</p>
<h4 id="cara-memasang-2">Cara Memasang</h4>
<p>Pada platform Linux, anda boleh memasang pakej yang diperlukan menggunakan pengurus pakej anda:</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="contoh-kod-pembungkus-paip-python">Contoh Kod (Pembungkus Paip Python)</h4>
<p>Saluran ini menukar dokumen <code>.docx</code> kepada HTML antara dengan Pandoc, menata gaya, dan kemudian menyusunnya menjadi imej PNG menggunakan 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="kelebihan-2">Kelebihan</h4>
<ul>
<li><strong>Sangat Boleh Disesuaikan:</strong> Oleh kerana peringkat antara adalah HTML, anda boleh menyuntik CSS tersuai untuk menata gaya pratonton dokumen secara dinamik.</li>
<li><strong>Sangat Cepat:</strong> Setelah dikonfigurasi, mengurai dokumen yang banyak teks adalah sangat pantas.</li>
</ul>
<h4 id="kekurangan-2">Kekurangan</h4>
<ul>
<li><strong>Keterbatasan Kesetiaan:</strong> Tata letak dokumen yang sangat bergaya dan templat korporat yang kompleks tidak diterjemahkan dengan sempurna dari Docx ke HTML.</li>
<li><strong>Penyetelan Manual:</strong> Sesuai untuk laporan atau surat berbanding pembentangan yang kaya media.</li>
</ul>
<h3 id="4-python-docx3--pdf2image-ekosistem-python">4. <a href="https://blog.fileformat.com/image/difference-between-bmp-and-png/">Python-Docx</a> &amp; pdf2image (Ekosistem Python)</h3>
<p>Bagi pemaju Python, pendekatan biasa melibatkan membaca struktur dokumen atau memanfaatkan skrip pembantu untuk mengeksport fail dengan selamat.</p>
<h4 id="cara-memasang-3">Cara Memasang</h4>
<p>Pastikan kedua-dua LibreOffice dan pakej sistem <code>poppler-utils</code> dipasang, kemudian sediakan pakej Python:</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="contoh-kod-pelaksanaan-mikros-perkhidmatan-python">Contoh Kod (Pelaksanaan Mikros Perkhidmatan Python)</h4>
<p>Dengan menggabungkan perpustakaan pelaksanaan Python dengan <code>pdf2image</code> dan binari LibreOffice tempatan, pembangun dapat menulis API penukaran yang bersih dan menyokong async:</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="kelebihan-3">Kelebihan</h4>
<ul>
<li><strong>Mudah Dipasang:</strong> Boleh dengan mudah dibungkus dalam kontena Docker (contoh, <code>python:3.10-slim</code> dengan <code>libreoffice</code> dipasang).</li>
<li><strong>Automasi Fleksibel:</strong> Mudah diintegrasikan dengan barisan mesej berasaskan awan (Celery, RabbitMQ) untuk pemprosesan latar belakang.</li>
</ul>
<h2 id="amalan-terbaik-seni-bina-untuk-skala-pengeluaran">Amalan Terbaik Seni Bina untuk Skala Pengeluaran</h2>
<p>Jika anda merancang untuk menjalankan perpustakaan penukaran sumber terbuka dalam persekitaran produksi trafik tinggi, pertimbangkan strategi seni bina berikut:</p>
<h3 id="1-manfaatkan-docker-untuk-pengasingan-kotak-pasir">1. Manfaatkan Docker untuk Pengasingan Kotak Pasir</h3>
<p>Menjalankan alat seperti LibreOffice sebagai subproses kadang‑kadang boleh menyebabkan proses beku atau kebocoran memori. Menjadikan enjin penukaran dokumen anda dalam kontena memastikan bahawa jika penukaran gagal, pelayan web utama tidak terjejas.</p>
<h3 id="2-laksanakan-sistem-barisan">2. Laksanakan Sistem Barisan</h3>
<p>Penukaran dokumen sangat bergantung pada CPU. Jangan sekali‑sekali menjalankan penukaran secara langsung dalam permintaan web serentak. Gunakan barisan kerja tak segerak (seperti Celery, BullMQ, atau Sidekiq) untuk mengendalikan penukaran di latar belakang dan memberitahu klien melalui WebSockets atau polling.</p>
<h3 id="3-simpan-output-dalam-cache">3. Simpan Output dalam Cache</h3>
<p>Jika dokumen bersifat statik, sentiasa simpan hasil imej yang dihasilkan dalam baldi penyimpanan objek (seperti AWS S3 atau MinIO) dan layani melalui CDN. Jangan menukar fail yang sama dua kali.</p>
<h2 id="perbandingan-ringkas">Perbandingan Ringkas</h2>
<table>
<thead>
<tr>
<th style="text-align:left">Alat / Perpustakaan</th>
<th style="text-align:left">Kesetiaan Susun Atur</th>
<th style="text-align:left">Kebergantungan Sistem</th>
<th style="text-align:left">Prestasi (Kelajuan)</th>
<th style="text-align:left">Kes Penggunaan Terbaik</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>LibreOffice Headless</strong></td>
<td style="text-align:left">Cemerlang</td>
<td style="text-align:left">Tinggi (Memerlukan Suite LibreOffice)</td>
<td style="text-align:left">Sederhana</td>
<td style="text-align:left">Kompleks <code>.docx</code>, <code>.xlsx</code>, <code>.pptx</code> di mana kesetiaan visual adalah keutamaan utama.</td>
</tr>
<tr>
<td style="text-align:left"><strong>Apache POI</strong></td>
<td style="text-align:left">Sederhana</td>
<td style="text-align:left">Rendah (JVM Sahaja)</td>
<td style="text-align:left">Tinggi</td>
<td style="text-align:left">Penukaran slaid-ke-imej yang pantas dalam aplikasi perusahaan Java asli.</td>
</tr>
<tr>
<td style="text-align:left"><strong>Pandoc Pipeline</strong></td>
<td style="text-align:left">Rendah-Sederhana</td>
<td style="text-align:left">Rendah (Pandoc + Renderer)</td>
<td style="text-align:left">Sangat Tinggi</td>
<td style="text-align:left">Laporan ringkas, bertekstual berat dan dokumen programatik yang sangat terstruktur.</td>
</tr>
<tr>
<td style="text-align:left"><strong>Pembungkus Python</strong></td>
<td style="text-align:left">Cemerlang</td>
<td style="text-align:left">Tinggi (LibreOffice + Poppler)</td>
<td style="text-align:left">Sederhana-Tinggi</td>
<td style="text-align:left">Prototip aplikasi web pantas, mikroservis ringan.</td>
</tr>
</tbody>
</table>
<h2 id="pemikiran-akhir">Pemikiran Akhir</h2>
<p>Berpindah kepada penyelesaian sumber terbuka untuk rendering dokumen-ke-imej adalah cara yang sangat berkesan untuk menghapuskan kebergantungan vendor dan yuran lesen yang tinggi. Walaupun LibreOffice tanpa kepala menawarkan kesetiaan penukaran visual terbaik secara langsung, ia memerlukan persediaan sistem yang kukuh dan pengasingan kontena yang betul untuk mengendalikan lonjakan dengan selamat. Sebaliknya, pelaksanaan asli JVM seperti Apache POI menawarkan kelajuan integrasi yang tiada tandingan jika anda hanya menukar slaid atau senarai data ringkas.</p>
<p>Nilai kerumitan susun atur dokumen sasaran anda dan pilih rantaian alat yang sepadan dengan tumpukan teknologi semasa anda untuk hasil terbaik!</p>
<h2 id="bahagian-soalan-lazim">Bahagian Soalan Lazim</h2>
<ol>
<li>
<p><strong>Bagaimana saya menukar fail <a href="https://docs.fileformat.com/word-processing/docx/">DOCX</a> kepada <a href="https://docs.fileformat.com/image/png/">PNG</a> menggunakan LibreOffice tanpa kepala?</strong></p>
<ul>
<li><strong>Jawapan:</strong> Anda memanggil <code>soffice --headless --convert-to pdf document.docx</code> melalui sistem pelaksanaan shell runtime anda untuk menghasilkan PDF antara, kemudian memproses fail PDF tersebut menjadi PNG halaman individu menggunakan utiliti rendering sistem seperti <code>pdftoppm</code>.</li>
</ul>
</li>
<li>
<p><strong>Bolehkah perpustakaan sumber terbuka mengekalkan carta Excel yang kompleks semasa menukar kepada imej?</strong></p>
<ul>
<li><strong>Jawapan:</strong> Hanya enjin sistem penuh seperti LibreOffice tanpa kepala dapat menukar carta Excel yang rumit dan makro visual dengan tepat; parser berasaskan kod semata-mata seperti Apache POI mentah selalunya mengabaikan gaya lanjutan atau graf visual.</li>
</ul>
</li>
<li>
<p><strong>Adakah Apache POI sesuai untuk menukar keseluruhan dek PowerPoint ke format imej?</strong></p>
<ul>
<li><strong>Jawapan:</strong> Ya, Apache POI termasuk komponen lukisan khusus <code>XSLFSlide</code> yang memaparkan slaid PowerPoint secara langsung ke objek memori Java asli (<code>Graphics2D</code>), menjadikannya sangat pantas untuk memproses dek <code>.pptx</code>.</li>
</ul>
</li>
<li>
<p><strong>Bagaimana saya boleh mengendalikan penukaran dokumen-ke-imej berkelajuan tinggi tanpa melambatkan aplikasi web utama saya?</strong></p>
<ul>
<li><strong>Jawapan:</strong> Alihkan tugas sepenuhnya daripada benang aplikasi HTTP utama anda ke dalam ekosistem barisan kerja latar belakang tak segerak seperti Celery, BullMQ, atau Sidekiq yang dijalankan dalam instans Docker berpasir.</li>
</ul>
</li>
<li>
<p><strong>Penukar dokumen sumber terbuka mana yang menawarkan kesetiaan susun atur dan fon tertinggi?</strong></p>
<ul>
<li><strong>Jawapan:</strong> LibreOffice tanpa kepala menawarkan kesetiaan penukaran tertinggi kerana ia menggunakan enjin susun atur desktop berskala penuh untuk mengurai gaya, margin, media terbenam, dan tipografi berbilang halaman yang kompleks.</li>
</ul>
</li>
</ol>
<h2 id="lihat-juga">Lihat Juga</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: Format Imej Terbaik untuk Pembangun pada 2026</a></li>
<li><a href="https://blog.fileformat.com/image/difference-between-bmp-and-png/">Perbezaan antara BMP dan 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: Format fail imej mana yang lebih baik?</a></li>
<li><a href="https://blog.fileformat.com/2021/08/25/raster-vs-vector-images-a-brief-comparison/">Imej Raster VS Vektor: Perbandingan Ringkas</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
