2017-01-11 3 views
-1

Система, в которой я работаю над печатями PDF с определенной информацией. Он делает это, создавая зеленое текстовое поле в верхнем правом углу документа. Затем он рисует определенную строку поверх зеленого пространства. Это работает для тысяч PDF-файлов, но для одного текст невидим, даже если поле рисовано. Я все еще могу выбрать текст и скопировать его в другое, но он невидим в PDF.PDFsharp DrawString Текст Невидимый для некоторых PDF

К сожалению, я не могу поделиться PDF, но это PDF 1.4. Что может вызвать это?

Код для тиснения:

private static XGraphics drawString(XGraphics xgr, PdfPage page, string printString, int pageNumber = 0) 
    { 
     XFont font = new XFont("Verdana", 10, XFontStyle.BoldItalic); 

     var textSize = xgr.MeasureString(printString, font); 
     var width = textSize.Width; 
     var height = textSize.Height; 

     double xMin = 0; 
     double yMin = 0; 

     if (page.Rotate == 90) 
     { 
      xMin = page.Height - textSize.Width; 
      var state = xgr.Save(); 
      xgr.DrawRectangle(XBrushes.LimeGreen, xMin, yMin, width, height); 
      xgr.Restore(state); 
      xgr.DrawString(printString, font, XBrushes.Black, new XRect(0, 0, page.Height, page.Width), topRight()); 
     } 
     else 
     { 
      xMin = page.Width - textSize.Width; 
      var state = xgr.Save(); 
      xgr.DrawRectangle(XBrushes.LimeGreen, xMin, yMin, width, height); 
      xgr.Restore(state); 
      xgr.DrawString(printString, font, XBrushes.Black, new XRect(0, 0, page.Width, page.Height), topRight()); 
     } 

     return xgr; 
    } 

    private static XStringFormat topRight() 
    { 
     XStringFormat format = new XStringFormat(); 
     format.Alignment = XStringAlignment.Far; 
     format.LineAlignment = XLineAlignment.Near; 
     return format; 
    } 

Я попытался с помощью Dipose() на XGR и его Повторная инициализация перед каждым из его вытяжных действий. Я попытался сохранить и восстановить состояние xgr между действиями рисования, как показано в коде. Я также попробовал разные шрифты и размеры шрифтов.

Дайте мне знать, какие метаданные о PDF актуальны, и я поделюсь этим.

ответ

0

Ниже приведен код, который я использую, чтобы скрыть что-то в документе и отредактировать документ и снова сохранить. Дайте мне знать, если это поможет вам

private PdfDocument FormatPdfDocument(PdfDocument document, List<string> packingTypes, string carrierName) 
{ 
    XFont PackingTypeFont = new XFont("Calibri", 10, XFontStyle.Bold); 
    var i = 0; 
    foreach (PdfPage page in document.Pages) 
    { 
     using (var gfx = XGraphics.FromPdfPage(page)) 
     { 
      var packingType = packingTypes.ElementAtOrDefault(i++) ?? "PackingType Not Found"; 
      if (carrierName == "xxxx") 
      { 
       var packingTypeBounds = new XRect(64, 62, 200, 12); 
       gfx.DrawRectangle(XBrushes.White, packingTypeBounds); 
       gfx.DrawString(packingType, PackingTypeFont, XBrushes.Black, packingTypeBounds, XStringFormats.TopLeft); 

       var logoBounds = new XRect(0, 0, 130, 50); 
       gfx.DrawRectangle(XBrushes.White, logoBounds); 
      } 
      else if (carrierName == "yyyy") 
      { 
       var packingTypeBounds = new XRect(200, 0, 200, 12); 
       gfx.DrawString(packingType, PackingTypeFont, XBrushes.Black, packingTypeBounds, XStringFormats.TopLeft); 
      } 
      else if (carrierName == "zzzz") 
      { 
       var packingTypeBounds = new XRect(410, 20, 200, 12); 
       var state = gfx.Save(); 
       gfx.RotateAtTransform(90, new XPoint { X = 410, Y = 20 }); 
       gfx.DrawString(packingType, PackingTypeFont, XBrushes.Black, packingTypeBounds, XStringFormats.TopLeft); 
       gfx.Restore(state); 
      } 
     } 
    }  
    return document; 
} 

Это прекрасно работает для меня до настоящего времени без каких-либо проблем

+1

Это не поможет мне. Мой зеленый прямоугольник нарисован отлично в рассматриваемом PDF-файле, но моя строка - нет. Мой код работал над тысячами PDF-файлов, поэтому мне не нужен этот код. Разве я что-то не хватает? – JosephGage

0

Некоторые возможные причины, чтобы ответить на ваш вопрос: «Что бы вызвать это?»:

Вы используете последняя версия PDFsharp 1.50 beta 3b? IIRC есть ошибка в 1.32, которая может привести к неожиданному поведению, поскольку некоторые свойства не сбрасываются.
Поскольку вы видите прямоугольник, это может быть причиной.

Поскольку вы видите прямоугольник, это, вероятно, не применимо:
Существует два способа изменения существующих страниц: «добавить» и «добавить». Ваш фрагмент кода не показывает, как вы это делаете. С «preend» ваш прямоугольник извести можно было бы спрятать под белым заполненным прямоугольником. Посмотрите PDF в Adobe Reader с активной сеткой прозрачности и убедитесь, что вы видите сетку, в которой должен быть прямоугольник.

Поскольку вы видите прямоугольник, это, вероятно, не применимо:
Возможно, ваш текст переместится в неправильное положение. Проверьте настройки MediaBox и CropBox на странице PDF, которую вы изменяете. Обычно страницы начинаются с (0,0), но вы не можете быть уверены.
Найдите текст в файле PDF и сравните текстовую позицию с MediaBox и CropBox.

Это может быть неизвестная ошибка в PDFsharp. Если вы не найдете PDF-файл, который позволяет реплицировать проблему, которую вы можете предоставить, это будет очень сложно исправить ошибку. Но, возможно, один из вариантов выше приводит к успеху.

+0

Я попытался использовать бета-версию 1.50 без каких-либо изменений. MediaBox и CropBox верны. Благодарим вас за другие предложения. Если я найду PDF с той же проблемой, с которой я могу поделиться, я это сделаю. – JosephGage

0

Так что мне удалось найти способ заставить его работать. Я дважды запустил процесс штамповки документа и работал, как ожидалось. К счастью, тиснение дважды не влияет на обычные документы, которые фактически работают нормально.

+0

Звучит как взломать. Как «секрет» - это PDF? Возможно ли, что вы отправите его разработчикам PDFsharp только для внутреннего обзора? Я понимаю, что вы нашли обходное решение - все файлы получают две марки, хотя для этого нужен только один файл из 1000. В худшем случае это решение по-прежнему будет лучшим вариантом после обзора, но я хотел бы знать, есть ли здесь файл PDFsharp. –

+0

Это абсолютно рушится! Но мне придется идти с этим пока. К сожалению, я действительно не могу поделиться этим. Я прошу прощения, что я не могу помочь PDFsharp здесь. – JosephGage

0

Использование PdfSharp 1.5 GDI, у меня тоже была эта проблема. Некоторые pdf-файлы были бы в порядке, у других было бы 1 или 2 страницы, которые были бы в порядке, а у других не было бы страниц, которые были бы в порядке. Можно выбрать текст, но текст не отображается. Изменение метода renderMode устраняет проблему.

В PdfGraphicsState.cs существует условие для проверки, существует ли _realizedRenderingMode! = RenderMode. Тем не менее, _realizedRenderingMode и RenderMode 0 по умолчанию, поэтому он никогда не входит в кодоблок, и не выглядеть как есть метод для изменения RenderMode, если вы не измените шрифт на курсив, жирный, зачеркнутый, или подчеркнуть:

int _realizedRenderingMode; // Reference: TABLE 5.2 Text state operators/Page 398 

    public void RealizeFont(XFont font, XBrush brush, int renderingMode) 
    { 
     const string format = Config.SignificantFigures3; 

     // So far rendering mode 0 (fill text) and 2 (fill, then stroke text) only. 
     RealizeBrush(brush, _renderer._colorMode, renderingMode, font.Size); // _renderer.page.document.Options.ColorMode); 

     // Realize rendering mode. 
     if (_realizedRenderingMode != renderingMode) 
     { 
      _renderer.AppendFormatInt("{0} Tr\n", renderingMode); 
      _realizedRenderingMode = renderingMode; 
     } 

Удаление этого условия было бы достаточным для исправления проблемы, но для метода renderMode требуется только 1 раз для BT (Begin Text) в XGraphicsPdfRenderer.cs.

internal void BeginTextMode() 
    { 
     if (_streamMode != StreamMode.Text) 
     { 
      _streamMode = StreamMode.Text; 
      _content.Append("BT\n"); 
      // Text matrix is empty after BT 
      _gfxState.RealizedTextPosition = new XPoint(); 
      _gfxState.ItalicSimulationOn = false; 
     } 
    } 

Итак, я в конечном итоге изменения XGraphics включить XGraphicsPdfRendererOptions и передавая переменную различными способами, поэтому он может быть изменен независимо от местоположения:

private XGraphicsPdfRendererOptions _renderOptions { get; set; } 
    public XGraphicsPdfRendererOptions RenderOptions 
    { 
     get 
     { 
      if (_renderOptions == null) 
      { 
       _renderOptions = new XGraphicsPdfRendererOptions(); 
      } 

      return _renderOptions; 
     } 
     set 
     { 
      _renderOptions = value; 
     } 
    } 

Имейте в виду, что RenderMode изначально основан от того, курсив, жирный, зачеркнутый, или подчеркнуть шрифт, который я не очень понимаю, как те относятся к RenderMode, в XGraphicsPdfRenderer.cs:

  //bool bold = (font.Style & XFontStyle.Bold) != 0; 
     //bool italic = (font.Style & XFontStyle.Italic) != 0; 
     bool italicSimulation = (font.GlyphTypeface.StyleSimulations & XStyleSimulations.ItalicSimulation) != 0; 
     bool boldSimulation = (font.GlyphTypeface.StyleSimulations & XStyleSimulations.BoldSimulation) != 0; 
     bool strikeout = (font.Style & XFontStyle.Strikeout) != 0; 
     bool underline = (font.Style & XFontStyle.Underline) != 0; 

     Realize(font, brush, boldSimulation ? 2 : 0); 

класса и перечисление:

public class XGraphicsPdfRendererOptions 
{ 
    public XGraphicsPdfRenderMode RenderMode { get; set; } 
    public bool IncludeRenderModeForPage { get; set; } 
    public bool IncludeRenderModeForObject { get; set; } 
} 

public enum XGraphicsPdfRenderMode 
{ 
    Text_Render_Mode_Fill = 0, 
    Text_Render_Mode_Stroke = 1, 
    Text_Render_Mode_Fill_Stroke = 2, 
    Text_Render_Mode_Invisible = 3 
} 

Использование:

gfx.RenderOptions = new XGraphicsPdfRendererOptions() { RenderMode = XGraphicsPdfRenderMode.Text_Render_Mode_Fill, IncludeRenderModeForPage = true }; 

https://github.com/zaryk/PDFsharp

Смежные вопросы