Trädvy Permalänk
Medlem
Plats
Bromma
Registrerad
Aug 2008

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?

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

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2004
Trädvy Permalänk
Medlem
Plats
Bromma
Registrerad
Aug 2008
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?

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

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2004

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.

Trädvy Permalänk
Medlem
Plats
Bromma
Registrerad
Aug 2008
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

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

Trädvy Permalänk
Medlem
Plats
Bromma
Registrerad
Aug 2008

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?

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

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007

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..?

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Plats
Bromma
Registrerad
Aug 2008

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

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

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2004

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

Trädvy Permalänk
Medlem
Plats
Bromma
Registrerad
Aug 2008

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

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

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2004

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/

Trädvy Permalänk
Medlem
Plats
Bromma
Registrerad
Aug 2008

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..:/

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

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007

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.

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Plats
Bromma
Registrerad
Aug 2008
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 :/

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

Trädvy Permalänk
Medlem
Plats
Bromma
Registrerad
Aug 2008

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

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

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007

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å.

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Plats
Bromma
Registrerad
Aug 2008

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

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