2017-01-11 3 views
-1

Das System, an dem ich arbeite, stempelt PDFs mit bestimmten Informationen. Dazu wird in der oberen rechten Ecke des Dokuments ein lindgrünes Textfeld erstellt. Es zeichnet dann eine bestimmte Zeichenfolge oben auf der grünen Fläche. Dies funktioniert für Tausende von PDFs, aber für einen ist der Text unsichtbar, obwohl die Box gezeichnet ist. Ich kann den Text immer noch auswählen und in etwas anderes kopieren, aber er ist im PDF nicht sichtbar.PDFsharp DrawString Text Unsichtbar für bestimmte PDF

Leider kann ich das PDF nicht teilen, aber es ist ein PDF 1.4. Was würde das verursachen?

Der Code für das Stanzen:

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; 
    } 

Ich habe mit dipose versucht() auf xgr und es vor jedem seiner Zieh Aktionen Neuinitialisierung. Ich habe versucht, den Zustand von xgr zwischen Zeichnungsaktionen zu speichern und wiederherzustellen, wie im Code gesehen. Ich habe verschiedene Schriftarten und Schriftgrößen auch ohne Glück ausprobiert.

Lassen Sie mich wissen, welche Metadaten über das PDF relevant sind, und ich werde das teilen.

Antwort

0

Unten ist der Code, den ich verwende, um etwas im Dokument zu verstecken und das Dokument zu bearbeiten und wieder zu speichern. Lassen Sie mich wissen, wenn es Sie

hilft
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; 
} 

Das ist für mich ohne Probleme bis heute gut funktioniert

+1

Das hilft mir nicht. Mein grünes Rechteck wird in der betreffenden PDF-Datei gut gezeichnet, meine Zeichenfolge jedoch nicht. Mein Code hat Tausende von PDFs bearbeitet, daher brauche ich diesen Code nicht. Es sei denn, ich verpasse etwas? – JosephGage

0

Mögliche Ursachen Ihre Frage zu beantworten: „Was würde dies dazu führen?“:

Sie verwenden die neueste Version PDFsharp 1.50 beta 3b? IIRC Es gibt einen Fehler in 1.32, der zu unerwartetem Verhalten führen kann, da einige Eigenschaften nicht zurückgesetzt werden.
Da Sie das Rechteck sehen, könnte dies die Ursache sein.

Da Sie das Rechteck sehen, gilt dies wahrscheinlich nicht:
Es gibt zwei Möglichkeiten, vorhandene Seiten zu ändern: "append" und "prepend". Ihr Code-Snippet zeigt nicht, wie Sie es tun. Mit "prepend" könnte Ihr Kalkrechteck unter einem weißen Rechteck versteckt sein. Sehen Sie sich das PDF in Adobe Reader mit aktivem Transparenzraster an und prüfen Sie, ob das Raster das Rechteck enthält.

Da Sie das Rechteck sehen, gilt dies wahrscheinlich nicht:
Vielleicht geht Ihr Text an die falsche Stelle. Überprüfen Sie die MediaBox- und CropBox-Einstellungen der PDF-Seite, die Sie bearbeiten. Normalerweise beginnen Seiten bei (0,0), aber Sie können nicht sicher sein.
Suchen Sie Ihren Text in der PDF-Datei und vergleichen Sie die Textposition mit MediaBox und CropBox.

Es könnte ein unbekannter Fehler in PDFsharp sein. Wenn Sie keine PDF-Datei finden, mit der Sie das Problem replizieren können, ist es sehr schwierig, den Fehler zu beheben. Aber vielleicht führt eine der oben genannten Möglichkeiten zum Erfolg.

+0

Ich habe versucht, die 1.50 Beta ohne Änderung zu verwenden. Die MediaBox und CropBox sind korrekt. Danke für die anderen Vorschläge. Wenn ich ein PDF mit demselben Problem finde, das ich teilen kann, werde ich es tun. – JosephGage

0

So habe ich es geschafft, einen Weg zu finden, damit es funktioniert. Ich habe den Stempelvorgang zweimal auf dem Dokument ausgeführt und es hat wie erwartet funktioniert. Glücklicherweise wirkt sich das zweimalige Stempeln nicht auf normale Dokumente aus, die tatsächlich normal funktionieren.

+0

Klingt wie ein Hack. Wie "geheim" ist das PDF? Ist es möglich, dass Sie es an die Entwickler von PDFsharp nur für eine interne Überprüfung senden? Ich verstehe, dass Sie eine Problemumgehung gefunden haben - alle Dateien erhalten zwei Stempel, obwohl nur eine Datei von 1000 benötigt wird. Im schlimmsten Fall ist diese Problemumgehung nach einer Überprüfung immer noch die beste Option, aber ich würde gerne wissen, ob PDFsharp hier einen Fehler hat oder nicht. –

+0

Es ist absolut ein Hack! Aber ich muss jetzt erstmal damit anfangen. Leider kann ich es nicht teilen. Ich entschuldige mich, dass ich PDFsharp hier nicht helfen kann. – JosephGage

0

Mit PdfSharp 1.5 GDI habe ich dieses Problem auch. Einige PDFs wären in Ordnung, andere hätten 1 oder 2 Seiten, die in Ordnung wären, und dann hätten andere keine Seiten, die in Ordnung wären. Text könnte ausgewählt werden, aber Text konnte nicht gesehen werden. Wenn Sie den RenderMode ändern, wird das Problem behoben.

In PdfGraphicsState.cs gibt es eine Bedingung zu überprüfen, ob _realizedRenderingMode! = RenderMode. Allerdings ist _realizedRenderingMode und renderstandardmäßig 0, so dass es tritt nie Codeblock, noch sieht es wie es ein Verfahren zum Ändern des render ist, wenn Sie die Schriftart ändern, um kursiv, fett, durchgestrichen oder unterstrichen:

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; 
     } 

Das Entfernen der Bedingung würde ausreichen, um das Problem zu beheben, aber der renderingMode scheint nur einmal für das BT (Begin Text) in XGraphicsPdfRenderer.cs benötigt zu werden.

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; 
     } 
    } 

So landete ich XGraphics Modifikation bis zu XGraphicsPdfRendererOptions und Leiten der Variable auf die verschiedenen Methoden umfassen, so dass es unabhängig vom Standort geändert werden kann:

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

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

Beachten Sie, dass die render ursprünglich basiert ob die Schrift kursiv, fett, durchgestrichen oder unterstrichen, die ich nicht wirklich sehen, wie diejenigen, die in XGraphicsPdfRenderer.cs zu render~~POS=TRUNC beziehen:

  //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); 

Klasse und Enum:

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 
} 

Verbrauch:

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

https://github.com/zaryk/PDFsharp