iText 7.0.4.0 - 将PdfDocument转换为字节数组

Jam*_*s.K 7 c# itext itext7

我正在尝试逐页拆分PDF文件,并获取每个页面文件的字节数组.但是,我在用于C#的iText版本7.0.4中将每个页面转换为字节数组时遇到问题.

其他解决方案中引用的方法依赖于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();
    }
}
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激.

Ale*_*ach 6

您的使用方法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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这些调用基本上与您所做的一样,但具有自定义文档就绪事件:

PdfDocument docToSplit = new PdfDocument(new PdfReader(path));
ByteArrayPdfSplitter splitter = new ByteArrayPdfSplitter(docToSplit);
splitter.SplitByPageCount(1, new ByteArrayPdfSplitter.DocumentReadyListender(splitter));
Run Code Online (Sandbox Code Playgroud)