Hi, ich arbeite gerade an einem Programm, dass Daten in einem PDF anzeigen soll. Habe dazu Formularfelder im PDF verwendet.
Ich nutze iTextSharp zum Lesen und bearbeiten des Files.
Wollte das schnell anhand des unteren Beispielcodes ausprobieren aber bekomme die Fehlermeldung, dass auf eine geschlossene Datei nicht zugegriffen werden kann.
Aber soweit ich den Code verstehe sollte das PDF doch vom Programm geöffnet worden sein oder nicht?
string pdfFormPath = @"D:/Ort/PDF-File.pdf";
string filledPdfPath = @"D:\Ort2\PDF-gefüllt.pdf";
// Daten, die in das Formularfeld eingefügt werden sollen
Dictionary<string, string> fieldValues = new Dictionary<string, string>
{
{ "Formfeld1", "Test1" },
{ "Formfeld2", "Test2" },
{ "Formfeld3", "Test3" }
};
File.Copy(pdfFormPath, filledPdfPath, true);
// Öffnet das ausgefüllte PDF zum Schreiben
using (FileStream fs = new FileStream(filledPdfPath, FileMode.Open, FileAccess.ReadWrite))
{
PdfReader pdfReader = new PdfReader(fs);
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, fs))
{
foreach (KeyValuePair<string, string> fieldValue in fieldValues)
{
pdfStamper.AcroFields.SetField(fieldValue.Key, fieldValue.Value);
}
pdfStamper.FormFlattening = true;
pdfStamper.Close();
}
pdfReader.Close();
}
In welcher Zeile genau erhältst du denn die Exception?
Durch die using
-Anweisung in Zeile 20 sollte pdfStamper.Close()
überflüssig sein (aber es sollte trotzdem keine Exception geworfen werden).
Analog solltest du beim Zugriff auf PdfReader pdfReader
besser ebenfalls eine using
-Anweisung benutzen.
Die Exception bekomme ich in der Zeile 20: using (PdfStamper pdfStamper = new PdfStamper(pdfReader, fs))
Möchtest du gleichzeitig die PDF-Datei lesen und beschreiben? Das wird wohl so nicht direkt funktionieren - gib mal als 2. Parameter für PdfStamper
einen eigenen Output-FileStream
an, s.a. C# (CSharp) iTextSharp.text.pdf PdfStamper Beispiele.
Dann sollte auch das File.Copy
überflüssig sein.