首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iText5和iText7中文本绝对定位的差异

iText5和iText7中文本绝对定位的差异
EN

Stack Overflow用户
提问于 2017-06-25 22:57:39
回答 1查看 1K关注 0票数 1

我正试图从iText5迁移到iText7,但是文本的绝对定位一直存在问题。似乎在相同文本的相对位置上有相当大的偏移,即使对iText5和iText7进行了完全相同的测量。

下面是显示问题的代码:

代码语言:javascript
复制
using iText.Kernel.Geom;
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iText.Kernel.Font;

namespace ConsoleApplication1
{
    static class Program
    {
        static void Main(string[] args)
        {
            //using iText7
            var folder = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            var fileName = "iText7.pdf";
            var workingName = "iText5.pdf";
            var finalPath = System.IO.Path.Combine(folder, fileName);
            var WorkingFile = System.IO.Path.Combine(folder, workingName);


            var pdfWriter = new iText.Kernel.Pdf.PdfWriter(finalPath);
            var pdfDoc = new iText.Kernel.Pdf.PdfDocument(pdfWriter);
            var doc = new iText.Layout.Document(pdfDoc, new iText.Kernel.Geom.PageSize(620.986F, 813.543F));

            var font = PdfFontFactory.CreateRegisteredFont("HELVETICA", BaseFont.CP1252, false);


            doc.SetMargins(0, 0, 0, 0);

            doc.PutText(new iText.Layout.Element.Paragraph("TESTLINE").SetFont(font), ConvertCoords(189, 10));
            doc.Flush();
            doc.Close();

            //using iText5
            using (var FS = new FileStream(WorkingFile, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                using (var Doc = new iTextSharp.text.Document(new iTextSharp.text.Rectangle(620.986F, 813.543F), 0, 0, 0, 0))
                {
                    using (var Writer = iTextSharp.text.pdf.PdfWriter.GetInstance(Doc, FS))
                    {
                        Doc.Open();
                        Doc.NewPage();
                        var pcb = Writer.DirectContent;
                        pcb.BeginText();

                        //var font = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, false);
                        var fontbold = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, false);                        

                        pcb.SetFontAndSize(fontbold, 12);
                        pcb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "TESTLINE", (float)ConvertCoords(189, 10).GetX(), (float)ConvertCoords(189, 10).GetY(), 0);

                        pcb.EndText();
                        Writer.Flush();
                        Doc.Close();
                    }

                }
            }



        }

        private static void PutText(this iText.Layout.Document doc, iText.Layout.Element.Paragraph text, Point coords,
                                    iText.Layout.Properties.TextAlignment horizontalalign = iText.Layout.Properties.TextAlignment.LEFT,
                                    iText.Layout.Properties.VerticalAlignment verticalalign = iText.Layout.Properties.VerticalAlignment.TOP)
        {

            doc.ShowTextAligned(text, (float)coords.GetX(), (float)coords.GetY(), horizontalalign, verticalalign);
        }

        //Converts mm to Point
        private static Point ConvertCoords(float a, float b)
        {
            return new Point(a * 2.834265, (287 - b) * 2.834645669291);
        }
    }
}

我正在使用C#。有人能解决这个问题吗?否则,我将不得不承担一个艰巨的任务,以重新测量所有的形式。

编辑:

按照建议,我纠正了使用两种不同页面大小的疏忽。我已经编辑了上面的代码。然而,这个问题仍然存在。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-26 14:57:14

不幸的是,我只能解释行为的原因,但不知道一个非低级别的iText 7 API方法来解决它。

除了文档大小(620.986F x 813.543F表示iText 5代码,619.2f x 813.6f表示iText 7代码)之外,位置差异的主要原因是

  • 对于iText 5代码,PdfContentByte.ShowTextAligned调用的y坐标表示文本的基线
  • 对于iText 7代码,默认情况下,PutText方法调用的y坐标表示文本的顶部(指定值iText.Layout.Properties.VerticalAlignment.TOP为默认值)。

当从iText 5移植到iText 7时,显而易见的解决方案是基线垂直对齐。

不过,据我所见,iText 7目前只知道以下垂直对齐值

代码语言:javascript
复制
public enum VerticalAlignment {
    TOP,
    MIDDLE,
    BOTTOM
}

(https://github.com/itext/itext7-dotnet/blob/develop/itext/itext.layout/itext/layout/properties/VerticalAlignment.cs)

由于基线通常在中间和底部之间,但几乎从来没有与任何一个重合,你正在寻找的垂直对齐是缺失的。

因此,您必须像iText 7 TextRenderer类那样有效地计算文本行的上升,并将其添加到TOP对齐文本的y坐标参数中。或者编写一个新的文本呈现器,它不会被上升者所抵消。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44751336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档