{"id":1935,"date":"2023-04-01T09:59:16","date_gmt":"2023-04-01T01:59:16","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=1935"},"modified":"2023-04-22T08:47:02","modified_gmt":"2023-04-22T00:47:02","slug":"generating-thumbnails-for-word-in-java","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/04\/01\/generating-thumbnails-for-word-in-java\/","title":{"rendered":"Java\u4e2d\u5c06Word\u751f\u6210\u7f29\u7565\u56fe"},"content":{"rendered":"<h2>\u89e3\u51b3\u601d\u8def<\/h2>\n<p>1\u3001\u5148\u5c06word\u751f\u6210pdf\uff0c\u8fd9\u4e2a\u91c7\u7528openoffice\u6216\u8005jacob<\/p>\n<p>2\u3001\u7136\u540e\u5c06pdf\u751f\u6210\u56fe\u7247<\/p>\n<blockquote>\n<p>\u6ce8\uff1a\u9700\u8981\u5b89\u88c5OpenOffice\u4f9d\u8d56\uff0c\u5e76\u542f\u52a8<code>soffice<\/code>\u670d\u52a1<\/p>\n<\/blockquote>\n<p><!-- more --><\/p>\n<h2>\u4f9d\u8d56\u5f15\u5165<\/h2>\n<p>\u9700\u8981\u7684jar\u5305\u662f<code>pdfrenderer.jar<\/code>\u548c<code>jodconverter-2.2.2.jar<\/code>\u5305\uff0c\u5982\u679c\u4f7f\u7528<code>jacob<\/code>\u8fd8\u5f97\u52a0\u5165<code>jacob.jar<\/code><\/p>\n<blockquote>\n<p>\u6ce8\uff1aMaven\u4e0a<code>pdfrenderer.jar<\/code>\u4e0d\u80fd\u4e0b\u8f7d\uff0c<code>jodconverter.jar<\/code>\u53ea\u80fd\u4e0b\u8f7d2.2.1\u7248\u672c\u7684\uff0c\u4e24\u8005\u5747\u9700\u8981\u624b\u52a8\u4e0b\u8f7d\u6216\u90e8\u7f72\u81f3\u79c1\u670d<\/p>\n<\/blockquote>\n<ul>\n<li>JODConverter\u4e0b\u8f7d\u5730\u5740\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/sourceforge.net\/projects\/jodconverter\/files\/JODConverter\/\">https:\/\/sourceforge.net\/projects\/jodconverter\/files\/JODConverter\/<\/a><\/li>\n<li>PDFRenderer\u4e0b\u8f7d\u5730\u5740\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/artifacts.alfresco.com\/nexus\/content\/repositories\/public\/com\/sun\/pdfview\/pdfrenderer\/\">https:\/\/artifacts.alfresco.com\/nexus\/content\/repositories\/public\/com\/sun\/pdfview\/pdfrenderer\/<\/a><\/li>\n<\/ul>\n<pre><code class=\"language-xml\">&lt;!-- https:\/\/mvnrepository.com\/artifact\/com.artofsolving\/jodconverter --&gt;\n&lt;dependency&gt;\n  &lt;groupId&gt;com.artofsolving&lt;\/groupId&gt;\n  &lt;artifactId&gt;jodconverter&lt;\/artifactId&gt;\n  &lt;version&gt;2.2.2&lt;\/version&gt;\n&lt;\/dependency&gt;\n&lt;!-- https:\/\/mvnrepository.com\/artifact\/com.sun.pdfview\/pdfrenderer --&gt;\n&lt;dependency&gt;\n  &lt;groupId&gt;com.sun.pdfview&lt;\/groupId&gt;\n  &lt;artifactId&gt;pdfrenderer&lt;\/artifactId&gt;\n  &lt;version&gt;0.9.1-patched&lt;\/version&gt;\n&lt;\/dependency&gt;\n&lt;!-- https:\/\/mvnrepository.com\/artifact\/org.openoffice\/ridl --&gt;\n&lt;dependency&gt;\n  &lt;groupId&gt;org.openoffice&lt;\/groupId&gt;\n  &lt;artifactId&gt;ridl&lt;\/artifactId&gt;\n  &lt;version&gt;4.1.2&lt;\/version&gt;\n&lt;\/dependency&gt;\n&lt;!-- https:\/\/mvnrepository.com\/artifact\/org.slf4j\/slf4j-api --&gt;\n&lt;dependency&gt;\n  &lt;groupId&gt;org.slf4j&lt;\/groupId&gt;\n  &lt;artifactId&gt;slf4j-api&lt;\/artifactId&gt;\n  &lt;version&gt;1.7.30&lt;\/version&gt;\n&lt;\/dependency&gt;\n&lt;!-- https:\/\/mvnrepository.com\/artifact\/commons-io\/commons-io --&gt;\n&lt;dependency&gt;\n  &lt;groupId&gt;commons-io&lt;\/groupId&gt;\n  &lt;artifactId&gt;commons-io&lt;\/artifactId&gt;\n  &lt;version&gt;2.8.0&lt;\/version&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n<h2>\u4ee3\u7801\u5b9e\u73b0<\/h2>\n<p>\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-java\">public static void main(String[] args) throws IOException {\n    File officeFile = new File(&quot;D:\/test.doc&quot;);\n    File pdfFile = new File(&quot;D:\/test.pdf&quot;);\n    officeToPdf(officeFile, pdfFile);\n    pdfToJPG(&quot;D:\/test.pdf&quot;, &quot;D:\/&quot;);\n}\n\nprivate static void officeToPdf(File officeFile, File pdfFile) {\n    OpenOfficeConnection connection = new SocketOpenOfficeConnection(&quot;127.0.0.1&quot;, 8100);\n    try {\n        connection.connect();\n        DocumentConverter converter = new OpenOfficeDocumentConverter(\n                connection);\n        converter.convert(officeFile, pdfFile);\n    } catch (ConnectException e) {\n        e.printStackTrace();\n    } finally {\n        \/\/ close the connection\n        connection.disconnect();\n    }\n}\n\n\/\/ \u5c06PDF\u683c\u5f0f\u7684\u6587\u4ef6\u8f6c\u6362\u4e3aJPG\u683c\u5f0f\u7684\u6587\u4ef6\nprivate static void pdfToJPG(String pdfPath, String imagePath) throws IOException {\n    \/\/ load a pdf from a byte buffer\n    File file = new File(pdfPath);\n\n    RandomAccessFile raf = new RandomAccessFile(file, &quot;r&quot;);\n    FileChannel channel = raf.getChannel();\n    \/\/\u8fd9\u53e5\u4ee3\u7801\u901a\u9053\u5efa\u7acb\u4e86map\u6620\u5c04,\u5982\u679c\u8981\u5220\u9664file\u90a3\u4e48\u5f97\u63a5\u89e6\u6620\u5c04\n    ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0,\n            channel.size());\n    PDFFile pdffile = new PDFFile(buf);\n    int totalPage = pdffile.getNumPages();\n    for (int i = 1; i &lt;= totalPage; i++) {\n        if (i == 1) {\n            \/\/ draw the first page to an image\n            \/\/ \u4ee5\u56fe\u7247\u7684\u5f62\u5f0f\u6765\u63cf\u7ed8\u9996\u9875\n            PDFPage page = pdffile.getPage(i);\n            Rectangle rect = new Rectangle(0, 0, (int) page.getBBox()\n                    .getWidth(), (int) page.getBBox().getHeight());\n\n            \/\/ generate the image\n            \/\/ \u751f\u6210\u56fe\u7247\n            Image img = page.getImage(rect.width, rect.height, \/\/ width &amp; height\n                    rect, \/\/ clip rect\n                    null, \/\/ null for the ImageObserver\n                    true, \/\/ fill background with white\n                    true \/\/ block until drawing is done\n            );\n            BufferedImage tag = new BufferedImage(rect.width, rect.height,\n                    BufferedImage.TYPE_INT_RGB);\n            tag.getGraphics().drawImage(img.getScaledInstance(rect.width, rect.height, Image.SCALE_SMOOTH), 0, 0, rect.width, rect.height,\n                    null);\n\n            FileOutputStream out = new FileOutputStream(imagePath + File.separator + pdfPath.substring(pdfPath.lastIndexOf(&quot;\/&quot;) + 1, pdfPath.lastIndexOf(&quot;.&quot;))\n                    + &quot;.jpg&quot;); \/\/ \u8f93\u51fa\u5230\u6587\u4ef6\u6d41\n            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);\n            encoder.encode(tag); \/\/ JPEG\u7f16\u7801\n            \/\/ \u5173\u95ed\u8f93\u51fa\u6d41\n            out.close();\n            break;\n        }\n    }\n    buf.clear();\n    channel.close();\n    raf.close();\n    unmap(buf);\n    \/\/file.delete();\n}\n\n\/\/\u89e3\u9664map\u6620\u5c04\npublic static &lt;T&gt; void unmap(final Object buffer) {\n    AccessController.doPrivileged(new PrivilegedAction&lt;T&gt;() {\n        @Override\n        public T run() {\n            try {\n                Method getCleanerMethod = buffer.getClass().getMethod(&quot;cleaner&quot;, new Class[0]);\n                getCleanerMethod.setAccessible(true);\n                Cleaner cleaner = (sun.misc.Cleaner) getCleanerMethod.invoke(buffer, new Object[0]);\n                cleaner.clean();\n            } catch (Exception e) {\n                e.printStackTrace();\n            }\n            return null;\n        }\n    });\n}<\/code><\/pre>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u751f\u6210\u5b8c\u56fe\u7247\u540e\u5c06pdf\u5220\u9664\uff0c\u4f46\u662f\u5220\u9664\u5931\u8d25\uff0c\u7ecf\u8fc7\u5927\u725b\u7684\u6307\u70b9\u52a0\u4e0a\u4e86<code>unmap<\/code>\u5c31ok\u4e86\uff0c\u6545\u5199\u4e0b\u6765\u5206\u4eab\u7ed9\u5927\u5bb6\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u89e3\u51b3\u601d\u8def 1\u3001\u5148\u5c06word\u751f\u6210pdf\uff0c\u8fd9\u4e2a\u91c7\u7528openoffice\u6216\u8005jacob 2\u3001\u7136\u540e\u5c06pdf\u751f\u6210\u56fe\u7247 \u6ce8 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[43],"tags":[489,488],"class_list":["post-1935","post","type-post","status-publish","format-standard","hentry","category-java-basic","tag-pdf","tag-word"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1935","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1935"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1935\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1935"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1935"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1935"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}