当前位置: 首页 > news >正文

php网站成品合肥网站

php网站成品,合肥网站,java可以做微信网站么,建设第二个北京在哪里Word转成pdf、打印的方案几乎没有免费开源的方案,现在提供一个通过LibreOffice实现的方案 操作依赖LibreOffice需要安装,点此下载老版本 5.4.7.2是最后一个支持xp的 版本如需xp要请安装此版本 LibreOffice官方介绍 LibreOffice 是一款开放源代码的自…

Word转成pdf、打印的方案几乎没有免费开源的方案,现在提供一个通过LibreOffice实现的方案

操作依赖LibreOffice需要安装,点此下载老版本

5.4.7.2是最后一个支持xp的 版本如需xp要请安装此版本

LibreOffice官方介绍

LibreOffice 是一款开放源代码的自由免费全能办公软件,可运行于 Microsoft Windows, GNU/Linux 以及 macOS 等操作系统上。它包含了 Writer, Calc, Impress, Draw, Math 以及 Base 等组件,可分别用于文本文档、电子表格、幻灯片演示文稿、绘图文档、数学公式编辑、数据库管理等工作。

LibreOffice 采用对企业和个人用户均免费的 MPL 2.0 授权协议。您可以自由分发该软件,无需支付授权费用(但您仍然可以付费获得经认证的专业支持)。它的源代码完全公开,任何人都可以参与软件的开发和维护。

一、通过进程的方式

1.Word打印

  public void PrintWordFile(string file, string printerName){if (string.IsNullOrEmpty(file)) throw new Exception("Invalid parameters passed to convert word function.");if (!File.Exists(file)) throw new FileNotFoundException($"The file passed to the convert word process ({file}) could not be found.");var fileInfo = new FileInfo(file);if (fileInfo.Extension.ToLower() != ".doc" && fileInfo.Extension.ToLower() != ".docx")throw new ArgumentOutOfRangeException($"The file type passed to the convert word process is an invalid type ({fileInfo.Extension}).");var libreOfficePath = Path.Combine(LibreOfficePath, "swriter.exe");if (!File.Exists(libreOfficePath)) throw new FileNotFoundException("It seems that LibreOffice is not where it should be, please ensure the path exists.");var procStartInfo = new ProcessStartInfo(libreOfficePath, $@"--headless --pt ""{printerName}"" ""{file}"""){RedirectStandardOutput = true,RedirectStandardError = true,UseShellExecute = false,CreateNoWindow = true,WorkingDirectory = Environment.CurrentDirectory};Process process = new Process() { StartInfo = procStartInfo };// Attach event handlers to capture output and error streamsprocess.OutputDataReceived += (sender, args) => Console.WriteLine("OUT: " + args.Data);process.ErrorDataReceived += (sender, args) => Console.WriteLine("ERR: " + args.Data);process.Start();// Start reading the output asynchronouslyprocess.BeginOutputReadLine();process.BeginErrorReadLine();process.WaitForExit();if (process.ExitCode != 0){throw new LibreOfficeFailedException(process.ExitCode);}}

2.Word转成PDF

  public string ConvertWordFile(string file, string outputDirectory){if (string.IsNullOrEmpty(file) || string.IsNullOrEmpty(outputDirectory)) throw new Exception("Invalid parameters passed to convert word function.");if (!File.Exists(file)) throw new FileNotFoundException($"The file passed to the convert word process ({file}) could not be found.");if (!Directory.Exists(outputDirectory)) throw new DirectoryNotFoundException($"The output folder passed to the convert word process ({outputDirectory}) does not exist.");if (outputDirectory.EndsWith(@"\")) outputDirectory = outputDirectory.TrimEnd('\\');var fileInfo = new FileInfo(file);if (fileInfo.Extension.ToLower() == ".doc" && fileInfo.Extension.ToLower() == ".docx") throw new ArgumentOutOfRangeException($"The file type passed to the convert word process is an invalid type ({fileInfo.Extension}).");var outputFile = outputDirectory + @"\" + Path.GetFileNameWithoutExtension(fileInfo.Name) + ".pdf";if (File.Exists(outputFile)) File.Delete(outputFile);var libreOfficePath = Path.Combine(LibreOfficePath, "swriter.exe");if (!File.Exists(libreOfficePath)) throw new FileNotFoundException("It seems that LibreOffice is not where it should be, please ensure the path exists.");var procStartInfo = new ProcessStartInfo(libreOfficePath, $@"--headless --convert-to pdf:writer_pdf_Export ""{file}"" --outdir ""{outputDirectory}"""){RedirectStandardOutput = true,UseShellExecute = false,CreateNoWindow = true,WorkingDirectory = Environment.CurrentDirectory};Process process = new Process() { StartInfo = procStartInfo };process.Start();process.WaitForExit();if (process.ExitCode != 0)throw new LibreOfficeFailedException(process.ExitCode);if (!File.Exists(outputFile)) throw new FileNotFoundException("The convert to word process has failed to convert the file!");return outputFile;}public class LibreOfficeFailedException : Exception{public LibreOfficeFailedException(int exitCode) : base($"LibreOffice has failed with {exitCode}") { }}

二、通过cli库调用,下附代码

CLI下载

   public class WordPrint{private XComponentContext context;private XMultiServiceFactory service;private XComponentLoader component;private XComponent doc;private static WordPrint wordPrint;private List<string> filters = new List<string>();#region ConstructorsWordPrint(){NativeMethods.InitializationLibrary();/// This will start a new instance of OpenOffice.org if it is not running, /// or it will obtain an existing instance if it is already open.context = uno.util.Bootstrap.bootstrap();/// The next step is to create a new OpenOffice.org service managerservice = (XMultiServiceFactory)context.getServiceManager();/// Create a new Desktop instance using our service managercomponent = (XComponentLoader)service.createInstance("com.sun.star.frame.Desktop");// Getting filtersXNameContainer filters = (XNameContainer)service.createInstance("com.sun.star.document.FilterFactory");foreach (string filter in filters.getElementNames())this.filters.Add(filter);}~MiniWordPrint(){if (doc != null)doc.dispose();doc = null;}#endregion#region Private methodsprivate string FilterToString(ExportFilter filter){switch (filter){case ExportFilter.Word97: return "MS Word 97";case ExportFilter.WriterPDF: return "writer_pdf_Export";case ExportFilter.CalcPDF: return "calc_pdf_Export";case ExportFilter.DrawPDF: return "draw_pdf_Export";case ExportFilter.ImpressPDF: return "impress_pdf_Export";case ExportFilter.MathPDF: return "math_pdf_Export";}return "";}#endregion#region Public methods/// <summary>/// load docx/// </summary>/// <param name="filename">file path</param>/// <param name="hidden">load document invisible Defines if the loaded component is made visible. If this property is not specified, the component is made visible by default.</param>/// <returns></returns>public bool Load(string filename, bool hidden){return Load(filename, hidden, "", "");}/// <summary>/// load docx/// </summary>/// <param name="filename">file path</param>/// <param name="hidden">load document invisible Defines if the loaded component is made visible. If this property is not specified, the component is made visible by default. </param>/// <param name="filter_index">internal filter name <see cref="Filters"/> Filters index/// Name of a filter that should be used for loading or storing the component.Names must match the names of the TypeDetection configuration, invalid names are ignored.If a name is specified on loading, it still will be verified by a filter detection, but in case of doubt it will be preferred.</param>/// <param name="filter_options">additional properties for filter/// Some filters need additional parameters; use only together with property MediaDescriptor::FilterName.Details must be documented by the filter. This is an old format for some filters. If a string is not enough, filters can use the property MediaDescriptor::FilterData.</param>/// <returns></returns>public bool Load(string filename, bool hidden, int filter_index, string filter_options){return Load(filename, hidden, filters[filter_index], filter_options);}/// <summary>/// load docx/// </summary>/// <param name="filename">file path</param>/// <param name="hidden">load document invisible Defines if the loaded component is made visible. If this property is not specified, the component is made visible by default.</param>/// <param name="filter_name">internal filter name <see cref="Filters"/>/// Name of a filter that should be used for loading or storing the component.Names must match the names of the TypeDetection configuration, invalid names are ignored.If a name is specified on loading, it still will be verified by a filter detection, but in case of doubt it will be preferred.</param>/// <param name="filter_options"> additional properties for filter/// Some filters need additional parameters; use only together with property MediaDescriptor::FilterName.Details must be documented by the filter. This is an old format for some filters. If a string is not enough, filters can use the property MediaDescriptor::FilterData.</param>/// <returns></returns>public bool Load(string filename, bool hidden, string filter_name, string filter_options){List<PropertyValue> pv = new List<PropertyValue>();pv.Add(new PropertyValue("Hidden", 0, new uno.Any(hidden), PropertyState.DIRECT_VALUE));if (filter_name != ""){pv.Add(new PropertyValue("FilterName", 0, new uno.Any(filter_name), PropertyState.DIRECT_VALUE));pv.Add(new PropertyValue("FilterOptions", 0, new uno.Any(filter_options), PropertyState.DIRECT_VALUE));}try{doc = component.loadComponentFromURL("file:///" + filename.Replace('\\', '/'), "_blank",0, pv.ToArray());return true;}catch{doc = null;return false;}}/// <summary>///  a given document xDoc to print to the standard printer without any settings/// </summary>/// <returns></returns>public bool Print(){return Print("", 1, "");}/// <summary>/// a given document xDoc to print /// </summary>/// <param name="printName">string - Specifies the name of the printer queue to be used.</param>/// <param name="copies">short - Specifies the number of copies to print.</param>/// <param name="pages">string - Specifies the pages to print in the same format as in the print dialog of the GUI (e.g. "1, 3, 4-7, 9-")</param>/// <param name="orientation">com.sun.star.view.PaperOrientation. Specifies the orientation of the paper.</param>/// <param name="paperFormat">com.sun.star.view.PaperFormat. Specifies a predefined paper size or if the paper size is a user-defined size.</param>/// <returns></returns>public bool Print(string printName, int copies, string pages, MiniOrientation orientation = MiniOrientation.PORTRAIT, MiniFormat paperFormat = MiniFormat.A4){var printerDesc = new List<PropertyValue>();if (!string.IsNullOrEmpty(printName))printerDesc.Add(new PropertyValue("Name", 0, new uno.Any(typeof(string), printName), PropertyState.DIRECT_VALUE));printerDesc.Add(new PropertyValue("PaperOrientation", 0, new uno.Any(typeof(PaperOrientation), orientation), PropertyState.DIRECT_VALUE));printerDesc.Add(new PropertyValue("PaperFormat", 0, new uno.Any(typeof(PaperFormat), paperFormat), PropertyState.DIRECT_VALUE));var printOpts = new List<PropertyValue>();printOpts.Add(new PropertyValue("CopyCount", 0, new uno.Any(copies), PropertyState.DIRECT_VALUE));if (!string.IsNullOrEmpty(pages))printOpts.Add(new PropertyValue("Pages", 0, new uno.Any(pages), PropertyState.DIRECT_VALUE));printOpts.Add(new PropertyValue("Wait", 0, new uno.Any(true), PropertyState.DIRECT_VALUE));//if (doc is XPrintable)try{((XPrintable)doc).setPrinter(printerDesc.ToArray());((XPrintable)doc).print(printOpts.ToArray());return true;}catch { return false; }}/// <summary>/// a given document xDoc to print with custom/// </summary>/// <param name="printerDesc">///----------- Properties of com.sun.star.view.PrinterDescriptor--------///*** Name string - Specifies the name of the printer queue to be used.///*** PaperOrientation com.sun.star.view.PaperOrientation.Specifies the orientation of the paper.///*** PaperFormat com.sun.star.view.PaperFormat.Specifies a predefined paper size or if the paper size is a user-defined size.///*** PaperSize com.sun.star.awt.Size.Specifies the size of the paper in 1/100 mm.///*** IsBusy boolean - Indicates if the printer is busy.///*** CanSetPaperOrientation boolean - Indicates if the printer allows changes to.PaperOrientation///*** CanSetPaperFormat boolean - Indicates if the printer allows changes to.PaperFormat///*** CanSetPaperSize boolean - Indicates if the printer allows changes to.PaperSize/// </param>/// <param name="printerDesc">///------------- Properties of com.sun.star.view.PrintOptions--------///CopyCount short - Specifies the number of copies to print.///FileName string - Specifies the name of a file to print to, if set.///Collate boolean - Advises the printer to collate the pages of the copies.If true, a whole document is printed prior to the next copy, otherwise the page copies are completed together.///Pages string - Specifies the pages to print in the same format as in the print dialog of the GUI (e.g. "1, 3, 4-7, 9-")///Wait boolean - Advises that the print job should be performed synchronously, i.e.wait until printing is complete before returning from printing.Otherwise return is immediate and following actions(e.g.closing the corresponding model) may fail until printing is complete.Default is false./// </param>/// <param name="pagePrintSettings">/// ------------- Properties of com.sun.star.text.PagePrintSettings--------/// PageRows short - Number of rows in which document pages should appear on the output page./// PageColumns short - Number of columns in which document pages should appear on the output page./// LeftMargin long - Left margin on the output page./// RightMargin long - Right margin on the output page./// TopMargin long - Top margin on the output page./// BottomMargin long - Bottom margin on the output page./// HoriMargin long - Margin between the columns on the output page./// VertMargin long - Margin between the rows on the output page./// IsLandscape boolean - Determines if the output page is in landscape format./// </param>/// <returns></returns>public bool Print(List<MiniPropertyValue> printerDesc, List<MiniPropertyValue> printOpts, List<MiniPropertyValue> pagePrintSettings){try{var printSettings = pagePrintSettings.ConvertAll(v => ToPropertyValue(v));var desc = printerDesc.ConvertAll(v => ToPropertyValue(v));var opts = printOpts.ConvertAll(v => ToPropertyValue(v));((XPagePrintable)doc).setPagePrintSettings(printSettings.ToArray());((XPrintable)doc).setPrinter(desc.ToArray());((XPrintable)doc).print(opts.ToArray());return true;}catch { return false; }}/// <summary>/// save pdf/// </summary>/// <param name="filename">file path</param>/// <param name="filter"><see cref="ExportFilter"/></param>/// <returns></returns>public bool Save(string filename, ExportFilter filter){return Save(filename, FilterToString(filter));}/// <summary>/// save pdf/// </summary>/// <param name="filename">file path</param>/// <param name="filter">/// internal filter name <see cref="Filters"/>/// Name of a filter that should be used for loading or storing the component.Names must match the names of the TypeDetection configuration, invalid names are ignored.If a name is specified on loading, it still will be verified by a filter detection, but in case of doubt it will be preferred./// </param>/// <returns></returns>public bool Save(string filename, string filter){List<PropertyValue> pv = new List<PropertyValue>();pv.Add(new PropertyValue("FilterName", 0, new uno.Any(filter), PropertyState.DIRECT_VALUE));pv.Add(new PropertyValue("Overwrite", 0, new uno.Any(true), PropertyState.DIRECT_VALUE));try{filename = filename.Replace("\\", "/");((XStorable)doc).storeToURL("file:///" + filename, pv.ToArray());return true;}catch { return false; }}/// <summary>/// export pdf/// </summary>/// <param name="filename">file path</param>/// <returns></returns>public bool ExportToPdf(string filename){filename = Path.ChangeExtension(filename, ".pdf");bool ret = Save(filename, "writer_pdf_Export");if (!ret) ret = Save(filename, "impress_pdf_Export");if (!ret) ret = Save(filename, "calc_pdf_Export");if (!ret) ret = Save(filename, "draw_pdf_Export");if (!ret) ret = Save(filename, "impress_pdf_Export");if (!ret) ret = Save(filename, "math_pdf_Export");return ret;}/// <summary>/// close XComponent /// doc stream must be not use,otherwise dispose() has no return/// </summary>public void Close(){doc.dispose();doc = null;}/// <summary>///  new docx/// </summary>/// <param name="app"><see cref="AppType"/></param>/// <param name="hidden">load document invisible Defines if the loaded component is made visible. If this property is not specified, the component is made visible by default.</param>/// <returns></returns>public bool New(AppType app, bool hidden){try{string sapp = "private:factory/";switch (app){case AppType.Writer:sapp += "swriter";break;case AppType.Calc:sapp += "scalc";break;case AppType.Impress:sapp += "simpress";break;case AppType.Draw:sapp += "sdraw";break;case AppType.Math:sapp += "smath";break;}PropertyValue pv = new PropertyValue("Hidden", 0, new uno.Any(hidden), PropertyState.DIRECT_VALUE);doc = component.loadComponentFromURL(sapp, "_blank", 0, new PropertyValue[1] { pv });return true;}catch{doc = null;return false;}}#endregion#region Properties/// <summary>/// internal filter name/// Name of a filter that should be used for loading or storing the component.Names must match the names of the TypeDetection configuration, invalid names are ignored.If a name is specified on loading, it still will be verified by a filter detection, but in case of doubt it will be preferred./// </summary>public List<string> Filters{get { return filters; }}#endregionprivate PropertyValue ToPropertyValue(MiniPropertyValue miniProperty){return new PropertyValue(Name: miniProperty.Name,Handle: miniProperty.Handle,Value: new uno.Any(type: miniProperty.Value.Type,value: miniProperty.Value.Value),State: (PropertyState)miniProperty.State);}}


文章转载自:
http://eurydice.mnqg.cn
http://excudit.mnqg.cn
http://future.mnqg.cn
http://sanguicolous.mnqg.cn
http://strasbourg.mnqg.cn
http://detrited.mnqg.cn
http://chlorella.mnqg.cn
http://actinodermatitis.mnqg.cn
http://anteflexion.mnqg.cn
http://refloatation.mnqg.cn
http://hysterically.mnqg.cn
http://nuisance.mnqg.cn
http://collarwork.mnqg.cn
http://cosmea.mnqg.cn
http://tetrachotomous.mnqg.cn
http://barrathea.mnqg.cn
http://pennywort.mnqg.cn
http://senhor.mnqg.cn
http://paleontology.mnqg.cn
http://auger.mnqg.cn
http://pipette.mnqg.cn
http://csma.mnqg.cn
http://kovno.mnqg.cn
http://clonesome.mnqg.cn
http://gemmule.mnqg.cn
http://limberneck.mnqg.cn
http://morbid.mnqg.cn
http://intention.mnqg.cn
http://exchequer.mnqg.cn
http://crochet.mnqg.cn
http://uneasiness.mnqg.cn
http://kbar.mnqg.cn
http://antimonyl.mnqg.cn
http://stogie.mnqg.cn
http://hydrolysate.mnqg.cn
http://merciful.mnqg.cn
http://unef.mnqg.cn
http://facebar.mnqg.cn
http://necessitarianism.mnqg.cn
http://tholeiite.mnqg.cn
http://hgv.mnqg.cn
http://icsh.mnqg.cn
http://development.mnqg.cn
http://pikestaff.mnqg.cn
http://pipelining.mnqg.cn
http://amitabha.mnqg.cn
http://recce.mnqg.cn
http://thenceforth.mnqg.cn
http://antonia.mnqg.cn
http://lipoprotein.mnqg.cn
http://micromodule.mnqg.cn
http://permillage.mnqg.cn
http://reveler.mnqg.cn
http://aryl.mnqg.cn
http://exhortatory.mnqg.cn
http://tshi.mnqg.cn
http://amphitrite.mnqg.cn
http://goluptious.mnqg.cn
http://metaphosphate.mnqg.cn
http://summerwood.mnqg.cn
http://filmset.mnqg.cn
http://garpike.mnqg.cn
http://parachutist.mnqg.cn
http://grad.mnqg.cn
http://alkylation.mnqg.cn
http://sugar.mnqg.cn
http://malentendu.mnqg.cn
http://damnedest.mnqg.cn
http://inturned.mnqg.cn
http://spongeous.mnqg.cn
http://ammonify.mnqg.cn
http://radicate.mnqg.cn
http://glutin.mnqg.cn
http://poesy.mnqg.cn
http://triquetrous.mnqg.cn
http://carucage.mnqg.cn
http://disturbingly.mnqg.cn
http://clothesline.mnqg.cn
http://scholiastic.mnqg.cn
http://applique.mnqg.cn
http://amniotic.mnqg.cn
http://oxidizable.mnqg.cn
http://proboscidian.mnqg.cn
http://rancorous.mnqg.cn
http://cyprian.mnqg.cn
http://galvanistical.mnqg.cn
http://associateship.mnqg.cn
http://ugali.mnqg.cn
http://bijouterie.mnqg.cn
http://rubber.mnqg.cn
http://chronograph.mnqg.cn
http://reduplicative.mnqg.cn
http://knotty.mnqg.cn
http://deadliness.mnqg.cn
http://demerara.mnqg.cn
http://kinchin.mnqg.cn
http://prednisolone.mnqg.cn
http://sfumato.mnqg.cn
http://granolithic.mnqg.cn
http://hoveler.mnqg.cn
http://www.dt0577.cn/news/102154.html

相关文章:

  • wordpress 获取分类目录seo优化工具
  • 济南高新区建设局网站网址大全浏览器app
  • 做网站加手机app需要多少钱百度推广需要什么条件
  • wordpress如何导入文章网站优化推广软件
  • 自己建立网站服务器shopify seo
  • 河南高端网站建设seo优质友链购买
  • 主机做网站工具灰色行业推广渠道
  • discuz建网站seo优化评论
  • 苏州计算机培训机构阜新网站seo
  • 做网站要注意什么问题千峰培训多少钱
  • 河北中凯建设有限公司网站温州网站快速排名
  • 做视频网站带宽要求广告联盟接单平台
  • 广东 网站经营性备案山西网站seo
  • wordpress双语站点全网营销图片
  • 做网站一般用什么服务器广州网络营销公司
  • 北京哪里做网站好手机优化大师官网
  • 详情页模板怎么做惠州百度seo
  • 做网站运营海外互联网推广平台
  • 网站开发的论文引言seo优化网站推广
  • 阳江市网络问政平台登录企业新网站seo推广
  • 国外网站推广平台有哪些公司济南seo优化公司助力排名
  • 做网站花了2万多电商网站平台搭建
  • 网站维护和制作怎么做会计分录国外域名注册
  • 市县政府网站建设管理工作总结免费发布信息的平台有哪些
  • 揭阳网站如何制作百度关键词搜索热度查询
  • 外国人讲汉语做网站的视频怎样进行关键词推广
  • wordpress 表格边框端点seo博客
  • 公司的网站推广怎么做网络推广好做吗
  • 网站 云端怎么看百度关键词的搜索量
  • 用花生壳免费域名做公司网站一键关键词优化