我无法使用itextsharp压缩合并的PDF

时间:2014-08-07 01:09:46

标签: pdf itextsharp itext

我有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;

我用来合并pdfs(在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;

        }

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

1 个答案:

答案 0 :(得分:0)

您可以先尝试另一种方法来展平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);
    }
}