【问题标题】:itextsharp PdfCopy and landscape pagesitextsharp PdfCopy 和横向页面
【发布时间】:2012-09-06 10:11:21
【问题描述】:

我正在使用 itextsharp 加入多个 pdf 文档并添加页脚。 我的代码工作正常 - 除了横向页面 - 它没有检测到页面旋转 - 页脚没有为横向居中:

    public static int AddPagesFromStream(Document document, PdfCopy pdfCopy, Stream m, bool addFooter, int detailPages, string footer, int footerPageNumOffset, int numPages, string pageLangString, string printLangString)
    {
        CreateFont();
        try
        {
            m.Seek(0, SeekOrigin.Begin);
            var reader = new PdfReader(m);

            // get page count
            var pdfPages = reader.NumberOfPages;
            var i = 0;

            // add pages
            while (i < pdfPages)
            {
                i++;

                // import page with pdfcopy
                var page = pdfCopy.GetImportedPage(reader, i);

                // get page center
                float posX;
                float posY;
                var rotation = page.BoundingBox.Rotation;
                if (rotation == 0 || rotation == 180)
                {
                    posX = page.Width / 2;
                    posY = 0;
                }
                else
                {
                    posX = page.Height / 2;
                    posY = 20f;
                }

                var ps = pdfCopy.CreatePageStamp(page);
                var cb = ps.GetOverContent();

                // add footer
                cb.SetColorFill(BaseColor.WHITE);
                var gs1 = new PdfGState {FillOpacity = 0.8f};
                cb.SetGState(gs1);
                cb.Rectangle(0, 0, document.PageSize.Width, 46f + posY);
                cb.Fill();

                // Text
                cb.SetColorFill(BaseColor.BLACK);
                cb.SetFontAndSize(baseFont, 7);
                cb.BeginText();

                // create text
                var pages = string.Format(pageLangString, i + footerPageNumOffset, numPages);
                cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, printLangString, posX, 40f + posY, 0f);
                cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, footer, posX, 28f + posY, 0f);
                cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, pages, posX, 20f + posY, 0f);
                cb.EndText();

                ps.AlterContents();

                // add page to new pdf
                pdfCopy.AddPage(page);
            }

            // close PdfReader
            reader.Close();
            // return number of pages
            return i;
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            return 0;
        }
    }

在这种情况下如何检测页面旋转(例如横向)格式?给定的示例适用于 PdfReader,但不适用于 PdfCopy。

编辑: 为什么我需要 PdfCopy?我尝试复制一个word pdf导出。当您尝试使用 PdfReader 复制页面时,某些单词超链接将不起作用。只有 PdfCopy 传输所有需要的页面信息。

编辑:(已解决) 你需要使用 reader.GetPageRotation(i);

【问题讨论】:

    标签: itextsharp center footer landscape


    【解决方案1】:

    你需要使用 reader.GetPageRotation(i);

    解决的代码:

        public static int AddPagesFromStream(Document document, PdfCopy pdfCopy, Stream m, bool addFooter, int detailPages, string footer, int footerPageNumOffset, int numPages, string pageLangString, string printLangString)
        {
            CreateFont();
            try
            {
                m.Seek(0, SeekOrigin.Begin);
                var reader = new PdfReader(m);
    
                // get page count
                var pdfPages = reader.NumberOfPages;
                var i = 0;
    
                // add pages
                while (i < pdfPages)
                {
                    i++;
    
                    // import page with pdfcopy
                    var page = pdfCopy.GetImportedPage(reader, i);
    
                    // get page center
                    float posX;
                    float posY;
                    var rotation = reader.GetPageRotation(i);
                    if (rotation == 0 || rotation == 180)
                    {
                        posX = page.Width / 2;
                        posY = 0;
                    }
                    else
                    {
                        posX = page.Height / 2;
                        posY = 20f;
                    }
    
                    var ps = pdfCopy.CreatePageStamp(page);
                    var cb = ps.GetOverContent();
    
                    // add footer
                    cb.SetColorFill(BaseColor.WHITE);
                    var gs1 = new PdfGState {FillOpacity = 0.8f};
                    cb.SetGState(gs1);
                    cb.Rectangle(0, 0, document.PageSize.Width, 46f + posY);
                    cb.Fill();
    
                    // Text
                    cb.SetColorFill(BaseColor.BLACK);
                    cb.SetFontAndSize(baseFont, 7);
                    cb.BeginText();
    
                    // create text
                    var pages = string.Format(pageLangString, i + footerPageNumOffset, numPages);
                    cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, printLangString, posX, 40f + posY, 0f);
                    cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, footer, posX, 28f + posY, 0f);
                    cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, pages, posX, 20f + posY, 0f);
                    cb.EndText();
    
                    ps.AlterContents();
    
                    // add page to new pdf
                    pdfCopy.AddPage(page);
                }
    
                // close PdfReader
                reader.Close();
                // return number of pages
                return i;
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return 0;
            }
        }
    

    【讨论】:

      【解决方案2】:

      在您的代码示例中,page 的类型为 PdfImportedPage。你要的是它的边界框。 PdfImportedPage 属于 PdfTemplate 类型,因此您要求的是 XObject 的边界框。我怀疑这会奏效。

      您应该向 reader 对象询问页面的旋转。我猜您自己已经发现了这一点,因为您说“给定的示例适用于 PdfReader,但不适用于 PdfCopy”。

      【讨论】:

      • 是的 - 我做到了。但我不认为我需要这样做两次......一个 PdfReader 来获取所需的信息,一个 PdfCopy 来进行复制。
      猜你喜欢
      • 2011-05-15
      • 2011-07-17
      • 2012-04-19
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      相关资源
      最近更新 更多