web-dev-qa-db-ja.com

PDF iTextSharpを使用してドキュメントにページを追加する

既存のPDF単純なテキストを含むドキュメントにページを追加したいと思います。

インターネットで見つけた次のコードを試してみましたが、これまでのところ機能していません。

PdfReader reader = new PdfReader("1.pdf");
Document document = new Document(reader.GetPageSize(1));
PdfCopy copier = new PdfCopy(doc, new FileStream("2.pdf", FileMode.Create));

for (int pageCounter = 1; pageCounter < reader.NumberOfPages + 1; pageCounter++)
{
    //byte[] page = reader.GetPageContent(pageCounter);
    copier.AddPage(copier.GetImportedPage(reader, pageCounter));
}

copier.NewPage();
copier.Add(new Paragraph("This is added text"));

document.Close();
reader.Close();

これを正しく行う方法を教えてください。

13
Ahmad Hajou
    private static string AddCommentsToFile(string fileName, string userComments)
    {
        string outputFileName = Path.GetTempFileName();
        //Step 1: Create a Docuement-Object
        Document document = new Document();
        try
        {
            //Step 2: we create a writer that listens to the document
            PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outputFileName, FileMode.Create));

            //Step 3: Open the document
            document.Open();

            PdfContentByte cb = writer.DirectContent;

            //The current file path
            string filename = fileName;

            // we create a reader for the document
            PdfReader reader = new PdfReader(filename);

            for (int pageNumber = 1; pageNumber < reader.NumberOfPages + 1; pageNumber++)
            {
                document.SetPageSize(reader.GetPageSizeWithRotation(1));
                document.NewPage();

                //Insert to Destination on the first page
                if (pageNumber == 1)
                {
                    Chunk fileRef = new Chunk(" ");
                    fileRef.SetLocalDestination(filename);
                    document.Add(fileRef);
                }

                PdfImportedPage page = writer.GetImportedPage(reader, pageNumber);
                int rotation = reader.GetPageRotation(pageNumber);
                if (rotation == 90 || rotation == 270)
                {
                    cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(pageNumber).Height);
                }
                else
                {
                    cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
                }
            }

            // Add a new page to the pdf file
            document.NewPage();

            Paragraph paragraph = new Paragraph();
            Font titleFont = new Font(iTextSharp.text.Font.FontFamily.HELVETICA
                                      , 15
                                      , iTextSharp.text.Font.BOLD
                                      , BaseColor.BLACK
                );
            Chunk titleChunk = new Chunk("Comments", titleFont);
            paragraph.Add(titleChunk);
            document.Add(paragraph);

            paragraph = new Paragraph();
            Font textFont = new Font(iTextSharp.text.Font.FontFamily.HELVETICA
                                     , 12
                                     , iTextSharp.text.Font.NORMAL
                                     , BaseColor.BLACK
                );
            Chunk textChunk = new Chunk(userComments, textFont);
            paragraph.Add(textChunk);

            document.Add(paragraph);
        }
        catch (Exception e)
        {
            throw e;
        }
        finally
        {
            document.Close();
        }
        return outputFileName;
    }
22
Ahmad Hajou

このコードを試してください:既存のPDFを含む新しいページを追加し、その最後のページに透かしテキストを追加します。

private string AddWaterMarkPageToFile(string fileName, string userComments)
        {
            string outputFileName = Path.GetTempFileName() + ".pdf";
            //Step 1: Create a Docuement-Object
            Document document = new Document();
            try
            {
                //Step 2: we create a writer that listens to the document
                PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outputFileName, FileMode.Create));

                //Step 3: Open the document
                document.Open();

                PdfContentByte cb = writer.DirectContent;

                //The current file path
                string filename = fileName;

                // we create a reader for the document
                PdfReader reader = new PdfReader(filename);

                for (int pageNumber = 1; pageNumber < reader.NumberOfPages + 1; pageNumber++)
                {
                    document.SetPageSize(reader.GetPageSizeWithRotation(1));
                    document.NewPage();

                    //Insert to Destination on the first page
                    if (pageNumber == 1)
                    {
                        Chunk fileRef = new Chunk(" ");
                        fileRef.SetLocalDestination(filename);
                        document.Add(fileRef);
                    }

                    PdfImportedPage page = writer.GetImportedPage(reader, pageNumber);
                    int rotation = reader.GetPageRotation(pageNumber);
                    if (rotation == 90 || rotation == 270)
                    {
                        cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(pageNumber).Height);
                    }
                    else
                    {
                        cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
                    }
                }

                // Add a new page to the pdf file
                document.NewPage();

                float fontSize = 80;
                float xPosition = iTextSharp.text.PageSize.A4.Width / 2;
                float yPosition = (iTextSharp.text.PageSize.A4.Height - 140f) / 2;
                float angle = 45;

                PdfContentByte under = writer.DirectContentUnder;
                BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);
                under.BeginText();
                under.SetColorFill(BaseColor.LIGHT_GRAY);
                under.SetFontAndSize(baseFont, fontSize);
                under.ShowTextAligned(PdfContentByte.ALIGN_CENTER, userComments, xPosition, yPosition, angle);
                under.EndText();

            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                document.Close();
            }
            return outputFileName;
        }
4

PdfCopyを使用してページを追加することはできません。新しいpdfを作成して追加する必要があります(必要な場合は、PdfCopyがpdfのマージに最適です)。

フッターを追加する方法の例も追加しました。

PdfReader reader = new PdfReader("1.pdf");
Document document = new Document(reader.GetPageSize(1));
PdfCopy copier = new PdfCopy(doc, new FileStream("2.pdf", FileMode.Create));

for (int pageCounter = 1; pageCounter < reader.NumberOfPages + 1; pageCounter++)
{
    // get page
    PdfImportedPage page = copier.GetImportedPage(reader, pageCounter)
    // add content to imported page
    PageStamp ps = pdfCopy.CreatePageStamp(page);
    PdfContentByte cb = ps.GetOverContent();
    // set color
    cb.SetColorFill(BaseColor.BLACK);
    // get font
    BaseFont baseFont = BaseFont.CreateFont(string.Format("{0}\\Fonts\\arialuni.ttf", Environment.GetEnvironmentVariable("windir"), BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
    cb.SetFontAndSize(baseFont, 12);
    cb.BeginText();
    cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, printLangString, 100f, 40f, 0f);
    cb.EndText();
    // Accept changes                    
    ps.AlterContents();
    // add page
    copier.AddPage(page);
}

using (var ms = new MemoryStream())
{
    Document doc = new Document(PageSize.A4);
    PdfWriter writer = PdfWriter.GetInstance(doc, ms);
    writer.CloseStream = false;
    doc.Open();
    doc.NewPage();
    doc.Add(new Paragraph(error, fontRed));
    doc.Close();
    writer.Close();
    ms.Seek(0, SeekOrigin.Begin);
    PdfReader rd = new PdfReader(ms);
    for (int pageCounter = 1; pageCounter < reader.NumberOfPages + 1; pageCounter++)
    {
        copier.AddPage(copier.GetImportedPage(rd, pageCounter));
    }
    rd.Close();
}

document.Close();
reader.Close();
2
Andreas Rehm