1

我正在使用一个使用 PDFReactor 5.1 的已建立的应用程序。公司暂时不会升级它(可能再过 1-2 年)。

我的任务是构建功能以从基于 C# 的 Web 应用程序合并 pdf 文件(附加所有 pdf 文件)。

阅读该工具的旧文档(从 2012 年开始),我发现他们提出了这种用法:

要合并多个 PDF,请使用 setMergeURLs 或 setMergeByteArrays 方法

String[] urls = {"http://www.myserver.com/overlaid1.pdf", "http://www.myserver.com/overlaid2.pdf"};
pdfReactor.setMergeURLs(urls);
pdfReactor.setMergeMode(PDFreactor.MERGE_MODE_APPEND);

但是,文档没有指定调用什么方法来渲染合并的 pdf 并且setMergeURLs没有返回值 ( public void SetMergeURLs(string[] urls))

当我浏览客户端 DLL 时,我可以看到有 3 种渲染方法,但它们都需要一些输入(大概除了您设置的 pdf 之外setMergeURLs):

  • public byte[] RenderDocumentFromByteArray(byte[] byteArray)
  • public byte[] RenderDocumentFromContent(string content)
  • byte[] RenderDocumentFromURL(string URL)

我尝试使用这 3 种渲染方法,但它们只会导致空数组出现以下错误:

org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.

似乎 PDF 反应器正在尝试从 XML 转换为 pdf 而不是合并...

我错过了什么?

4

1 回答 1

0

我与 RealObjects 的支持人员(pdf 反应器的创建者)进行了交谈,这是他们的回答:

一般来说,PDFreactor 并不打算仅仅合并现有的 PDF。您只能将一个或多个现有 PDF 合并到实际的 HTML 到 PDF 转换。另请参阅我们的常见问题解答

此常见问题解答看起来仅适用于当前版本,因此它对 5.1 版的使用并没有真正的帮助(正如我所要求的那样)。

我一直在尝试多一点,直到我终于把它合并了。这是它的主要部分:

var pdfReactor = new PDFreactor();
pdfReactor.SetLicenseKey(myLicenseKey);
pdfReactor.SetMergeMode(PDFreactor.MERGE_MODE_PREPEND); // prepend because it seems to reference the doc to be generated by RenderDocumentFromContent
pdfReactor.SetMergeByteArrays(
    new[]
    {
        File.ReadAllBytes("c:/pdfs/first.pdf"),
        File.ReadAllBytes("c:/pdfs/second.pdf")
    });

var merged = pdfReactor.RenderDocumentFromContent("<html></html>");

File.WriteAllBytes($@"C:\pdfs\merged.pdf", merged);

merged.pdf文件包含其他两个文件,但是它以空白页开头(由于<html></html>我在RenderDocumentFromContent调用中使用它以使其不产生错误)。

就这个练习对我而言,我将保留它并考虑另一种工具来进行 pdf 合并,因为我不想要这个空白页。

于 2020-11-11T01:54:12.200 回答