iText 7.0.4.0 - 将 PdfDocument 转换为字节数组
iText 7.0.4.0 - Converting PdfDocument to byte array
我正在尝试逐页拆分 PDF 文件,并获取每个页面文件的字节数组。但是,我在 iText 7.0.4 版 C# 中将每个页面转换为字节数组时遇到问题。
其他解决方案中引用的方法依赖于PdfWriter.GetInstance或PdfCopy,在iText 7.0.4版本中似乎不再存在。
我浏览了 iText 的示例代码和 API 文档,但我无法从中提取任何有用的信息。
using (Stream stream = new MemoryStream(pdfBytes))
using (PdfReader reader = new PdfReader(stream))
using (PdfDocument pdfDocument = new PdfDocument(reader))
{
PdfSplitter splitter = new PdfSplitter(pdfDocument);
// My Attempt #1 - None of the document's functions seem to be of help.
foreach (PdfDocument splitPage in splitter.SplitByPageCount(1))
{
// ??
}
// My Attempt #2 - GetContentBytes != pdf file bytes.
for (int i = 1; i <= pdfDocument.GetNumberOfPages(); i++)
{
PdfPage page = pdfDocument.GetPage(i);
byte[] bytes = page.GetContentBytes();
}
}
如有任何帮助,我们将不胜感激。
您使用 PdfSplitter
的方法是完成任务的最佳方法之一。开箱即用的功能可能不多,但是 PdfSplitter
是高度可定制的,如果您看一下实现或只是 API,就会清楚哪些是注入您自己的定制的正确点行为。
您应该覆盖 GetNextPdfWriter
以提供您希望在其中创建文档的任何输出媒体。您还可以使用 IDocumentReadyListener
定义在另一个文档准备就绪后将执行的操作。
我附上可以实现您的目标的实现之一:
class ByteArrayPdfSplitter : PdfSplitter {
private MemoryStream currentOutputStream;
public ByteArrayPdfSplitter(PdfDocument pdfDocument) : base(pdfDocument) {
}
protected override PdfWriter GetNextPdfWriter(PageRange documentPageRange) {
currentOutputStream = new MemoryStream();
return new PdfWriter(currentOutputStream);
}
public MemoryStream CurrentMemoryStream {
get { return currentOutputStream; }
}
public class DocumentReadyListender : IDocumentReadyListener {
private ByteArrayPdfSplitter splitter;
public DocumentReadyListender(ByteArrayPdfSplitter splitter) {
this.splitter = splitter;
}
public void DocumentReady(PdfDocument pdfDocument, PageRange pageRange) {
pdfDocument.Close();
byte[] contents = splitter.CurrentMemoryStream.ToArray();
String pageNumber = pageRange.ToString();
}
}
}
调用基本上与您一样,但带有自定义文档就绪事件:
PdfDocument docToSplit = new PdfDocument(new PdfReader(path));
ByteArrayPdfSplitter splitter = new ByteArrayPdfSplitter(docToSplit);
splitter.SplitByPageCount(1, new ByteArrayPdfSplitter.DocumentReadyListender(splitter));
我正在尝试逐页拆分 PDF 文件,并获取每个页面文件的字节数组。但是,我在 iText 7.0.4 版 C# 中将每个页面转换为字节数组时遇到问题。
其他解决方案中引用的方法依赖于PdfWriter.GetInstance或PdfCopy,在iText 7.0.4版本中似乎不再存在。
我浏览了 iText 的示例代码和 API 文档,但我无法从中提取任何有用的信息。
using (Stream stream = new MemoryStream(pdfBytes))
using (PdfReader reader = new PdfReader(stream))
using (PdfDocument pdfDocument = new PdfDocument(reader))
{
PdfSplitter splitter = new PdfSplitter(pdfDocument);
// My Attempt #1 - None of the document's functions seem to be of help.
foreach (PdfDocument splitPage in splitter.SplitByPageCount(1))
{
// ??
}
// My Attempt #2 - GetContentBytes != pdf file bytes.
for (int i = 1; i <= pdfDocument.GetNumberOfPages(); i++)
{
PdfPage page = pdfDocument.GetPage(i);
byte[] bytes = page.GetContentBytes();
}
}
如有任何帮助,我们将不胜感激。
您使用 PdfSplitter
的方法是完成任务的最佳方法之一。开箱即用的功能可能不多,但是 PdfSplitter
是高度可定制的,如果您看一下实现或只是 API,就会清楚哪些是注入您自己的定制的正确点行为。
您应该覆盖 GetNextPdfWriter
以提供您希望在其中创建文档的任何输出媒体。您还可以使用 IDocumentReadyListener
定义在另一个文档准备就绪后将执行的操作。
我附上可以实现您的目标的实现之一:
class ByteArrayPdfSplitter : PdfSplitter {
private MemoryStream currentOutputStream;
public ByteArrayPdfSplitter(PdfDocument pdfDocument) : base(pdfDocument) {
}
protected override PdfWriter GetNextPdfWriter(PageRange documentPageRange) {
currentOutputStream = new MemoryStream();
return new PdfWriter(currentOutputStream);
}
public MemoryStream CurrentMemoryStream {
get { return currentOutputStream; }
}
public class DocumentReadyListender : IDocumentReadyListener {
private ByteArrayPdfSplitter splitter;
public DocumentReadyListender(ByteArrayPdfSplitter splitter) {
this.splitter = splitter;
}
public void DocumentReady(PdfDocument pdfDocument, PageRange pageRange) {
pdfDocument.Close();
byte[] contents = splitter.CurrentMemoryStream.ToArray();
String pageNumber = pageRange.ToString();
}
}
}
调用基本上与您一样,但带有自定义文档就绪事件:
PdfDocument docToSplit = new PdfDocument(new PdfReader(path));
ByteArrayPdfSplitter splitter = new ByteArrayPdfSplitter(docToSplit);
splitter.SplitByPageCount(1, new ByteArrayPdfSplitter.DocumentReadyListender(splitter));