【问题标题】:I can't flatten merged PDF with itextsharp我无法使用 itextsharp 展平合并的 PDF
【发布时间】:2014-08-07 01:09:45
【问题描述】:

我有 3 个 pdf 模板,我填写并保存到内存流中,它们将它们合并为 1 个 pdf 到内存流中。生成的合并 pdf 未展平。我尝试阅读合并的 pdf 并将其展平,但它说“找不到 pdf 标头签名”。有没有办法从内存流中展平合并的 pdf。 这是我迄今为止尝试过的,但没有成功。

var mergedPdf = MergePDFs(AllPdfs);
MemoryStream flattenedMergedPdf = new MemoryStream();
PdfReader Finalpdf = new PdfReader(mergedPdf);
PdfStamper StampFinalMerged = new PdfStamper(Finalpdf,flattenedMergedPdf); 
StampFinalMerged.FormFlattening=true;

return flattenedMergedPdf;

我用来合并 pdf 的方法(在 SO 上找到)如下:

 public MemoryStream MergePDFs(List<byte[]> pdfFiles) 
    {
        if (pdfFiles.Count > 1)
        {

            PdfReader finalPdf;
            Document pdfContainer;
            PdfCopy pdfCopy;
            MemoryStream msFinalPdf = new MemoryStream();


            finalPdf = new PdfReader(pdfFiles[0]);
            pdfContainer = new Document();
            pdfCopy = new PdfSmartCopy(pdfContainer, msFinalPdf);

            pdfContainer.Open();

            for (int k = 0; k < pdfFiles.Count; k++)
            {
                finalPdf = new PdfReader(pdfFiles[k]);
                for (int i = 1; i < finalPdf.NumberOfPages + 1; i++)
                {
                    ((PdfSmartCopy)pdfCopy).AddPage(pdfCopy.GetImportedPage(finalPdf, i));
                }

                pdfCopy.FreeReader(finalPdf);                   
            }
            //tried this here but no success
            // PdfReader FinalRead = new PdfReader(finalPdf);
            //MemoryStream FinalMS = new MemoryStream();
            //var finalStamper = new PdfStamper(FinalRead, FinalMS);
            //finalStamper.FormFlattening = true;

            pdfCopy.CloseStream = false;
            pdfCopy.Close();
            finalPdf.Close();

            //return FinalMS
            return msFinalPdf;

        }

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 我尝试阅读合并的 pdf 并将其展平,但它说“找不到 pdf 标头签名”。 - 如果它这么说,那么 mergedPdf 流似乎不是提供适当的 PDF。如果您将该流的内容存储到磁盘,您会得到什么?
  • 您的bytes 是如何获得的?您是在 MemoryStream 上使用 ToArray() 还是 GetBuffer()?另外,我强烈建议不要传递 MemoryStreams,而只传递原始字节。

标签: pdf itextsharp itext


【解决方案1】:

您可以先尝试另一种方法来拼合 PDF 模板,然后将它们合并到最终的 PDF 文件中:

string newFile = "... path to the merged pdf file ...";

string[] pdfTemplates = new string[3];
string pdfTemplates[0] = "... path to the 1st pdf template ...";
string pdfTemplates[1] = "... path to the 2nd pdf template ...";
string pdfTemplates[2] = "... path to the 3rd pdf template ...";

string[] pdfFiles = new string[3];
string pdfFiles[0] = "... path to the 1st temp pdf file ...";
string pdfFiles[1] = "... path to the 2nd temp pdf file ...";
string pdfFiles[2] = "... path to the 3rd temp pdf file ...";

for (int i = 0; i < 3; i++)
{
        PdfReader pdfReader = new PdfReader(pdfTemplates[i]);
        PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(pdfFiles[i], FileMode.Create));
        pdfStamper.FormFlattening = true;
        pdfStamper.Close();
}

MergeFiles(newFile, pdfFiles);

for (int i = 0; i < 3; i++)
{
    FileInfo fi = new FileInfo(pdfFiles[i]);
    fi.Delete();
}

private void MergeFiles(string destinationFile, string[] sourceFiles)
{
    try
    {
        int f = 0;

        PdfReader reader = new PdfReader(sourceFiles[f]);

        int n = reader.NumberOfPages;

        Document document = new Document(reader.GetPageSizeWithRotation(1));
        PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(destinationFile, FileMode.Create));
        document.Open();

        PdfContentByte cb = writer.DirectContent;
        PdfImportedPage page;

        int rotation;

        while (f < sourceFiles.Length)
        {
            int i = 0;
            while (i < n)
            {
                i++;
                document.SetPageSize(reader.GetPageSizeWithRotation(i));
                document.NewPage();
                page = writer.GetImportedPage(reader, i);
                rotation = reader.GetPageRotation(i);
                if (rotation == 90 || rotation == 270)
                {
                    cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(i).Height);
                }
                else
                {
                    cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
                }
            }

            f++;

            if (f < sourceFiles.Length)
            {
                reader = new PdfReader(sourceFiles[f]);
                n = reader.NumberOfPages;
            }
        }

        document.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 2012-10-22
    • 2013-03-09
    • 2015-01-19
    • 2023-03-22
    • 2014-10-08
    相关资源
    最近更新 更多