我正在寻找一个库,它允许我将文本和图形输出呈现到 PDF 文档中。(开罗当然是一个选择。)我想知道 OpenOffice 如何编写 PDF 文件,看看我是否可以使用同一个库。OpenOffice 使用什么库进行 PDF 导出?
编辑:我正在寻找 C 或 C++ 库。
我正在寻找一个库,它允许我将文本和图形输出呈现到 PDF 文档中。(开罗当然是一个选择。)我想知道 OpenOffice 如何编写 PDF 文件,看看我是否可以使用同一个库。OpenOffice 使用什么库进行 PDF 导出?
编辑:我正在寻找 C 或 C++ 库。
我到处寻找如何使用 OpenOffice 将任何文档导出为 PDF。我终于在 OpenOffice 论坛中找到了一个隐藏的帖子,让我 90% 都在那里。这是我的 100% 解决方案。适用于 OpenOffice 3.1。您必须安装 OpenOffice 才能使用此代码。您必须包含对 cli_basetypes、cli_cppuhelper、cli_oootypes、cli_ure、cli_uretypes 的引用。这些 dll 引用可在 OpenOffice SDK 中找到。对不起,但这是在 C#.. 不是 C/C++ 中。某人。
使用 unoidl.com.sun.star.lang;
使用 unoidl.com.sun.star.uno;
使用 unoidl.com.sun.star.bridge;
使用 unoidl.com.sun.star.frame;
使用 unoidl.com.sun.star.beans;
公共静态无效 ConvertToPDF(字符串输入文件,字符串输出文件)
{
if (ConvertExtensionToFilterType(Path.GetExtension(inputFile)) == null)
throw new InvalidProgramException("OpenOffice 的未知文件类型。File = " + inputFile);
StartOpenOffice();
//获取一个组件上下文
unoidl.com.sun.star.uno.XComponentContext xLocalContext =
uno.util.Bootstrap.bootstrap();
//获取多服务工厂
unoidl.com.sun.star.lang.XMultiServiceFactory xRemoteFactory =
(unoidl.com.sun.star.lang.XMultiServiceFactory)
xLocalContext.getServiceManager();
//获取一个组件加载器
XComponentLoader aLoader =
(XComponentLoader)xRemoteFactory.createInstance("com.sun.star.frame.Desktop");
//加载源文件
XComponent xComponent = null;
尝试
{
xComponent = initDocument(aLoader,
路径转换器(输入文件),“_blank”);
//等待加载
而(xComponent == null)
{
System.Threading.Thread.Sleep(1000);
}
// 保存/导出文档
saveDocument(xComponent, inputFile, PathConverter(outputFile));
}
抓住 { 扔;}
最后 { xComponent.dispose(); }
}
私有静态无效 StartOpenOffice()
{
进程[] ps = Process.GetProcessesByName("soffice.exe");
如果(ps!= null)
{
如果(ps.长度> 0)
返回;
别的
{
进程 p = new Process();
p.StartInfo.Arguments = "-headless -nofirststartwizard";
p.StartInfo.FileName = "soffice.exe";
p.StartInfo.CreateNoWindow = true;
布尔结果 = p.Start();
如果(结果 == 假)
throw new InvalidProgramException("OpenOffice 启动失败。");
}
}
别的
{
throw new InvalidProgramException("未找到 OpenOffice。是否安装了 OpenOffice?");
}
}
private static XComponent initDocument(XComponentLoader aLoader, string file, string target)
{
PropertyValue[] openProps = new PropertyValue[1];
openProps[0] = new PropertyValue();
openProps[0].Name = "隐藏";
openProps[0].Value = new uno.Any(true);
XComponent xComponent = aLoader.loadComponentFromURL(
文件,目标,0,
开放道具);
返回 x 组件;
}
private static void saveDocument(XComponent xComponent, string sourceFile, string destinationFile)
{
属性值 [] 属性值 = 新属性值 [2];
属性值 = 新属性值 [2];
// 设置覆盖标志
属性值[1] = 新属性值();
propertyValues[1].Name = "覆盖";
propertyValues[1].Value = new uno.Any(true);
//// 设置过滤器名称
属性值[0] = 新属性值();
propertyValues[0].Name = "过滤器名称";
propertyValues[0].Value = new uno.Any(ConvertExtensionToFilterType(Path.GetExtension(sourceFile)));
((XStorable)xComponent).storeToURL(destinationFile, propertyValues);
}
私有静态字符串 PathConverter(字符串文件)
{
if (file == null || file.Length == 0)
throw new NullReferenceException("传递给 OpenOffice 的 Null 或空路径");
return String.Format("file:///{0}", file.Replace(@"\", "/"));
}
公共静态字符串 ConvertExtensionToFilterType(字符串扩展)
{
开关(扩展)
{
案例“.doc”:
案例“.docx”:
案例“.txt”:
案例“.rtf”:
案例“.html”:
案例“.htm”:
案例“.xml”:
案例“.odt”:
案例“.wps”:
案例“.wpd”:
返回“writer_pdf_Export”;
案例“.xls”:
案例“.xlsb”:
案例“.ods”:
返回“calc_pdf_Export”;
案例“.ppt”:
案例“.pptx”:
案例“.odp”:
返回“impress_pdf_Export”;
默认值:返回空;
}
}
}
你用什么语言工作?那里有许多 PDF 库。在 Stack Overflow 中搜索“pdf 库 [编程语言]”。已经有很多建议了。
OpenOffice 使用Sun PDF 库作为导入 PDF 的扩展,但我不确定它使用什么来导出它们。
PDFCreator 有一个 API 可以帮助您。
http://www.pdfforge.org/forum/open-discussion/3063-api-sdk-pdfcreator