Permalänk

C# ändra pdf, blir galen

Halloj allihopa!

Sitter på jobbet och vi ska ändra på en del pdfer rätt så ofta så skrivet ett program som ska göra detta automatiskt. Har googlat runt rätt mycket och använder mig av olika sorters parsers etc, läsa texten är inget problem, däremot skriva!

Vill alltså läsa in de olika orden som finns i pdfen och sen ändra dem, och spara tillbaka dem. Det är bara att spara tillbaka dem som är problemet, resten klarar jag.. Kan heller inte skapa ett nytt doc för det är en hel del bilder etc som inte får flytta sig eller så.

Någon som har nån idé? Grundkoden nu är:

PDDocument doc = PDDocument.load(filename); PDFTextStripper stripper = new PDFTextStripper(); string text = stripper.getText(doc);

följt av logik för att ändra texten, men det finns tyvärr inget strippet.setText.. Några idéer?

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Permalänk
Citat:

Ursprungligen inskrivet av azoapes
Kan vara bra att nämna att du använder PDF Box.

Kolla här: http://www.pdfbox.org/javadoc/org/pdfbox/util/PDFTextStripper.html#writeText(org.pdfbox.pdmodel.PDDocument, java.io.Writer)

Jo, testat den lite men den skriver över det jag redan har.. Eller så använder jag den fel, hur bör man göra/har du testat den?

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Prova köra startParagraph först. Annars finns även en writeCharacters som har TextPosition som parameter. Kolla om du får bättre kontroll på vart texten hamnar via den. Testa också att köra flush innan du skriver något.

Nej jag kan tyvärr inte med just den PDF-hanteraren.

Permalänk
Citat:

Ursprungligen inskrivet av azoapes
Prova köra startParagraph först. Annars finns även en writeCharacters som har TextPosition som parameter. Kolla om du får bättre kontroll på vart texten hamnar via den. Testa också att köra flush innan du skriver något.

Nej jag kan tyvärr inte med just den PDF-hanteraren.

Vill helst inte kontrollera alls var texten hamnar, vill bara byta ut den befintliga, oavsett plats.. Skulle vilja ha typ pdfdocument.Text = pdfdocument.Text.Replace("", "") eller liknande om du förstår vad jag vill göra..

Kan du någon annan PDF-hanterare?

Edit: Egentligen vill jag ungefär öppna upp pdfen i notepad och köra replace, men det går ju inte heller.. Men så ni förstår var jag menar, behöver inte vara nå fancy alls

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk

Okej, kommit en bit på vägen men fått ett väldigt konstigt problem:S

Kör såhär:

PdfReader reader = new PdfReader(filename); byte[] pageBytes = reader.GetPageContent(1); byte[] newbytes = pageBytes; System.Text.Encoding encoding = new System.Text.ASCIIEncoding(); string s = encoding.GetString(pageBytes); s = s.Replace(textBox1.Text, textBox2.Text); newbytes = encoding.GetBytes(s); reader.SetPageContent(1, newbytes);

Tro det eller ej så gör det här exakt det jag vill.. Men just för nior funkar det inte? När jag vill byta ut nåt mot en nia så blir det bara en fyrkant, resten funkar.. Någon aning någon?

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Testa att ändra encoding till system default (hur man nu gör det, ingen aning själv)

edit: System.Text.Encoding encoding = System.Text.Encoding.Default kanske..?

Visa signatur

Kom-pa-TI-bilitet

Permalänk

Testade precis det, samma resultat Ser på typsnitten att de är i ansi-enkodning

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Prova byta Encoding till UTF8... annars var det ett väldigt konstigt problem

Permalänk

Har testat alla Encoding jag hittar.. Har även gjort en loop som loopar igenom alla enkodningar jag lägger till i listan men får samma problem för allt :S Skitskumt:( Märkte även att de nyare pdferna vi har ändras inte alls. Istället när jag kör getstring så får jag bara massa siffror i strängen

fan att det ska vara sånt strul att ändra pdfer?:S

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Ett fulhack är att kopiera den där fyrkanten från PDFen och ersätta alla fyrkanter i PDFen med tom sträng... kan funka.

Den PDF-hanterare jag använt är denna: http://sourceforge.net/projects/itextsharp/

Dokumentationen är i Java: http://itextdocs.lowagie.com/tutorial/

Permalänk

Det är den jag använder också, glömde säga att jag bytte efter massa meckande med PDF box.. Problemet är att det är många pdfer med bara en fyrkant vilket gör att det blir massa jobb ändå.. Det är inte en tom sträng som ska vara istället för fyrkanten utan en nia. Det är det som är det skumma att just nior byts ut? Datumet blir ju helsjukt

Men som ni varit inne på borde det ju vara något med Encoding..:/

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Windows1252 kanske?
Alltså, jag tänker som så att du egentligen borde hämta encodingen från själva PDF-dokumentet.. det borde ju stå där nånstans tycker man.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Citat:

Ursprungligen inskrivet av Teknocide
Windows1252 kanske?
Alltså, jag tänker som så att du egentligen borde hämta encodingen från själva PDF-dokumentet.. det borde ju stå där nånstans tycker man.

Jo, det tänker jag också..:S Tror dock att jag då måste hämta ut vilka fonts som används och därifrån ta ut enkodningen? Låter som ett jävla meck :/

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk

Testade precis med 1252 och fick samma problem med niorna och boxarna :/

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Jag tänkte på det här över kvällen, har några möjliga scenarion som kan orsaka problemet:
1. Encoding: precis som vi snackat om. Dock kan det vara krångligare än så ifall de införda tecknen hamnar "mellan bitar", dvs. byte-paddingen blir fel.
2. Fonten är inte "bundlad" med PDF-dokumentet: Jag har bestämt för mig att jag vid tillfälle läst att PDF-dokument kan skala bort överflödiga tecken som inte använts i ett typsnitt för att spara utrymme. Det är ju t ex onödigt att skicka med asiatiska glypher i svensk text.
3. Fonten innehåller inte tecknet: Antagligen inte så troligt då de flesta typsnitt har stöd för siffran '9'

Testa:
* Att skapa ett helt nytt PDF-dokument med några paragrafer (quick brown fox etc.) i olika typsnitt och encodings (om detta är möjligt). Manipulera detta testdokument med ditt program och se om du får samma problem som tidigare. Testa att använda samma struliga font, testa med olika versioner av PDF-formatet etc.
* Använd programmet på andra/enklare PDF-dokument, gärna något som har väldigt simpel formatering. Om det är samma problem som alltid återkommer så har vi iaf. något att gå på.

Visa signatur

Kom-pa-TI-bilitet

Permalänk

Måste bara tacka för all hjälp jag fått
Nu fyllde jag ett pdf-dok med massa olika fonter etc och skrev 16539 överallt. Kan tilläggas att vi har dokument som innehåller ordernr som jag vill byta ut om vi har en likadan order men med ett annat ordernummer. Körde mitt program på min testpdf och skulle byta ut mot 13337 och fick följande:
4 st blev 1333
3 st blev 16539
4 st blev 1333#

(# är egentligen bara en ruta med kryss över).. Har även bytt ut min kod för att bara ändra på de bytes som hör till de jag gör:

for (int i = 0; i < (pageBytes.Count()-5); i++) { IList<byte> b = new List <byte>(); for (int x = 0; x < 5; x++) { b.Add(pageBytes[i + x]); } string Str = Encoding.GetEncoding(1252).GetString(b.ToArray()); if (Str == textBox1.Text) { Str = textBox2.Text; byte[] bb = Encoders.First().GetBytes(Str); for (int x = 0; x < 5; x++) newbytes[i + x] = bb[x]; } }

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase