精华内容
下载资源
问答
  • word转换pdf的技术方案,供参考。【doc/docx/ppt/pptx/xls/xlsx均支持转换】 本方案是Java结合shell命令完成,不同于以往的仅依赖java组件转换或打印pdf的方案,需要目标服务器安装office套件,可选方案有...
    word转换pdf的技术方案,供参考。【doc/docx/ppt/pptx/xls/xlsx均支持转换】
     
            本方案是Java结合shell命令完成,不同于以往的仅依赖java组件转换或打印pdf的方案,需要目标服务器安装office套件,可选方案有OpenOffice和LibreOffice[二者源是一家产品],安装完office套件后,使用office提供的脚本完成转换。安装LibreOffice时,为避免复杂的依赖关系,建议采用yum方式安装:yum install libreoffice
     
            脚本内容:soffice --headless --invisible --convert-to pdf 源office文档路径 --outdir 目录存储目录

     
    需要将以上脚本编写成sh脚本的形式,其中源路径需要配置成参数,由Java程序调用sh脚本时传入,转换结束后,到指定的目录可取到同名的pdf文档,再进行与业务相关的逻辑处理。注:临时目录需要定期清理,防止存储过多临时文档,导致磁盘占满。

    Java调用代码:

     

    Java代码  收藏代码
    1.   try {  
    2.             String shpath = "/tmp/topdf.sh";//脚本路径,脚本中需要将源doc路径配置成变量,由下行程序调用时入参  
    3. String cmd = "param";//xshell脚本入参  
    4.             Process ps = Runtime.getRuntime().exec(shpath,cmd);//  
    5.             ps.waitFor();//等待转换结果  
    6.   
    7.             BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));  
    8.             StringBuffer sb = new StringBuffer();  
    9.             String line;  
    10.             while ((line = br.readLine()) != null) {  
    11.                 sb.append(line).append("\n");  
    12.             }  
    13.             String result = sb.toString();  
    14.             System.out.println(result);  
    15.         } catch (Exception e) {  
    16.             e.printStackTrace();  
    17.         }  
     

     

    Shell脚本代码  收藏代码
    1. #!/bin/sh    
    2.     
    3. source=$1  
    4. echo ${source}   
    5. soffice --headless --invisible --convert-to pdf ${source} --outdir /tmp/  
     

     

    但发现运行一段时间命令不再响应,没有文档结果。经检查服务器,libreoffice运行良好,但soffice --convert-to 命令就是无响应无输出。查看活跃线程如下:

     


     

    有两个相关的活跃实例在运行。

     

    经翻阅资料,这是LO在2011年产生的一个bug,相关bug list 参考:

    https://bugs.documentfoundation.org/show_bug.cgi?id=37531 

     

    https://bugs.documentfoundation.org/show_bug.cgi?id=45026     


     

    大体意思是LO GUI实例一旦运行过一个,再运行一个实例的话,就会出现无响应的问题。解决思路有两个:

    1、杀掉所有的libreoffice实例,即将上面的两个实例杀掉

    2、执行命令时增加一行参数,经测试下面两条命令均可以执行【必须保证命令的执行要有权限】:

    soffice --headless --convert-to pdf ${source-file} --outdir ${target-path}  "-env:UserInstallation=file:///tmp/LibreOffice_Conversion_${USER}"

    soffice --headless --convert-to pdf ${source-file} --outdir ${target-path}  -env:UserInstallation=file:///home/user/.libreoffice-alt     

    欢迎加入我的星球

    程序员,除了编码,生活还应该有沉淀!

    展开全文
  • C# 实现Excel转WordWord转PDF、合并PDF

    千次阅读 2015-05-21 15:47:35
    C# 实现Excel转WordWord转PDF、合并PDF

    1.Excel转Word实现如下

    (1)第一种直接Excel表格转Word文档,当时试过了就相当于手动的复制粘贴,可以试试,如果不满足需求,可以试试第二种方法:

     public void ExcelToWord(string excPath, string wordPath)
            {
                FileStream fs1 = new FileStream(excPath, FileMode.Open);

                StreamReader m_streamReader = new StreamReader(fs1);

                m_streamReader.BaseStream.Seek(0, SeekOrigin.Begin);

                string strLine ="aa"; //m_streamReader.ReadLine();

                FileStream fs2 = new FileStream(wordPath, FileMode.Create, FileAccess.Write);
                StreamWriter sw = new StreamWriter(fs2, System.Text.Encoding.GetEncoding("GB2312"));
                sw.WriteLine(strLine);
            }

    (2)这种方法是通过Word模板来创建Word文件,然后填充书签内容。(小编用的就是这种方法)

     /// <summary>
            /// 根据模板 创建案卷目录、卷内目录word版
            /// </summary>
            /// <param name="srcDgv">datatable</param>
            /// <param name="FileName">word保存文件地址</param>
            /// <param name="ArchivesNo"></param>
            /// <param name="wordPath">模板路径</param>
            /// <param name="typeName"></param>
            public void DatatableToWord(System.Data.DataTable srcDgv, string FileName, string ArchivesNo, string wordPath,string typeName)
            {
                string  path = FileName + ".doc";
                int rowStart =1;//添加数据起始行
                Report report = new Report();
                if (typeName == "卷内目录")
                {
                    rowStart = 4;
                    report.CreateNewDocument(wordPath + "JNML.doc");
                    //向标签中插入值
                    report.InsertValue("ArchivesNo", ArchivesNo);
                }
                else if (typeName == "案卷目录")
                {
                    rowStart = 3;
                    report.CreateNewDocument(wordPath + "AJML.doc");
                }
                if (srcDgv.Rows.Count > 15)
                {
                    for (int i = 0; i < (srcDgv.Rows.Count-15) / 15 + 1; i++)
                    {
                        report.AddRow( 1, 15);
                    }
                }
                for (int i = 0; i < srcDgv.Rows.Count; i++)
                {
                    string rowNum=(i+1).ToString();
                    string[] cells = new string[srcDgv.Columns.Count];
                    cells[0] = rowNum;
                    for (int j = 1; j < srcDgv.Columns.Count; j++)
                    {
                        cells[j] = srcDgv.Rows[i][j].ToString();
                    }
                    report.InsertCell(1, i + rowStart, srcDgv.Columns.Count, cells);
                }
                report.SaveDocument(path);
            }

     

    2.Word转PDF

    /// <summary>
            /// word转换方法
            /// </summary>
            /// <param name="sourcePath">源文件路径</param>
            /// <param name="targetPath">目标文件路径</param>
            /// <returns></returns>
            public bool WORD_ConvertTo_PDF(string sourcePath, string targetPath)
            {
                bool result = false;
                try
                {
                    Aspose.Words.Document doc = new Aspose.Words.Document(sourcePath);
                    doc.Save(targetPath, SaveFormat.Pdf);
                    result = true;
                }
                catch (Exception ex)
                {
                    result = false;
                }
                finally
                {
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                }
                return result;
            }

    Word创建类:

    class Report
        {
           private _Application wordApp = null;    
           private _Document wordDoc = null;    
           public _Application Application    
           {      
                get      {         return wordApp;       }      
                set      {         wordApp = value;       }    
            }    
            public _Document Document     {      
                get      {         return wordDoc;       }     
                set      {         wordDoc = value;       }    
            }
            //通过模板创建新文档    
            public void CreateNewDocument(string filepath)
            {
                killWinWordProcess();
                wordApp = new ApplicationClass();
                wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;
                wordApp.Visible = false;
                object missing =System.Reflection.Missing.Value;
                object templatename = filepath;
                wordDoc = wordApp.Documents.Open(ref templatename, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
            }
            //保存新文件    
            public void SaveDocument(string filePath)
            {
                object fileName = filePath;
                object format = WdSaveFormat.wdFormatDocument;
                //保存格式      
                object miss =System.Reflection.Missing.Value;      
                wordDoc.SaveAs(ref fileName, ref format, ref miss,ref miss, ref miss,ref miss, ref miss, ref miss, ref miss,ref miss, ref miss,ref miss, ref miss,ref miss, ref miss,ref miss);      
                //关闭wordDoc,wordApp对象      
                object SaveChanges =WdSaveOptions.wdSaveChanges;      
                object OriginalFormat =WdOriginalFormat.wdOriginalDocumentFormat;      
                object RouteDocument =false;      
                wordDoc.Close(ref SaveChanges, ref OriginalFormat, ref RouteDocument);      
                wordApp.Quit(ref SaveChanges, ref OriginalFormat, ref RouteDocument);    
            }
            //在书签处插入值    
            public bool InsertValue(string bookmark, string value)    
            {      
                object bkObj =bookmark;      
                if(wordApp.ActiveDocument.Bookmarks.Exists(bookmark))      
                {        
                    wordApp.ActiveDocument.Bookmarks.get_Item(ref bkObj).Select();        
                    wordApp.Selection.TypeText(value);        
                    return true;      
                }      
                return false;    
            }
            //插入表格,bookmark书签    
            public Table InsertTable(string bookmark, int rows, int columns,float width)    
            {      
                object miss =System.Reflection.Missing.Value;      
                object oStart =bookmark;      
                Range range =wordDoc.Bookmarks.get_Item(ref oStart).Range;
                //表格插入位置      
                Table newTable =wordDoc.Tables.Add(range,rows, columns, ref miss, ref miss);      
                //设置表的格式      
                newTable.Borders.Enable =1;
                //允许有边框,默认没有边框(为0时报错,1为实线边框,2、3为虚线边框,以后的数字没试过)      
                newTable.Borders.OutsideLineWidth=WdLineWidth.wdLineWidth050pt;//边框宽度      
                if(width != 0)      
                {        
                    newTable.PreferredWidth=width;//表格宽度      
                }      
                newTable.AllowPageBreaks =false;      
                return newTable;    
            }       
            //合并单元格 表名,开始行号,开始列号,结束行号,结束列号    
            public void MergeCell(Microsoft.Office.Interop.Word.Table table, int row1, int column1,int row2, int column2)    
            {      
                table.Cell(row1,column1).Merge(table.Cell(row2,column2));    
            }
            //设置表格内容对齐方式Align水平方向,Vertical垂直方向(左对齐,居中对齐,右对齐分别对应Align和Vertical的值为-1,0,1)    
            public void SetParagraph_Table(Microsoft.Office.Interop.Word.Table table, int Align, int Vertical)    
            {      
                switch(Align)      
                {        
                    case -1:
                        table.Range.ParagraphFormat.Alignment=WdParagraphAlignment.wdAlignParagraphLeft;
                        break;
                    //左对齐        
                    case 0:
                        table.Range.ParagraphFormat.Alignment=WdParagraphAlignment.wdAlignParagraphCenter;
                        break;//水平居中        
                    case 1:
                        table.Range.ParagraphFormat.Alignment=WdParagraphAlignment.wdAlignParagraphRight;
                        break;//右对齐     
                }      
                switch(Vertical)      
                {        
                    case -1:
                        table.Range.Cells.VerticalAlignment=WdCellVerticalAlignment.wdCellAlignVerticalTop;
                        break;//顶端对齐        
                    case 0:
                        table.Range.Cells.VerticalAlignment=WdCellVerticalAlignment.wdCellAlignVerticalCenter;
                        break;//垂直居中        
                    case 1:
                        table.Range.Cells.VerticalAlignment=WdCellVerticalAlignment.wdCellAlignVerticalBottom;
                        break;//底端对齐     
                }    
            }
             //设置表格字体    
            public void SetFont_Table(Microsoft.Office.Interop.Word.Table table, string fontName, double size)    
            {      
                if(size != 0)      
                {        
                    table.Range.Font.Size =Convert.ToSingle(size);      
                }      
                if(fontName !="")      
                {        
                    table.Range.Font.Name =fontName;      
                }    
            }       
            //是否使用边框,n表格的序号,use是或否    
            public void UseBorder(int n,bool use)    
            {      
                if(use)      
                {        
                    wordDoc.Content.Tables[n].Borders.Enable =1; //允许有边框,默认没有边框(为0时无边框,1为实线边框,2、3为虚线边框,以后的数字没试过)      
                }       else     
                {        
                    wordDoc.Content.Tables[n].Borders.Enable =2; //允许有边框,默认没有边框(为0时无边框,1为实线边框,2、3为虚线边框,以后的数字没试过)      
                }    
            }
            //给表格插入一行,n表格的序号从1开始记    
            public void AddRow(int n)    
            {      
                object miss =System.Reflection.Missing.Value;      
                wordDoc.Content.Tables[n].Rows.Add(ref miss);    
            }       
            //给表格添加一行    
            public void AddRow(Microsoft.Office.Interop.Word.Table table)    
            {      
                object miss =System.Reflection.Missing.Value;      
                table.Rows.Add(ref miss);    
            }       
            //给表格插入rows行,n为表格的序号    
            public void AddRow(int n, int rows)    
            {      
                object miss =System.Reflection.Missing.Value;      
                Microsoft.Office.Interop.Word.Table table = wordDoc.Content.Tables[n];      
                for(int i = 0; i < rows; i++)      
                {        
                    table.Rows.Add(ref miss);      
                }    
            }
            //给表格中单元格插入元素,table所在表格,row行号,column列号,value插入的元素    
            public void InsertCell(Microsoft.Office.Interop.Word.Table table, int row, int column,string value)    
            {      
                table.Cell(row,column).Range.Text =value;    
            }       
            //给表格中单元格插入元素,n表格的序号从1开始记,row行号,column列号,value插入的元素    
            public void InsertCell(int n, int row,int column, string value)    
            {      
                wordDoc.Content.Tables[n].Cell(row,column).Range.Text =value;   
            }       
            //给表格插入一行数据,n为表格的序号,row行号,columns列数,values插入的值    
            public void InsertCell(int n, int row,int columns, string[] values)    
            {     
                Microsoft.Office.Interop.Word.Table table = wordDoc.Content.Tables[n];      
                for(int i = 0; i < columns; i++)      
                {        
                    table.Cell(row,i + 1).Range.Text =values[i];      
                }   
            }       
            //插入图片    
            public void InsertPicture(string bookmark, string picturePath, float width, float hight)    
            {      
                object miss = System.Reflection.Missing.Value;      
                object oStart =bookmark;      
                Object linkToFile =false;   
                //图片是否为外部链接      
                Object saveWithDocument =true;
                //图片是否随文档一起保存      
                object range =wordDoc.Bookmarks.get_Item(ref oStart).Range;
                //图片插入位置      
                wordDoc.InlineShapes.AddPicture(picturePath,ref linkToFile, ref saveWithDocument, ref range);      
                wordDoc.Application.ActiveDocument.InlineShapes[1].Width=width; //设置图片宽度      
                wordDoc.Application.ActiveDocument.InlineShapes[1].Height=hight; //设置图片高度    
            }
            //插入一段文字,text为文字内容    
            public void InsertText(string bookmark, string text)    
            {      
                object oStart =bookmark;      
                object range =wordDoc.Bookmarks.get_Item(ref oStart).Range;      
                Paragraph wp =wordDoc.Content.Paragraphs.Add(ref range);      
                wp.Format.SpaceBefore= 6;      
                wp.Range.Text =text;      
                wp.Format.SpaceAfter =24;      
                wp.Range.InsertParagraphAfter();      
                wordDoc.Paragraphs.Last.Range.Text ="\n";    
            }
              //杀掉winword.exe进程    
            public void killWinWordProcess()    
            {      
                System.Diagnostics.Process[]processes=System.Diagnostics.Process.GetProcessesByName("WINWORD");      
                foreach (System.Diagnostics.Process process in processes)      
                {        
                    bool b = process.MainWindowTitle=="";        
                    if (process.MainWindowTitle =="")        
                    {         
                        process.Kill();       
                    }     
                }    
            }
        }

    3.合并PDF(Word文件或者PDF文件都可合并为一个PDF文件,第一次写,望多多支持)

    private void MergePDF(string PdfFileNames, string outMergeFile,string FileName)
            {
                string subPath = outMergeFile+"\\temp\\";
                string[] fileList = PdfFileNames.Split(',');
                if (fileList.Length < 1) {
                    return;
                }

                try
                {
                    PdfReader reader;

                    iTextSharp.text.Document document = new iTextSharp.text.Document();

                    PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outMergeFile + "\\" + FileName, FileMode.Create));

                    document.Open();

                    PdfContentByte cb = writer.DirectContent;

                    PdfImportedPage newPage;

                    BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);

                    int countNum = 0;
                    for (int i = 0; i < fileList.Length; i++)
                    {
                        if (fileList[i].Contains(".docx"))
                        {
                            fileList[i] = fileList[i].Replace(".docx", ".pdf");
                        }
                        else if (fileList[i].Contains(".doc"))
                        {
                            fileList[i] = fileList[i].Replace(".doc", ".pdf");
                        }
                        if (!File.Exists(subPath + fileList[i]))
                        {
                            continue;
                        }
                        reader = new PdfReader(subPath + fileList[i]);

                        int iPageNum = reader.NumberOfPages;

                        for (int j = 1; j <= iPageNum; j++)
                        {
                            countNum += 1;
                            document.NewPage();
                            newPage = writer.GetImportedPage(reader, j);

                            String text = countNum.ToString();
                            float len = bf.GetWidthPoint(text, 10);
                            cb.AddTemplate(newPage, 0, 0);
                            cb.BeginText();
                            cb.SetFontAndSize(bf, 10);
                            cb.ShowTextAligned(PdfContentByte.ALIGN_RIGHT, text, 530, 20, 0);

                            //cb.SetTextMatrix(0, 0);
                            //cb.ShowText(text);
                            cb.EndText();
                           

                            //cb.AddTemplate(newPage, 0, 0);
                        }
                    }
                    if (document != null)
                    {
                        document.Close();
                    }
                    if (Directory.Exists(subPath))
                        Directory.Delete(subPath, true);//删除临时文件夹
                }
                catch (Exception)
                {
                    string message ="文件:" +outMergeFile + "\\" + FileName+"合并失败。";
                    WriteException(message);
                }
            }

     

    展开全文
  • Python实现word转pdf

    千次阅读 2019-11-29 18:48:48
    Python实现word转pdf 在做word转pdf的功能过程中找了很多java的实现(POI),对于普通的文档还是支持的还可以,但是对于文档里面涉及图片、表格、水印等就会出现很多样式上的问题,字体重复,水印丢失,表格位置...

    Python实现word转pdf

    在做word转未pdf的功能过程中找了很多java的实现(POI),对于普通的文档还是支持的还可以,但是对于文档里面涉及图片、表格、水印等就会出现很多样式上的问题,字体重复,水印丢失,表格位置错乱等。

    1、poi用到的转pdf的相关代码如下:

    	public static byte[] docx2pdf(byte[] docxBytes) throws XWPFConverterException, IOException {
    		PdfOptions options = PdfOptions.create();
    		XWPFDocument document = new XWPFDocument(new ByteArrayInputStream(docxBytes));
    		ByteArrayOutputStream baos = new ByteArrayOutputStream();
    //		XHWPFDocument doc = new XHWPFDocument(new ByteArrayInputStream(docxBytes));
    		//document.getp
            //XWPFHeaderFooterPolicy xFooter = new XWPFHeaderFooterPolicy(document);
            
           /* XWPFHeader defaultHeader = xFooter.getDefaultHeader();
            defaultHeader.getParagraphArray(0).getCTP().getRArray(0).getPictArray().
          
            
            XWPFParagraph item = defaultHeader.getParagraphArray(0).getCTP().getRArray(0).getPictArray();
            document.setParagraph(item, document.getPosOfParagraph(document.getLastParagraph()) -2);*/
            
            //xFooter.createWatermark("复制");
            
            
    		PdfConverter.getInstance().convert(document, baos, options);
    		return baos.toByteArray();
    	}

    2、经过了很多次的努力发现还是解决不了上面的问题(功力不够呀,请有解决方法的猿友不吝赐教!),所以不再java上做努力了,经过研究发现用Python可以比较好的实现word转pdf的需求,可是我对于Python一点不熟,学习了一天多,了解了一些基本语法,当然又找了不少的资料,还真是挺多的,word转pdf,转html,pdf转word等等,其他怎么看,就找到了一篇word转pdf的开始研究,Python确实比Java方便多了,只要把以来导入,尽可以执行了,未来调试代码,我就用idea搭起来了Python项目。

    python代码如下:

    # -*- encoding: utf-8 -*-
    import os
    import sys
    
    from win32com import client
    
    # pip install win32com
    def templateDoc2pdf(doc_name, pdf_name):
        """
        :word文件转pdf
        :param doc_name word文件名称
        :param pdf_name 转换后pdf文件名称
        """
        try:
            word = client.DispatchEx("Word.Application")
            if os.path.exists(pdf_name):
                os.remove(pdf_name)
            worddoc = word.Documents.Open(doc_name, ReadOnly=1)
            worddoc.SaveAs(pdf_name, FileFormat=17)
            worddoc.Close()
            return pdf_name
        except:
            return 1
    
    templateDoc2pdf(sys.argv[1], sys.argv[2])

    这个是封装后的代码,是供Java代码调用。

    原始代码如下,可以直接运行:

    # -*- encoding: utf-8 -*-
    import  os
    from win32com import client
    #pip install win32com
    def doc2pdf(doc_name, pdf_name):
        """
        :word文件转pdf
        :param doc_name word文件名称
        :param pdf_name 转换后pdf文件名称
        """
        try:
            word = client.DispatchEx("Word.Application")
            if os.path.exists(pdf_name):
                os.remove(pdf_name)
            worddoc = word.Documents.Open(doc_name,ReadOnly = 1)
            worddoc.SaveAs(pdf_name, FileFormat = 17)
            worddoc.Close()
            return pdf_name
        except:
            return 1
    
    def main():
    	input = r'E:/大仓租赁合同(1).docx'
    	print(input);
        output = r'E:/Python.pdf'
    	print(output);
        rc = doc2pdf(input, output)
    	print(rc);
        # rc = doc2html(input, output)
        # rc = pdf2doc(input, output)
        if rc:
            print('转换成功')
        else:
            print('转换失败')
    
    if __name__ == '__main__':
        main()

    这个可以直接双击调用,就会在指定目录生成pdf文件,完美转化,样子简直和wps转出来的pdf一毛一样,哈哈哈,开心的开始搞代码。

    用Java开始调用python,调用代码如下:

    	@Override
    	public void word2Pdf(String pythonFilePath, String docPath, String pdfPath) {
    		File file = new File(pdfPath);
    		String[] arguments = new String[] {"python",pythonFilePath, docPath, "e:/doc/测试11.pdf"};
    		try {
    			Runtime.getRuntime( ).exec(arguments);
    		} catch (Exception e) {
    			e.printStackTrace( );
    		}
    	}

    这样就实现Java调用python实现word转pdf的功能拉。

    但是,本来这样就完美了,但是,但是,这些代码,python代码所依赖的包都是Windows系统的包,这些代码放到Linux系统上是支持不了的,坑爹啊,快搞完了,才知道这些。。。。
    

    但是还是有方案滴,这里就先不透露了,因为还在改,下篇我们再聊,其实我们用了kkFileView(一个2k星的项目)来完成这个功能,哈哈忍不了,透漏一下。

     

     

     

    每天努力一点,每天都在进步。

    展开全文
  • ftl转word,word转pdf记录

    千次阅读 2019-08-29 19:58:48
    最近项目需要用到转word转pdf,这里做一下记录。 使用freemarker工具将ftl文件转word 首先,编辑好word文档内容格式,导出为xml文件,然后将文件后缀名更改诶ftl 然后引入依赖 <dependency> <...

    最近项目需要用到转word和转pdf,这里做一下记录。

     

    使用freemarker工具将ftl文件转word

    首先,编辑好word文档内容格式,导出为xml文件,然后将文件后缀名更改诶ftl

    然后引入依赖

    <dependency>
    	    <groupId>org.freemarker</groupId>
    	    <artifactId>freemarker</artifactId>
    	    <version>2.3.21</version>
    	</dependency>

    最后使用代码测试

    package com.test.docpdf;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    import java.net.URLEncoder;
    import java.util.HashMap;
    import java.util.Map;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.core.env.SystemEnvironmentPropertySource;
    
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    
    public class FtlToWord {
    	
    
        private static Configuration configuration = null;  
        
        private static final String templateFolder = FtlToWord.class.getClassLoader().getResource("").getPath()+"/templates/";  //FTL文件所存在的位置 
        static { 
            configuration = new Configuration();  
            configuration.setDefaultEncoding("utf-8");  
            try {  
                configuration.setDirectoryForTemplateLoading(new File(templateFolder));  
            } catch (IOException e) {
                e.printStackTrace();
            }  
       }  
    
        /*private WordUtils() {  
            throw new AssertionError();  
        } */ 
        
        public static void main(String[] args) throws IOException {
    		Map<String, Object> map = new HashMap<String, Object>();
    		FtlToWord w = new FtlToWord();
    		w.exportMillCertificateWord(map);
    	}
    
        public static void exportMillCertificateWord(Map map) throws IOException {  
            configuration.setDefaultEncoding("UTF-8");
            //Template freemarkerTemplate = configuration.getTemplate("test.ftl");  
            Template freemarkerTemplate = configuration.getTemplate("testtwordfff.ftl");  
            File file = null;  
            InputStream fin = null;  
            // 调用工具类的createDoc方法生成Word文档  
            file = createDoc(map,freemarkerTemplate);  
            fin = new FileInputStream(file);  
               
        }  
    
        private static File createDoc(Map<?, ?> dataMap, Template template) {  
        	
            String name =  "C:\\Users\\666\\Desktop\\testtwordfff.doc";  
            File f = new File(name);  
            Template t = template;  
            try {  
            	f.createNewFile();
                Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");  
                t.process(dataMap, w);
                w.close();  
            } catch (Exception ex) {  
                ex.printStackTrace();  
                throw new RuntimeException(ex);  
            }  
            return f;  
        }
    
    }
    

    可以再代码中配置好ftl文件和pdf文件的路径,然后使用main方法 测试

     

    将word文件转pdf

    将word文件转pdf首先尝试使用的是OpenOffice。

    首先下载OpenOffice的软件,然后再cmd中进入中,调用启动服务的命令:

    soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard

    然后下载jodconverter的jar包,在代码中编写测试程序。

    测试发现在使用手动生成的word转pdf成功,但是使用ftl生成的word转pdf内容错误(内容为xml的标签信息)

     

    然后再尝试的是使用jacob将word转pdf,它是直接调用Microsoft Office 或 WPS组件实现word、excel、PPT转换成PDF。

    只支持windows服务器

    首先引入依赖

    <dependency>
       	    <groupId>net.sf.jacob-project</groupId>
       	    <artifactId>jacob</artifactId>
       	    <version>1.14.3</version>
       	</dependency>

    然后下载 jacob-1.14.3-dll.zip 文件 将dll文件放到jdk的bin目录中

    最后使用代码测试调用

    package com.test.docpdf;
    import com.jacob.activeX.ActiveXComponent;
    import com.jacob.com.Dispatch;
    import com.jacob.com.Variant;
    
    
    public class WordToPdf {
      private static final int WDFO_RMATPDF = 17;
      private static final int XLTYPE_PDF = 0;
      private static final int PPT_SAVEAS_PDF = 32;
      public static final int WORD_HTML = 8;
      public static final int WORD_TXT = 7;
      public static final int EXCEL_HTML = 44;
    
      /*private OfficeConverterUtils() {
          throw new AssertionError();
      }*/
    
      
      public static boolean officeToPdf(String officePath, String postfix, String pdfPath) {
    	  return wordToPdf(officePath, pdfPath);
      }
      
      public static void main(String[] args) {
    	String wordPath = "C:\\Users\\61673\\Desktop\\testtwordfff.doc";
    	String pdfPath = "C:\\Users\\61673\\Desktop\\testtwordfff.pdf";
    	WordToPdf o = new WordToPdf();
    	o.wordToPdf(wordPath, pdfPath);
    }
    
      /**
       * word转换成PDF
       * @param wordPath 文件路径
       * @param pdfPath  文件路径
       * @return 成功失败
       */
      public static boolean wordToPdf(String wordPath, String pdfPath) {
          ActiveXComponent msWordApp = new ActiveXComponent("Word.Application");
          msWordApp.setProperty("Visible", new Variant(false));
          Dispatch docs = Dispatch.get(msWordApp, "Documents").toDispatch();
          Dispatch doc = Dispatch.invoke(docs, "Open", Dispatch.Method, new Object[]{wordPath, new Variant(false), new Variant(true)}, new int[1]).toDispatch();
    
          Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[]{pdfPath, new Variant(WDFO_RMATPDF)}, new int[1]);
          if (null != doc) {
              Dispatch.call(doc, "Close", false);
          }
          return true;
      }
    
     
    }
    

    初次调用报错,由于本机当时只安装了office,所以猜测缺失了某些组件,下载了wps安装后重新测试发现,再次测试成功。

    openOffice资料  jadcob资料

    展开全文
  • Java实现Word转PDF

    千次阅读 热门讨论 2019-03-13 20:27:44
    java实现word文档转pdf 最近在做一个Web项目,需要将Word转换成PDF然后展示出来。其中遇到许多问题,特此记录,如有不妥之处请指正。 实现功能 docx文档转换为PDF 转换之后排版不混乱 使用工具(Jar包) aspose...
  • Python word转PDF

    千次阅读 2019-06-12 18:56:58
    from win32com.client import Dispatch from os import walk wdFormatPDF = 17 def doc2pdf(input_file): word = Dispatch('Word.Application') doc = word.Documents.Open(input_file) doc.SaveAs(i...
  • [python]word转pdf、docdocx、word转html

    万次阅读 2018-03-07 10:58:44
    python Word文件转换为pdf文件(doc/docx文件转化为pdf文件)# -*- encoding: utf-8 -*- import os from win32...def doc2pdf(doc_name, pdf_name): """ :word文件转pdf :param doc...
  • Java Word Pdf

    千次阅读 2017-04-19 17:20:14
    Java Word Pdf 前言:  平常项目中遇到需要将word转换为pdf,我们一般利用的是jacob.jar组件,这个组件利用的是微软office组件,但有时项目需要部署到liunx下,liunx中没有office,我们可以利用apache ...
  • word转PDF公式缺失

    千次阅读 2016-02-03 20:11:59
    最近用word2013将一个word文档转变成PDF,发现上面的MathType编辑的公式和字符有部分缺失,如下: 然后百度,有说用smallPDF在线转换功能的,试了下,公式缺失的问题解决了,但是排版有些变动,竟然多出了几页。算...
  • Word PDF 技术方案评测

    万次阅读 2019-07-31 13:55:20
    最近项目有个需求,要将用户上传的 word 文件转换成 pdf。 最开始是想用 PHP 的一些库来做,后来发现效果并不好。 然后找了一些linux(CentOS)上能使用的工具来进行转换,上线之后发现一些特殊类型的文档并不能很好...
  • JAVA 实现 Word转PDF

    千次阅读 2019-08-07 17:32:17
    JAVA 实现 Word转PDF需要的包 SaveAsPDFandXPS + jacob代码另外一种方法效果可能不太好包链接 需要的包 SaveAsPDFandXPS + jacob SaveAsPDFandXPS . jacob.jar . 先安装SaveAsPDFandXPS 打开 jacob-1.19.zip 把...
  • word转html,word转pdf

    千次阅读 2019-07-21 00:05:25
    * word pdf,可兼容复杂样式,含图片和颜色。全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF * @author an 2018-05-16 */ public class Word2pdfUtil { public static void main(String[] args) ...
  • C#生成word文档 、word转pdf、合并pdf文件等 在系统开发中经常会有用户需求涉及到基于模板导出word文档、pdf文档,或者把几个文件合并成一个进行导出预览等,他们所说需求不一样,但在功能实现上却是相同的。由于...
  • 采用jacob实现word转pdf

    万次阅读 2015-04-14 10:46:04
    采用jacob实现word转pdf
  • python3 word转pdf

    千次阅读 2018-11-27 21:49:51
    python3 word转pdf 我们可能经常会遇到这样的情况,需要将别人发过来的word文档转为pdf格式,数量的时候一个个打开另存为即可,但是有时候动不动十几个文件,一个个弄就太麻烦了,最近也遇到了这样的问题,与大家...
  • 一、Word转PDF方法 1. 在线转换PDF文件 在线转换文件是一种比较直接的方法,无需下载软件,即可将转换问题解决。 使用操作如下: (1)打开浏览器后,输入“在线转换PDF”,选择第一个即可; (2)点击...
  • 最近公司业务需要在pdf中显示表格,但是表格内容列数有点长,导致word转pdf的时候显示不全; 如上图这种显示不全的情况(截图中没有放表格,表格同理一样)。 具体做法:第一、word的模板文件中需要进行设置word...
  • c# word转PDF

    千次阅读 2014-03-04 21:28:33
    这里主要提供一种将word文档PDF文档的实现; 具体实现看c# 代码:要引入Microsoft.Office.Interop.Word;版本12.0.0.0 using System; using System.Collections.Generic; using System.IO; using System.Linq; ...
  • Java中Word转PDF解决方案

    千次阅读 2020-03-18 11:24:20
    2、word含有中文的转换为PDF后可显示 二、转换步骤 word —> html —> pdf 三、使用工具(Jar包) 1、poi、itext(如下maven配置) 作用:poi:用于将word转换为html;itext:将html转换为pdf poi...
  • python word转pdf

    千次阅读 2019-04-29 17:30:00
    使用python win32 库 调用word底层vba,将word转pdf 安装pywin32 pip install pywin32 python代码 from win32com.client import gencache from win32com.client import constants, gencache def createPdf...
  • php word转pdf

    千次阅读 2018-07-15 23:11:43
    php word转pdf2017年07月03日 10:12:08阅读数:501需要安装libreoffice$pdfPath = './pdf';//pdf文件保存的目录$pdfHomePath = '/var/www/html/ceshi/pdf';//项目目录或项目中pdf保存的目录$doc_path = './bbb.doc';...
  • C#实现HTML转WORDWORD转PDF的方法

    千次阅读 2015-10-13 12:23:49
    C#实现HTML转WORDWORD转PDF的方法 这篇文章主要介绍了C#实现HTML转WORDWORD转PDF的方法,涉及C#实现HTML、WORDPDF等文件格式转换的相关技巧,需要的朋友可以参考下 本文实例讲述了C#实现HTML...
  • Java Word转PDF

    千次阅读 2019-06-24 12:50:25
    -- word转pdf --> <dependency> <groupId>com.jcraft</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.1</version>...
  • Word格式的文档使用频率非常高,尤其是在工作和学习中,不论写报告、写...Word转PDF有什么简单方便地方法呢? 首先你需要一个福昕阅读器并打开,然后点击“文件”,打开Word文档所在的目录,点击右下角的格式范围;...
  • word转PDF

    千次阅读 2011-04-26 19:20:00
    寻找word转pdf的软件。 <br /> 一,直接google。找到一堆小工具,但都是收费的,试用版要么只能转换第一页,要么转换完的pdf文件被打上水印。 <br /> 二,WPS试试。果然很厉害。正在窃喜中,发现转换后...
  • java项目如何实现word转pdf ,Excel转pdf ,并且兼容office03和07版本
  • Java 实现word转pdf

    千次阅读 2019-07-10 17:51:08
    之前使用libreoffice实现word转PDF ,效果非常好,但是需要安装并且不支持并发。 推荐是aspose实现word转PDF,转换效果不错,并支持并发。 附上实现代码 maven依赖 <dependency> <groupId>...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 97,301
精华内容 38,920
关键字:

word转pdf少了内容