如何使用 PDFReactor 5.1 合并 pdf 文件
How to merge pdf files with PDFReactor 5.1
我正在使用一个已建立的应用程序,其中使用了 PDFReactor 5.1。公司暂时不会升级(可能再过1-2年)。
我的任务是构建功能以从基于 C# 的 Web 应用程序合并 pdf 文件(附加所有 pdf 即可)。
阅读此工具的旧文档(2012 年的文档)我发现他们提出了这种用法:
To merge multiple PDFs use the methods setMergeURLs or
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
没有 return 值 (public void SetMergeURLs(string[] urls)
)
当我探索客户端 DLL 时,我可以看到有 3 种渲染方法,但它们都需要一些输入(大概除了你用 setMergeURLs
设置的 pdf 之外):
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 而不是合并...
我错过了什么??
我与 RealObjects 的支持人员(pdf reactor 的创建者)进行了交谈,这是他们的回答:
In general PDFreactor is not intended to just merge existing PDFs. You
can only merge one or more existing PDFs to an actual HTML to PDF
conversion. See also our FAQ.
此常见问题解答看起来仅适用于当前版本,因此它对 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 合并,因为我不希望出现此空白页。
我正在使用一个已建立的应用程序,其中使用了 PDFReactor 5.1。公司暂时不会升级(可能再过1-2年)。
我的任务是构建功能以从基于 C# 的 Web 应用程序合并 pdf 文件(附加所有 pdf 即可)。
阅读此工具的旧文档(2012 年的文档)我发现他们提出了这种用法:
To merge multiple PDFs use the methods setMergeURLs or 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
没有 return 值 (public void SetMergeURLs(string[] urls)
)
当我探索客户端 DLL 时,我可以看到有 3 种渲染方法,但它们都需要一些输入(大概除了你用 setMergeURLs
设置的 pdf 之外):
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 而不是合并...
我错过了什么??
我与 RealObjects 的支持人员(pdf reactor 的创建者)进行了交谈,这是他们的回答:
In general PDFreactor is not intended to just merge existing PDFs. You can only merge one or more existing PDFs to an actual HTML to PDF conversion. See also our FAQ.
此常见问题解答看起来仅适用于当前版本,因此它对 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 合并,因为我不希望出现此空白页。