From e429be8b8c4eb5717d76ad2d2765a708968af422 Mon Sep 17 00:00:00 2001 From: Erik Winlof Date: Wed, 3 Sep 2014 12:29:43 +0000 Subject: [PATCH] Merged HEAD-BUG-FIX (5.0/Cloud) to HEAD (5.0/Cloud) 78537: Merged V4.2-BUG-FIX (4.2.4) to HEAD-BUG-FIX (5.0/Cloud) 77398: MNT-11279: Docx Preview: FileName in the document header not previewing correctly - Keep original name during convertion. - Add unit testMNT-11279: Docx Preview: FileName in the document header not previewing correctly - Keep original name during convertion. - Add unit test git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@82590 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../OOoContentTransformerHelper.java | 39 ++++++++++++----- .../OpenOfficeContentTransformerTest.java | 41 ++++++++++++++++++ .../misc/Test-Header-Office-2010.docx | Bin 0 -> 18508 bytes 3 files changed, 69 insertions(+), 11 deletions(-) create mode 100644 source/test-resources/misc/Test-Header-Office-2010.docx diff --git a/source/java/org/alfresco/repo/content/transform/OOoContentTransformerHelper.java b/source/java/org/alfresco/repo/content/transform/OOoContentTransformerHelper.java index 75df736e6e..5ad498741b 100644 --- a/source/java/org/alfresco/repo/content/transform/OOoContentTransformerHelper.java +++ b/source/java/org/alfresco/repo/content/transform/OOoContentTransformerHelper.java @@ -27,6 +27,7 @@ import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; +import java.util.Date; import net.sf.jooreports.converter.DocumentFamily; import net.sf.jooreports.converter.DocumentFormat; @@ -36,11 +37,7 @@ import net.sf.jooreports.openoffice.connection.OpenOfficeException; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.repo.content.MimetypeMap; -import org.alfresco.service.cmr.repository.ContentIOException; -import org.alfresco.service.cmr.repository.ContentReader; -import org.alfresco.service.cmr.repository.ContentWriter; -import org.alfresco.service.cmr.repository.MimetypeService; -import org.alfresco.service.cmr.repository.TransformationOptions; +import org.alfresco.service.cmr.repository.*; import org.alfresco.util.TempFileProvider; import org.apache.commons.logging.Log; import org.apache.pdfbox.exceptions.COSVisitorException; @@ -334,13 +331,23 @@ public abstract class OOoContentTransformerHelper extends ContentTransformerHelp " writer: " + writer); } + // MNT-11279 fix. Because of the creating temp files for transformations the document's header with file name field + // could be changed to temporary file's name. + // Get the original file name which was on upload. + String origFileName = getOriginalFileName(options); + // Create a temp folder and put source and target files into it. (i.e. tempFromFile and tempToFile will be placed + // into such folder) + File tempSubfolder = new File(TempFileProvider.getTempDir() + File.separator + + origFileName + "-" + getTempFilePrefix() + "-" + + getTempFilePrefix() + "-" + new Date().getTime()); + tempSubfolder.mkdir(); + // create temporary files to convert from and to - File tempFromFile = TempFileProvider.createTempFile( - getTempFilePrefix()+"-source-", - "." + sourceExtension); + // The source file should have the name which was on upload + File tempFromFile = new File(tempSubfolder, origFileName ); File tempToFile = TempFileProvider.createTempFile( - getTempFilePrefix()+"-target-", - "." + targetExtension); + origFileName + "-" + getTempFilePrefix()+"-target-", + "." + targetExtension, tempSubfolder); // There is a bug (reported in ALF-219) whereby JooConverter (the Alfresco Community Edition's 3rd party // OpenOffice connector library) struggles to handle zero-size files being transformed to pdf. @@ -376,6 +383,11 @@ public abstract class OOoContentTransformerHelper extends ContentTransformerHelp " to file: " + tempToFile, e); } + catch (Throwable ee) + { + produceEmptyPdfFile(tempToFile); + getLogger().error("Convertation problem", ee); + } } if (getLogger().isDebugEnabled()) @@ -396,7 +408,12 @@ public abstract class OOoContentTransformerHelper extends ContentTransformerHelp getLogger().debug("transformation successful"); } } - + + private String getOriginalFileName(TransformationOptions options) + { + return transformerDebug == null ? null : transformerDebug.getFileName(options, true, -1); + } + private boolean temporaryMsFile(TransformationOptions options) { String fileName = transformerDebug == null ? null : transformerDebug.getFileName(options, true, -1); diff --git a/source/test-java/org/alfresco/repo/content/transform/OpenOfficeContentTransformerTest.java b/source/test-java/org/alfresco/repo/content/transform/OpenOfficeContentTransformerTest.java index 31f113c331..58e01ec3c9 100644 --- a/source/test-java/org/alfresco/repo/content/transform/OpenOfficeContentTransformerTest.java +++ b/source/test-java/org/alfresco/repo/content/transform/OpenOfficeContentTransformerTest.java @@ -134,6 +134,47 @@ public class OpenOfficeContentTransformerTest extends AbstractContentTransformer transformer.transform(reader, writer); } + /** + * MNT-11279. Transform docx document that contains head with value "documentName" to pdf. + * + */ + public void testDocxFieldToPdf() + { + if (!worker.isAvailable()) + { + // no connection + return; + } + URL docxUrl = this.getClass().getClassLoader().getResource("misc/Test-Header-Office-2010.docx"); + assertNotNull("URL was unexpectedly null", docxUrl); + + File docxSourceFile = new File(docxUrl.getFile()); + assertTrue("Test file does not exist.", docxSourceFile.exists()); + + File pdfTargetFile = TempFileProvider.createTempFile(getName() + "-target-", ".pdf"); + + ContentReader reader = new FileContentReader(docxSourceFile); + reader.setMimetype(MimetypeMap.MIMETYPE_WORD); + ContentWriter writer = new FileContentWriter(pdfTargetFile); + writer.setMimetype(MimetypeMap.MIMETYPE_PDF); + + transformer.transform(reader, writer); + + //Transform to txt for checking content + reader = new FileContentReader(pdfTargetFile); + reader.setMimetype(MimetypeMap.MIMETYPE_PDF); + + File txtTargetFile = TempFileProvider.createTempFile(getName() + "-target-", ".txt"); + + writer = new FileContentWriter(txtTargetFile); + writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN); + + transformer.transform(reader, writer); + + String txtContent = writer.getReader().getContentString(); + assertTrue("Transformed document must contains real document name", txtContent.contains("Document File Name: Test-Header-Office-2010Test-Header-Office-2010")); + } + /** * Some transformations fail intermittently within OOo on our test server. * Rather than exclude these transformations from product code, where they diff --git a/source/test-resources/misc/Test-Header-Office-2010.docx b/source/test-resources/misc/Test-Header-Office-2010.docx new file mode 100644 index 0000000000000000000000000000000000000000..dd9ebed78e49b145e9f7172e4fe7b732c57745b2 GIT binary patch literal 18508 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

fwxAA&o=DzjWT@Ms|p4jFlj z>BH6H!pb+uv=C68qsS3P><=Pewk2rec+;#K#EhaYhFWNnPaq~%Wv;8OXChr##&ls# z1>X-{<16Pb(g?uLtD@!mQ~MO=t-R`e?EwZfQID~q!NNeyA7Gp~?Q z$LRTn(NUSHyQCoWJynO1U!-4S7*1X-#n8aDYl}n{6AzaamZsR5y5l$k$lC|!(c3Cw zwNsbnT$uzDFR5LPOLHF4ZKJ1P)!b~C*4<5;UV)MDl7(c(KDKN~25UY4t0zk}-5J|v z3+Q6-GoOQt1UG0H>*a1RW&3~CLA7o(A9aBKz5g?h!`4aJz|i^+C7g|K11!Zx3A_jK zg7ovCkyL#R9u(M876~>spMlJ_7$%~M1(DFYJUYqX%8QbBGWVl%#|G87hG~1M=3KC} zu9Gt1kDee!pyR_`ovGD|;gl+XS7Q>^g(MD^C^6L@7rNObkgiI4n1yi_mjl6^`0&P}S z-6|sz_MgK=3oaWBwm)OE)Vo{|lH`a)BC~TF9gA5~3OecTL0BrfI3C460&jiI^DJ@K z7z|Mka+lYNWf5K&K=KB^-$LK8br7@NIm%Mvm$C}0<^WYqRX`7U`Wh~jI{Yk`8FT0&Q;J7a?){((jHDPF48;1Cq%VYX$M zca@5hizE}TotMYc6_3y7OY6Jh6+v+ug!poQUN0icKj+(6(K1EhLA<*U#<3tgPS?_G+_Gb=;+$0;bRp# ziEV-`yG-PyAX=m+R&*M$j8FL8RQjC_GZhioF}MyclZaWxB@C|K;UQ^p5tp0YeENoq zYd6`?;g&6+Fq7Z(1@^xU2>U~cT^xbiW$)d^urXpL%DtX&Zl< zR;opyQ5OvGstS{T8~l8dcRL%vUNh;Y*ucm$j5#v^q-q&J=}7ErhQCZwSwJ8PHc}oY ziHuEQRy#ouhG8pIB}#2*wdl>;M{4S$)lqor$E38fbxZs2^epYAuRE;60IhT(dhy38QwpXC^wY%FwkI z-@X*)C`2x_YO_LsHV`VrM-Yy*aj^A+(u_!2SJVb;k8HFu#N|TBrk7%qaXV&K(na)M@OxlfQN)%9@*bn7OJOiqG0i{D6bsdubQ@ z*9ZeJ2rXbL>A&w5@~0;J`T1Y=4w0AoC%`{9A^219*XI$y-2S#D!S90qOvV1YATA({ z;s2JH{X5d{S+sv)l>uhb|0AdNck$oT4gV7F25h_Vhxk8|4}X{cJss^Y`K=HClK*>h z+VA4Orz`y>4h%?c`=j{3B`^Ih{d;o9U(!f``NDs*zJH{8{EqSalDfYz*75#TgWng} z{SNW_(uKbuno0i!@%M!czl;Aq&H0!380Ejjf1C9D9pU#$zrPTG0a;>ywBmoA0{k84 z_c6D>aE6)xf%7YH{4V@Y(*2hx5D*0S-(JR_6#RGb-}%yC0AalUD%%vWm(Rc1)9>>C ljB|fU1F~oZ{#N|IqMp1IIDnV^iin6nFknDHG{V3B`#<$MRx|(r literal 0 HcmV?d00001